記事ディレクトリ
JavaでのJDBCプログラミング
1.データベースプログラミングの前提条件
- プログラミング言語: Java、C、C ++、Pythonなど。
- データベース: Oracle、MySQL、SQLServerなど。
- データベースドライバパッケージ:データベースが異なれば、プログラミング言語ごとに異なるデータベースドライバパッケージが提供されます。
たとえば、MySQLは、JavaベースでMySQLを操作するために必要なJavaドライバパッケージmysql-connector-javaを提供します。同様に、Javaに基づいてOracleデータベースを操作するには、Oracleのデータベースドライバパッケージojdbcが必要です。
2.MySQLドライバーパッケージのインストール
-
最初のブラウザ検索https://mvnrepository.com
-
入力ボックスでmysqljdbcを検索します
-
以下でこれを見つけてクリックしてください
-
mysqlのバージョンに対応するドライバーを選択します
-
クリックしてダウンロードを選択
3.アイデアにおけるドライバーパッケージの展開
-
まず、アイデアプロジェクトでディレクトリを作成し、jarパッケージをそのディレクトリにコピーします
-
左上隅の[ファイル]->[プロジェクト構造]でアイデアを開きます…
-
Librarires->+->Javaをクリックします
-
次に、libsディレクトリを選択し、OKまで進みます。
4. Javaでのデータベースプログラミング:JDBC
データベースには多くの種類があるため、異なるデータベースが提供するAPI(アプリケーションプログラミングインターフェイス)は同じではありません。Javaでこの問題を解決するために、JDBCが導入されています。
JDBC、つまりJava Database Connectivity
Javaデータベース接続。SQLステートメントを実行するためのJavaAPIであり、Javaのデータベース接続仕様です。このAPIは、パッケージ内java.sql.*
のjavax.sql.*
いくつかのクラスとインターフェースで構成されており、Java開発者がデータベースを操作するための標準APIを提供し、さまざまなリレーショナルデータベースへの統合アクセスを提供できます。
さまざまな種類のAPIを、さまざまなデータベースドライバーを介してJDBCスタイルの統合APIに変換します
Javaでは、このようなドライバーはスタンドアロンですjar包
JDBCの利点:
- Java言語アクセスデータベースの操作は、完全に抽象インターフェイスプログラミングを対象としています
- データベースアプリケーションの開発は、特定のデータベースベンダーのAPIに限定されません。
- プログラムの移植性が大幅に向上
5. JDBC API
Java JDBCプログラミングでは、データベース操作はJDK独自のAPIを使用して均一に処理されます。このAPIは通常、特定のデータベースのドライバークラスから完全に分離されています。したがって、Java JDBC API(java.sqlパッケージにあります)をマスターして、Javaデータベースプログラミングをマスターします。
6.JDBCの共通インターフェースとクラス
6.1データベース接続接続
接続インターフェイス実装クラスはデータベースによって提供されます。通常、Connectionオブジェクトを取得するには、2つの方法があります
。1つは、DriverManager(ドライバー管理クラス)の静的メソッドを介して取得する方法です。
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
1つは、DataSource(データソース)オブジェクトを介して取得されます。実際のアプリケーションでは、DataSourceオブジェクトが使用されます。
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://localhost:3306/test");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("root");
Connection connection = ds.getConnection();
上記の2つの方法の違いは次のとおりです。
- DriverManagerクラスによって取得された接続接続は再利用できません。使用後にリソースが解放されるたびに、
connection.close()
物理接続が閉じられます。 - DataSourceは、接続プールのサポートを提供します。接続プールが初期化されると、一定数のデータベース接続が作成されます。これらの接続は再利用できます。データベース接続が使用されるたびに、リソースを解放するための呼び出しにより
connection.close()
、Conncetion接続オブジェクトがリサイクルされます。
6.2ステートメントオブジェクト
Statementオブジェクトは、主にSQLステートメントをデータベースに送信します。JDBC APIは、主に3種類のStatementオブジェクト(Statement、PreparedStatement、CallableStatement)を提供します。
SQLを実行する主な方法は2つあります。
executeQuery()
select
メソッドが実行されると、通常はステートメントで使用される単一の結果セットが返されます。executeUpdate()
メソッドの戻り値は、影響を受ける行の数を示す整数であり、通常はupdate、 insert、 delete
ステートメントで使用されます
6.3ResultSetオブジェクト
結果セットと呼ばれるResultSetオブジェクトは、SQLステートメントの条件を満たすすべての行を表し、一連のgetXXXメソッドを介してこれらの行のデータへのアクセスを提供します。
ResultSet内のデータは行ごとに配置され、各行には複数のフィールドがあり、レコードポインターがあります。ポインターが指すデータ行は現在のデータ行と呼ばれ、現在のデータ行のみを操作できます。特定のレコードを取得する場合は、メソッドを使用する必要がありますResultSet
。ResultSetnext()
内のすべてのレコードを取得する場合は、whileループを使用する必要があります。
7.JDBCの使用に関する注意
- URLの使用
- プレースホルダー
?
- データベースに接続されています
Connection
- リソースを解放するシーケンスを閉じます
- ResultSetオブジェクトのトラバーサル
8.JDBCで使用される特定の操作
8.1対応するJDBCの挿入の使用
手順:
- DateSourceオブジェクトを作成します(URLユーザーパスワードの3つの側面を構成します)
- データベース接続への接続を確立します(SQLExceptionを処理します)
- SQLステートメントをアセンブルし、PrepareStatementオブジェクトを使用します
- アセンブリが完了したら、SQLステートメントを実行します
- 実行後、関連リソースを閉じて解放します(作成後に解放します)
コード例:
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class InsertJDBC {
public static void main(String[] args) throws SQLException {
// 1. 创建 DataSource 对象
DataSource dataSource = new MysqlDataSource();
// 需要针对dataSource 进行一些配置,以便后面能够顺利的访问到数据库服务器
// 主要配置三方面信息: URL,User,Password 需要进行向下转型
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java20220310?characterEncoding=utf-8&useSSL=true&serverTimezone=UTC");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("0000");
// 2. 和数据库建立连接
// 建立连接是为了验证当前网络通信是否正常
// 如果不正常就会抛出 SQLException 异常
// connection 对象生命周期应该是较短的.每个请求创建一个新的 connection.
Connection connection = dataSource.getConnection();
// 3. 拼装 SQL 语句,用到 PrepareStatement 对象
String sql = "insert into student values(1,'曹操')";
PreparedStatement statement = connection.prepareStatement(sql);
System.out.println(" statement : "+statement);
// 4. 拼装完成之后,可以执行 SQL 了
// insert delete update 都使用 executeUpdate 方法来执行
// select 就使用 executeQuery 来执行
// 返回值表示此次操作修改了多少行
int ret = statement.executeUpdate();
System.out.println(" ret : "+ret);
// 5. 执行完毕后,关闭释放相关资源
// 一定是后创建的先释放
statement.close();
connection.close();
}
}
8.2対応するJDBCの使用を削除する
手順:
- DataSourceオブジェクトを作成します(情報の3つの側面も構成します)
- データベース接続の作成接続
- SQLステートメントをアセンブルし、PrepareStatementオブジェクトを使用します
- アセンブリが完了したら、SQLステートメントを実行します
- 実行後、関連リソースを閉じて解放します(作成後に解放します)
コード:
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class DeleteJDBC {
public static void main(String[] args) throws SQLException {
// 1. 创建 DataSource 对象
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java20220310?characterEncoding=utf-8&useSSL=true&serverTimezone=UTC");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("0000");
// 2. 创建数据库连接Connection
Connection connection = dataSource.getConnection();
// 3. 拼装 SQL 语句,用到 PrepareStatement 对象
String sql = "delete from student where name = ?";
System.out.println("请输入要删除的学生姓名: ");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
// 4. 拼装完成后,执行 SQL 语句
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,name);
int ret = statement.executeUpdate();
if(ret == 0) System.out.println("删除失败");
else System.out.println("删除成功");
// 5. 关闭释放资源
statement.close();
connection.close();
}
}
8.3対応するJDBCの使用を変更する
手順:
- DataSourceオブジェクトを作成します(情報の3つの側面も構成します)
- データベース接続の作成接続
- SQLステートメントをアセンブルし、PrepareStatementオブジェクトを使用します
- アセンブリが完了したら、SQLステートメントを実行します
- 実行後、関連リソースを閉じて解放します(作成後に解放します)
コード:
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class UpdateJDBC {
public static void main(String[] args) throws SQLException {
// 1. 创建 DataSource 对象
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java20220310?characterEncoding=utf-8&useSSL=true&serverTimezone=UTC");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("0000");
// 2. 连接数据库
Connection connection = dataSource.getConnection();
// 3. 拼接 SQL语句
Scanner sc = new Scanner(System.in);
System.out.println("请输入要修改的学生id: ");
int id = sc.nextInt();
System.out.println("请输入要修改的学生姓名: ");
String name = sc.next();
String sql = "update student set name = ? where id = ?";
// 4. 执行 SQL 语句
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,name);
statement.setInt(2,id);
int ret = statement.executeUpdate();
if(ret == 1) System.out.println("修改成功");
else System.out.println("修改失败");
// 5. 关闭释放资源
statement.close();
connection.close();
}
}
8.4対応するJDBCの使用法を見つける
手順:
- DataSourceオブジェクトを作成します(情報の3つの側面も処理します)
- Connectionオブジェクトを作成し、データベースとの接続を確立します
- SQLステートメントをPrepareStatementでスプライスする
- SQLステートメントを実行する
- 結果セットを反復処理します
- リリースリソースを閉じる
コード:
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SelectJDBC {
public static void main(String[] args) throws SQLException {
// 1. 创建 DataSource 对象
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java20220310?characterEncoding=utf-8&useSSL=true&serverTimezone=UTC");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("0000");
// 2. 创建 Connection 对象,和数据库建立连接
Connection connection = dataSource.getConnection();
// 3. 借助 PrepareStatement 拼接 SQL 语句
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
// 4. 执行 SQL 语句
ResultSet resultSet = statement.executeQuery();
// 5. 遍历结果集.
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id: "+id+"name: "+name);
}
// 6. 关闭释放资源
resultSet.close();
statement.close();
connection.close();
}
}