**
1. 関連概念
**
1.JDBCとは
JDBC (データベース接続) は、SQL ステートメントを実行するための Java API であり、さまざまなリレーショナル データベースへの統合アクセスを提供でき、Java 言語で記述されたクラスとインターフェイスのセットで構成されます。JDBC は、データベース開発者がデータベース アプリケーションを作成できるようにする高レベルのツールとインターフェイスを構築できるベースラインを提供します。
2. データベースドライバー
データベースをインストールした後、アプリケーションはデータベースを直接使用することはできず、対応するデータベース ドライバーを使用して、ドライバーを通じてデータベースを処理する必要があります。実際には、データベース メーカーの JDBC インターフェイス実装、つまり Connection およびその他のインターフェイスの実装クラスの jar ファイルです。
3.
MySql ドライバーを作成します: Class.forName(“com.mysql.jdbc.Driver”);
4. JAVA が JDBC を使用してデータベースにアクセスする手順:
-
得到数据库驱动程序
-
创建数据库连接
-
执行SQL语句
-
得到结果集
-
对结果集做相应的处理(增,删,改,查)
-
关闭资源:这里释放的是DB中的资源
5. 一般的な方法:
- createStatement(): SQL をデータベースに送信するステートメント オブジェクトを作成します。
- Statement(sql): プリコンパイルされた SQL をデータベースに送信する Statement オブジェクトを作成します。
- prepareCall(sql): ストアド プロシージャを実行する callableStatement オブジェクトを作成します。
オペレーションコードは以下のとおりです。
private static void f1() throws Exception {
//1、注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的 DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接对象
var conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/summer-camp2023?characterEncoding=utf8", "root", "admin");
System.out.println(conn);
//3、定义sql
String sql="insert into t_dept values(null,'乌克兰分部','基辅','陈总')";
//4、需要创建statement
var st = conn.createStatement();
//5、statement 执行sql,返回 插入了几行
var i = st.executeUpdate(sql);
System.out.println("向数据库t_dept表中插入了"+i+"行数据");
//6、关闭资源
st.close();
conn.close();
}
カプセル化により、後でコードが使いやすくなります
クエリのカプセル化 (反映メカニズム)
package com.hp.utils;
import java.sql.DriverManager;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
//jdbc工具类
public class JdbcUtil {
//查询多行多列
public static <T> List<T> list(String sql,Class<T> c){
//创建一个集合,存放所有的对象
List<T> tList=new ArrayList<>();
try {
//1、注册驱动-反射去加载jar包中com.mysql.jdbc.Driver这个类中的 DriverManager.registerDriver(new Driver());
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接对象
var conn = DriverManager.getConnection("jdbc:mysql://localhost:3307/summer-camp2023?characterEncoding=utf8", "root", "admin");
//3、定义sql
//4、需要创建statement
var st = conn.createStatement();
//5、statement 执行sql,返回 结果集
var rs = st.executeQuery(sql);
//结果集rs得到结果集元数据
ResultSetMetaData md=rs.getMetaData();
//获取结果集总列数
var columnCount = md.getColumnCount();
//6、解析rs
while (rs.next()) {
//rs.next 读取结果集的光标向下移动一行,光标默认在哪一行,列名所在的那一行
//根据每一行数据,封装成一个实体对象
T t = c.newInstance();
// 1、取出某一行的每个数据,封装到对象t的属性中
for (int i = 1; i <= columnCount; i++) {
//通过列的序号,获取每一列的值
var value = rs.getObject(i);
if (value!=null){
//通过列的序号,获取每一列的列名
var columnName = md.getColumnName(i);
//因为列名和实体类t中的属性名一致,为每一个属性构造一个反射中的set方法
var f = c.getDeclaredField(columnName);
//赋予私有属性的赋值权限
f.setAccessible(true);
//使用反射,把value给到对象t的属性中
f.set(t,value);//理解为:把value赋值给对象t的ColumName,相当于set方法
}
}
//把对象存入集合中
tList.add(t);
}
//7、关闭资源
st.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return tList;
}
}
リソースの二次カプセル化を閉じるためにリフレクションを使用する必要のない別のカプセル化方法があります
。