1. JDBC プログラミングの概念
実際のプロジェクトでは、データベース操作のほとんどはコードを通じて実行され、さまざまなデータベースが開発時に一連のプログラミング インターフェイス API を提供します。したがって、企業ごとに異なるデータベース ソフトウェアを使用しているため、異なるデータベースに対応するプログラミング スタイルと関連構文を学習する必要があるため、プログラマーの学習コストは非常に高くなります。したがって、Java レベル、つまり JDBC で統一されています。主要なデータベース ベンダーは、独自のネイティブ API インターフェイスをパッケージ化してデータベース ドライバー パッケージを形成しており、JDBC はさまざまなデータベースのデータベース ドライバー パッケージの集合によって形成されます。
JDBC、つまり Java Database Connectivity、Java データベース接続。
Javaにおけるデータベース接続仕様であるSQL文を実行するためのJava APIです。この API は、java.sql.*、javax.sql.* パッケージ内のいくつかのクラスとインターフェイスで構成されており、 Java 開発者がデータベースを操作するための
標準 API を提供し、さまざまなリレーショナル データベースへの統合アクセスを提供できます。
1.1 JDBC の動作原理
JDBC は、さまざまなリレーショナル データベースに統合されたアクセス メソッドを提供し、ベンダー固有のデータベース アクセス API の高レベルの抽象化として、主にいくつかの
共通インターフェイス クラスを含んでいます。
JDBC アクセス データベース階層:
1.2 JDBCの利点
- Java 言語アクセス データベース操作は完全に抽象インターフェイス プログラミングを指向しています
- データベース アプリケーションの開発は、特定のデータベース ベンダーの API に限定される必要はありません
- プログラムの移植性が大幅に向上
2.JDBCの使用
2.1 JDBCドライバーパッケージのダウンロード
1 つ目はドライバー パッケージのインストールです。ドライバー パッケージは MySQL 公式 Web サイトから入手できますが、Oracle 公式 Web サイトは使いにくいです。または、github にアクセスしてダウンロードし、Maven Central Warehouse にアクセスすることもできます。それをダウンロードするには (この Maven は、コンピューター シリーズのソフトウェア プログラムのアプリケーション ストアに似ています)、ここでは
Maven を使用してダウンロードします。
- Web サイト https://mvnrepository.com/ を開きます
- mysql関連ソフトウェアを検索する
- 最初または 2 番目 (mysql-connector-java) をクリックすると、
- 次に、対応するバージョンを選択します。ここでのメジャー バージョン番号はデータベース サーバーのバージョンと一致する必要があることに注意してください。たとえば、mysql データベース サーバーはバージョン 5 を使用しているため、ドライバー パッケージもバージョン 5 を使用する必要があります。
- ダウンロードページに入る
- ダウンロードしたファイルのサフィックスは .jar で、これは複数の .class ファイルの圧縮パッケージとして理解できます。
2.2 ドライバーパッケージのインストールとインポート
- ドライバー パッケージ (.jar ファイル) をダウンロードした後、まず idea で新しいプロジェクトを作成します。
- プロジェクトの下にディレクトリを作成します
- 次に、ダウンロードした .jar ファイルをこのディレクトリにコピーして貼り付けます。
- ディレクトリをライブラリとしてマークし、ライブラリとしてマークした後、idea は .jar ファイルを認識できるようになります。したがって、内部のクラスを呼び出してコードを記述することができます。
- インポートが成功したら、通常のプログラミングを開始できます。src ファイルの下にクラス JDBCIsert を作成します。
2.3 IDEA での JDBC の使用
新しいクラスと main メソッドを作成したら、プログラミングを開始します。JDBC は次の手順で開発を完了する必要があります。
2.3.1 データソースの作成と初期化
- MysqlDataSource を作成して初期化します。
いわゆるデータ ソースは、データの由来、つまりデータベース サーバーの場所を記述します。DataSource インターフェイスを通じて記述します。
ただし、DataSource 自体はインターフェイス、抽象クラスであり、直接新規にすることはできないため、実際には、DataSource インターフェイスを実装するためにそのサブクラス MysqlDataSource オブジェクトを新規作成します。
DataSource dataSource = new MysqlDataSource();//这里实际是向上转型,子类实现父类接口
しかし、これだけでは十分ではありません。setUrl、setUser、setPassword メソッドを使用する必要があるため、一度ダウンキャストして元に戻す必要があります。このメソッドはサブクラス MysqlDataSource に固有であり、親クラスには固有ではないため、ダウンキャストします。
- URLを設定する
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/JDBC?characterEncoding=utf8&useSSL=false);
したがって、上記の 2 行のコードは実際には次のコードのように書くことができます。
MysqlDataSource mysqlDataSource = new MysqlDataSource();
mysqlDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/JDBC?characterEncoding=utf8&useSSL=false);
URL は固有のリソース ロケーターであり、コンピューター ネットワークの一般的な用語であり、ネットワーク リソースの場所をマークするために使用されます。
ここでの入力は"jdbc:mysql://127.0.0.1:3306/JDBC?characterEncoding=utf8&useSSL=false"
まずjdbc
固定されています。mysql
これは使用するデータベース、つまり127.0.0.1:3306
IP アドレスです。mysql データベースは「クライアント サーバー」構造です。クライアントとサーバーはネットワークを通じて通信します。サーバー上のホストの場所です。ネットワークは IP アドレスによって決定され、127.0.0.1 はループバック アドレスを表し、テストした mysql のサーバーとクライアントは同じデバイス (独自のホスト) 上にあるため、ローカル IP を表します。3306 は、さまざまなアプリケーションを区別するために使用されるポート番号です。データベース サーバーのデフォルトのポート番号は 3306 です。base1
これはデータベースの名前、つまりcreate database 数据库名
SQL ステートメントを作成するときに内部にあるデータベースの名前です。characterEncoding=utf8
文字セットが utf8 を使用し、useSSL=false
SSL が暗号化プロトコルであることを示します。これは、ここでは暗号化がないことを意味します。
- ユーザー名とパスワードを設定する
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("120198087zbh");
ユーザー名は一律にデフォルト値 root として記述され、他の値は記述しないでください; パスワードは mysql のインストール時に記述したパスワードに対応します。
2.3.2 接続を確立する
Connection connection = dataSource.getConnection();
ただし、ここではエラーが報告されます。これはチェック例外です。直接スローします。スローして例外パッケージをインポートする場合は注意してください。
次に、それを Conenction インターフェイスで受け取ります。接続を受け取るときは、java.sql パッケージ内の接続を使用する必要があることに注意してください。そうしないとコンパイルされず、mysql パッケージ内の接続を使用しないでください。
ここのコードを最初に実行して、エラーがあるかどうかを確認できます。
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.SQLException;
public class JDBCInsert {
public static void main(String[] args) throws SQLException {
//JDBC需要通过以下步骤来完成开发
//1.创建并初始化一个数据源
// MysqlDataSource mysqlDataSource = new MysqlDataSource();
// mysqlDataSource.setUrl();
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/base1?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("120198087zbh");
//2.建立连接
Connection connection = dataSource.getConnection();
}
}
2.3.3 SQL ステートメントの構築
dos 環境では、mysql を開き、データベースを構築し、テーブルを作成します。
Enter password: ************
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.27-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database base1 character set utf8mb4;
Query OK, 1 row affected (0.00 sec)
mysql> use base1;
Database changed
mysql> create table student(student_id int primary key auto_increment,student_name varchar(20));
Query OK, 0 rows affected (0.02 sec)
今Javaでデータを追加したい場合は、IDEAで次のコードを記述します
//3.构造SQL语句
String sql = "insert into student values(1,'张三')";//创建一个sql语句
PreparedStatement statement = connection.prepareStatement(sql);//使用PreparedStatement接口进行提前预编译我们的sql
クライアントがプリコンパイルできるようにすると、サーバーが実行する作業が簡素化され、負荷が軽減されます。PreparedStatement での Prepared は、事前に準備されたものとして理解できます。Statement ステートメント
2.3.4 SQL文の実行
SQL ステートメント (プリコンパイル済み) を構築した後、それをサーバーに送信してステートメントを実行する必要があります。
int ret = statement.executeUpdate();//executeUpdate的返回值为int
System.out.println("ret = "+ ret);
挿入、更新、および削除の操作はすべて、executeUpate メソッドを使用し、その戻り値は int で、影響を受ける行数を示します。実際、DOS 環境で影響を受ける行の 0 は (次の図に示すように)戻り値。
選択操作では、executeQuery メソッドを使用します。
この文を実行した後、MySQL に移動してデータが挿入されたかどうかを確認できます。
mysql> select * from student;
+------------+--------------+
| student_id | student_name |
+------------+--------------+
| 1 | 张三 |
+------------+--------------+
1 row in set (0.01 sec)
確かに挿入されていることが分かりました。
2.3.5 リソースのリリース
- データベースのクライアントとサーバー間で通信する際、特定のリソース (CPU、メモリ、ハードディスク、帯域幅など) が消費されます。クライアントの数が十分に多い場合、クライアントは自由に占有および消費することを許可されてはなりません。つまり、クライアントは、使用されていないときに解放されたと感じる必要があります。
- ステートメント(文)とリンク(接続)は一定の順番で解放され、作成した人が先に解放します。
statement.close();
connection.close();
2.3.6 補足事項
nsert into student values(1,'张三')
この例では、このようなハードコーディングによってデータを挿入して完了しますが、実際のプロジェクトでは、この入力はユーザーがコンソール上で入力する必要があります。
したがって、コードは次のように書き換えることができます
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCInsert {
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
//JDBC需要通过以下步骤来完成开发
//1.创建并初始化一个数据源
// MysqlDataSource mysqlDataSource = new MysqlDataSource();
// mysqlDataSource.setUrl();
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/base1?characterEncoding=utf8&useSSL=false");//设置url
((MysqlDataSource)dataSource).setUser("root");//设置用户名
((MysqlDataSource)dataSource).setPassword("120198087zbh");//设置密码
//2.建立连接
Connection connection = dataSource.getConnection();//异常抛出
//3.控制台输入
System.out.println("请输入学号:");
int student_id = scanner.nextInt();
System.out.println("请输入姓名:");
String student_name = scanner.next();
//4.构造SQL语句
String sql = "insert into student values(" + student_id+ ",'" + student_name + "')";//创建一个sql语句
PreparedStatement statement = connection.prepareStatement(sql);//使用PreparedStatement接口进行提前预编译我们的sql
//5.执行SQL语句
int ret = statement.executeUpdate();//executeUpdate的返回值为int
System.out.println("ret = "+ ret);
//6.释放资源
statement.close();
connection.close();
}
}
しかし、このコードはまだかなり醜いです。
これを記述するより良い方法があります。これは、PreparedStaterment のアセンブリ関数の助けを借りて実現できます。
String sql = "insert into student values(?,?)";//用?(占位符)来先取代两个参数的位置
PreparedStatement statement = connection.prepareStatement(sql);//使用PreparedStatement接口进行提前预编译我们的sql
statement.setInt(1,student_id);//将第一个占位符所表示的整型参数替换为student_id
statement.setString(2,student_name);//将第二个占位符所表示的字符串参数替换为student_name
完全なコードは次のようになります。
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCInsert {
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
//JDBC需要通过以下步骤来完成开发
//1.创建并初始化一个数据源
// MysqlDataSource mysqlDataSource = new MysqlDataSource();
// mysqlDataSource.setUrl();
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/base1?characterEncoding=utf8&useSSL=false");//设置url
((MysqlDataSource)dataSource).setUser("root");//设置用户名
((MysqlDataSource)dataSource).setPassword("120198087zbh");//设置密码
//2.建立连接
Connection connection = dataSource.getConnection();//异常抛出
//3.控制台输入
System.out.println("请输入学号:");
int student_id = scanner.nextInt();
System.out.println("请输入姓名:");
String student_name = scanner.next();
//4.构造SQL语句
// String sql = "insert into student values(" + student_id + ",'" + student_name + "')" ;//创建一个sql语句
String sql = "insert into student values(?,?)";//用?(占位符)来先取代两个参数的位置
PreparedStatement statement = connection.prepareStatement(sql);//使用PreparedStatement接口进行提前预编译我们的sql
statement.setInt(1,student_id);//将第一个占位符所表示的整型参数替换为student_id
statement.setString(2,student_name);//将第二个占位符所表示的字符串参数替换为student_name
//5.执行SQL语句
int ret = statement.executeUpdate();//executeUpdate的返回值为int
System.out.println("ret = "+ ret);
System.out.println(statement);//如果我们发现出错,我们可以将statement打印出来,观察一下是不是我们的SQL语句写错了;
//6.释放资源
statement.close();
connection.close();
}
}
同時に、プロジェクトの開発に間違いがあった場合、SQL ステートメントを出力することで、SQL ステートメントに間違いがあるかどうかを確認できます。
の結果
現在、JDBC は DataSource のような方法で書かれています。
DriveManager を記述する方法もあります。これは、リフレクションを通じてドライバー パッケージ内のクラスをロードし、さらにフォローアップ操作を実行します。
ただし、反映されたコードの可読性が非常に低く、コンパイラーがコードの正しさをチェックするのが難しいため、依然として DataSource が推奨されます。さらに、DataSource にはデータベース接続プールが組み込まれており、接続を再利用してサーバーへの接続効率を向上させることができます。
コンピューター内のプールの本質は、時間に対して空間を使用するアプリケーション前のメカニズムです。
2.4 IDEA は MySQL クエリ操作を実装します
例
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class JDBCSelect {
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
//1.创建并初始化数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/base1?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("120198087zbh");
//2.建立连接
Connection connection = dataSource.getConnection();
//3.构造SQL
System.out.println("请输入查询语句");
String sql = scanner.nextLine();
// String sql = "select * from student";
//4.预执行
PreparedStatement statement = connection.prepareStatement(sql);
//5.执行SQL语句
ResultSet resultSet = statement.executeQuery();//resultSet就是select里面创建的临时表
//6.遍历结果集合
while(resultSet.next()){
//这个效果和迭代器类似
//把resultSet想象成一个表格,同时有一个光标指向表格的最上面
//每一次调用next,光标都会往下走一行
//当光标指向某一行的时候就可以通过getXXX等方法来获取当前行对应的列里面的数据。
//当这个表都遍历完了,next就会返回false;
int id = resultSet.getInt("student_id");
//getXXX方法必须类型匹配
//getXXX方法的参数可以是列名,也可以是下标
String name = resultSet.getString("student_name");
System.out.println("id = " + id +", name - " + name );
}
//7.释放资源
resultSet.close();
statement.close();
connection.close();
}
}
結果