記事のディレクトリ
JDBCの概要
JDBCの用途は何ですか?
1.jdbcは、Javaアプリケーションとデータベースを接続するために使用されます。jdbcを使用すると、Javaアプリケーションを介してデータベース内のデータを読み取ることができ、データを格納することもできます。
2. Oracle、MySQL、SQLサーバーなどのjdbcを介してさまざまなデータベースに接続できます。
JDBCとは何ですか?
1. JDBC:Java DataBase Connectivityの略語、つまりJavaデータベース接続。SQLステートメントの実行に使用されるJava APIであり、さまざまなリレーショナルデータベースへの統合アクセスを提供できます。Javaで記述された一連のクラスで構成されます。言語とインターフェースの構成。
2.市場に出回っているさまざまなデータベースの最下層が異なり、Java開発会社が市場に出回っているデータベースごとに対応するデータベース接続方法を設計することは不可能であるため、Java開発会社はJDBCなどのクラスを設計することを選択します。インターフェースで構成されるデータベース接続方式は、データベースに対応するJDBC機能を実装するために、それぞれのデータベースの会社によって実装されます。
要約すると、Java APIはデータベースを操作するための標準インターフェースを提供し、最後にさまざまなデータベース開発者がこれらの標準インターフェースを実装してデータベースを操作します。プログラマーは標準仕様の使用法を学ぶだけで済みます。
JDBC API
JDBC API:java.sqlパッケージに統合された、プログラマーが呼び出すためのクラスとインターフェース。
使用する必要のあるいくつかのクラスとインターフェース:
DriverManagerクラス:さまざまなJDBC接続を管理します。
接続インターフェース:特定のデータベースへの接続。
ステートメントインターフェイス:SQLを実行します
PrepardeStatementインターフェース:SQLを実行します
ResultSetインターフェイス:クエリ結果を受信します
JDBCの構築と使用
説明のために、ここでは開発ツールにIntelliJ IDEA 2020.2.1、mysql8を使用しています。ここでは簡単な紹介です。開発ツールとmysqlの異なるバージョンは使用に影響しませんが、いくつかの小さなポイントが必要です。気をつけて、大部分は問題ありません。
1データベースドライバパッケージをインポートします
ここで使用するドライバーパッケージは
mysql-connector-java-8.0.16.jar
データベースのバージョンに応じて、対応するデータベースドライバパッケージを選択する必要があります。
データベースドライバパッケージをインポートする操作は次のとおりです。
1.プロジェクトプロジェクトの下にlibディレクトリを作成し、ドライバパッケージをlibディレクトリにコピーします。
2. [ファイル]-> [ライブラリ]-> [+]記号をクリックし、[java]-> [プロジェクト]の下にインポートしたばかりのjarパッケージを選択-> [OK]-> [適用]でプロジェクト構造(優先構造)を見つけます。
3.データベースドライバパッケージのインポートが完了しました。
2データベースドライバをロードします
JDBCドライバーの登録:これには、データベースとの通信チャネルを開くことができるように、ドライバーの初期IDが必要です。
方法1
リフレクションメカニズムを使用してDriverクラスをロードし、クラスのアドレスを指定します
Class.forName("com.mysql.cj.jdbc.Driver"); //这是mysql8的方式
//利用反射机制加载Driver类
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
方法2
DriverManagerを使用して、指定されたドライバーに登録します。
DriverManger.registerDriver(new Driver());
//需要抛一个异常
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException throwables) {
throwables.printStackTrace();
}
3データベース接続を確立します
ここでは、物理的に接続されたデータベースを表すConnectionオブジェクトを作成するためにDriverManger.getConnection()メソッドが必要です。
Connection connection = DriverManager.getConnection(URL,User,Passwd);
URL: jdbc:mysql://ip(127.0.0.1):端口(3306)/数据库名?characterEncoding=utf-8
&useSSL=false&serverTimezone=UTC
?后面的都是参数,使用&符号连接,键=值&键=值
characterEncoding=utf8 编码格式
useSSL=false 安全连接,现在为false
serverTimezone=UTC 时区
User:用户名
Passwd:密码
try {
String url = "jdbc:mysql://127.0.0.1:3306/test_db?characterEncoding=utf-8" +
"&useSSL=false&serverTimezone=UTC";
Connection connection = DriverManager.getConnection(url,"root","root");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
4SQLステートメントをデータベースに送信します
これは主にJavaプログラムを介してデータベースを操作するためのものであり、SQLステートメントを送信するための2つのクラス、StatementとPrepareStatementを学習する必要があります。
ステートメント
SQLステートメントをデータベースに送信するためのStatementオブジェクトを取得します
Statement st = connection.createStatement();
2つの重要な方法
executeUpdate(String sql);
用于执行ddl(结构定义)语句和dml(增,删,改)语句
执行ddl语句返回0,执行dml返回被操作的行数,为Int型
executeQuery(String sql);
用于执行查询语句 返回一个ResultSet集合
注意
使用Statement类发送sql语句需要拼接字符串,拼接字符串的方法为:双引号双加号"+内容+",如果数据库本身的字段为字符串还需要再加上单引号,即'"+内容+"',事例如下
//获得Statement对象
Statement st = connection.createStatement();
//发送sql语句
String name = "小明";
String sex = "女";
String age = "18";
String deptId = "3";
int res = st.executeUpdate("" +
"insert into t_staff(s_name,s_sex,s_age,s_dept_id)" +
"values('"+name+"','"+sex+"',"+age+","+deptId+")");
System.out.println(res);//1,被修改了一行
PrepareStatement
SQLステートメントをデータベースに送信するためのPrepareStatementオブジェクトを取得します
注意,prepareStatement中的参数位置使用占位符?
PrepareStatement ps = connection.PrepareStatement("sql语句,参数位置使用?");
2つの重要な方法
executeUpdate(String sql);
用于执行ddl(结构定义)语句和dml(增,删,改)语句
执行ddl语句返回0,执行dml返回被操作的行数,为Int型
executeQuery(String sql);
用于执行查询语句 返回一个ResultSet集合
注意
为sql语句设置相应参数使用
ps.set相应类型(对应参数位置,参数)
的方法
//获得PrepareStatement
PreparedStatement ps = connection.prepareStatement(
"insert into t_staff(s_name,s_sex,s_age,s_dept_id)" +
"values(?,?,?,?)"
);
String name = "小暗";
String sex = "男";
String age = "19";
String deptId = "2";
ps.setString(1,name);
ps.setString(2,sex);
ps.setString(3,age);
ps.setString(4,deptId);
//发送
int res = ps.executeUpdate();
System.out.println(res);
5クエリの結果を受け取ります
ここでは、ResultSetクラスを使用します。
PreparedStatementおよびStatementのexecuteQuery()メソッドはResultSetオブジェクトを返し、クエリ結果はこのオブジェクトにカプセル化されます。
ResultSetのnext()メソッドを使用して、データの次の行を取得します。
getXXX(String name)メソッドを使用して値を取得します。
完全なクエリコードが表示されます
import java.sql.*;
public class Hello {
public static void main(String[] args) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
String url = "jdbc:mysql://127.0.0.1:3306/test_db?characterEncoding=utf-8" +
"&useSSL=false&serverTimezone=UTC";
Connection connection = DriverManager.getConnection(url, "root", "root");
//获得PrepareStatement
PreparedStatement ps = connection.prepareStatement(
"select * from t_staff where s_id=?"
);
ps.setInt(1,3);
//发送
ResultSet res = ps.executeQuery();
Test test = new Test();
while(res.next()){
test.setS_id(res.getInt("s_id"));
test.setS_name(res.getString("s_name"));
test.setS_sex(res.getString("s_sex"));
test.setS_age(res.getInt("s_age"));
test.setS_dept_id(res.getInt("s_dept_id"));
test.setS_money(res.getInt("s_money"));
}
System.out.println(test.toString());
//Test{s_id=3, s_name='虞姬', s_sex=女, s_age=29, s_dept_id=3, s_money=2800}
//关闭连接
ps.close();
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
class Test{
private int s_id;
private String s_name;
private String s_sex;
private int s_age;
private int s_dept_id;
private int s_money;
public void setS_id(int s_id) {
this.s_id = s_id;
}
public void setS_name(String s_name) {
this.s_name = s_name;
}
public void setS_sex(String s_sex) {
this.s_sex = s_sex;
}
public void setS_age(int s_age) {
this.s_age = s_age;
}
public void setS_dept_id(int s_dept_id) {
this.s_dept_id = s_dept_id;
}
public void setS_money(int s_money) {
this.s_money = s_money;
}
@Override
public String toString() {
return "Test{" +
"s_id=" + s_id +
", s_name='" + s_name + '\'' +
", s_sex=" + s_sex +
", s_age=" + s_age +
", s_dept_id=" + s_dept_id +
", s_money=" + s_money +
'}';
}
}
6データベース接続チャネルを閉じます
各操作が完了したら、データベースとのすべての接続チャネルを閉じます
方法:close()