一、使用JDBC批量添加
? 知識點復習:
?1、JDBC的六大步驟 (匯入jar包, 加載驅動類,獲取連接物件, 獲取sql執行器、執行sql與并回傳結果, 關閉資料庫連接)
2、?封裝了一個DBUtil 類, 通過讀取屬性檔案的方式獲取 基礎連接資訊,
3、?批量添加: 一次性可執行多個添加記錄 ,將多個sql陳述句在當前這次連接中執行完畢,
// 設定部門集合
List<Dept> list = new ArrayList<>();
list.add(new Dept(60,"市場部","武漢市"));
list.add(new Dept(70,"研發部","武漢市"));
list.add(new Dept(80,"教學部","武漢市"));
//通過DBUtil獲取資料庫連接
Connection conn = DBUtil.getConn();
String sql="insert into dept(deptno,dname,loc) values (?,?,?)";
//獲取預編譯sql執行器
PreparedStatement ps = conn.prepareStatement(sql);
//批量設定該條sql陳述句的 引數
for(Dept dept : list){
//設定引數
ps.setInt(1,dept.getDeptno());
ps.setString(2,dept.getDname());
ps.setString(3,dept.getLoc());
// 將設定好的引數 先放入批量添加的容器中
ps.addBatch();
// 對于完整的sql陳述句 可以用有參的
// ps.addBatch(sql);
}
// 執行sql陳述句 回傳每一行sql陳述句影響的行數 ,
int [] counts = ps.executeBatch();
System.out.println("結果長度:"+ counts.length);
System.out.println("結果:"+ Arrays.toString(counts));
//關閉sql陳述句
DBUtil.closeAll(conn,ps,null);
二、結果集的元資料:
columnCount 結果集的列數
columnName 列的名稱 // select columnName as columnLabel…
columnLabel 列的別名(label)
columnClassName 列在Java中對應的型別(可配合Class.forName(String className)獲取Class型別的回傳值)
columnType 列在資料庫中的型別(數值編號)
columnTypeName 列在資料庫中的型別名稱
columnDisplaySize 列大小
結果集(ResultSet)和結果集元資料(ResultSetMetaData)同為JDBC標準中的介面|標準,
java.sql.ResultSet
java.sql.ResultSetMetaData
三、Class反射
1、為什么需要使用反射
?由于之前創建物件的程序 ,是已知這個類,然后對類進行編譯,編譯通過之后才可以創建物件, 現在可能出現 “未知的類” 只有“包名+類名” ,在運行期間才知道 該類是否存在,并動態創建該類的物件, 這時 創建物件的程序 可以通過反射的方式 完成,
?反射機制的定義: 對于任意一個類,都可以在運行期間,動態的創建該類的物件,能知曉該物件的屬性和方法,并動態呼叫屬性 和方法 ,這個程序就是Java的反射機制
?對于任意類 都存在一個該類的Class型別 ,如何獲取類的Classs型別
方式一: Class cls = Class.forName("類的全類名")
方式二: Class cls = 類名.class;
方式三: Class cls = 類的物件名.getClass()
常用API
Construct:
?cls.getConstructor(int.class , String.class); 根據引數型別和個數 獲取cls 對應的 構造器物件
Field : 屬性對應的型別
?getDeclareFields () : 獲取所有宣告的屬性 (包括 任何修飾符,不包括private修飾)
?getFields(): 獲取所有宣告的public修飾的屬性
getDeclareFiled(String name): 根據屬性名獲取屬性物件
getField(String name):根據屬性名獲取屬性物件 (必須是共有的 )
Method : 方法對應的型別
?getDeclaredMethods() : 回傳當前類的自己宣告的方法
?getMethods() :回傳所有的方法(包括父類的)
?invoke(obj,引數值) :呼叫該方法
?getMethod(“方法名” ,引數值):根據方法名回傳Method
四、反射封裝(增刪改查)
preparedStatement的作用:
1、提前傳入sql,執行的時候,不傳入sql
2、支持傳入sql中的引數
3、解決sql注入邏輯漏洞
4、提高執行效率
Object ...params(可變形引陣列) 作用:在呼叫函式時,可以傳入任意個任意型別的引數
標題查詢多行的封裝
//查詢多行多列
public static <T> List<T> list(String sql,Class<T> c,Object...params){
//創建一個集合,存放所有的物件
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.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
st.setObject(i+1,params[i]);
}
//5、statement 執行sql,回傳 結果集
var rs = st.executeQuery();
//結果集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 = https://www.cnblogs.com/xw-01/archive/2023/07/11/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;
}
查詢一行的封裝
//查詢一行
public static <T> T selectRow(String sql,Class<T> c,Object...params){
//創建一個集合,存放所有的物件
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.prepareStatement(sql);
//執行前給sql傳遞引數
for (int i = 0; i < params.length; i++) {
st.setObject(i+1,params[i]);
}
//5、statement 執行sql,回傳 結果集
var rs = st.executeQuery();
//結果集rs得到結果集元資料
ResultSetMetaData md=rs.getMetaData();
//獲取結果集總列數
var columnCount = md.getColumnCount();
//根據每一行資料,封裝成一個物體物件
//6、決議rs
T t=null;
if (rs.next()) {//rs.next 讀取結果集的游標向下移動一行,游標默認在哪一行,列名所在的那一行
t = c.newInstance();
// 1、取出某一行的每個資料,封裝到物件t的屬性中
for (int i = 1; i <= columnCount; i++) {
//通過列的序號,獲取每一列的值
var value = https://www.cnblogs.com/xw-01/archive/2023/07/11/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方法
}
}
}
//7、關閉資源
st.close();
conn.close();
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
查詢一列的封裝
//查詢一列
public static <T> List<T> selectColumn(String sql,Class<T> c,Object...params){
//創建一個集合,存放所有的物件
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.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
st.setObject(i+1,params[i]);
}
//5、statement 執行sql,回傳 結果集
var rs = st.executeQuery();
//結果集rs得到結果集元資料
ResultSetMetaData md=rs.getMetaData();
//獲取結果集總列數
var columnCount = md.getColumnCount();
//6、決議rs
while (rs.next()) {//rs.next 讀取結果集的游標向下移動一行,游標默認在哪一行,列名所在的那一行
//通過列的序號,獲取每一列的值
T t = (T) rs.getObject(1);
//把物件存入集合中
tList.add(t);
}
//7、關閉資源
st.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return tList;
}
查詢單個的封裝
//查詢單個
public static <T> T selectOne(String sql,Class<T> c,Object...params){
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
var st = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
st.setObject(i+1,params[i]);
}
//5、statement 執行sql,回傳 結果集
var rs = st.executeQuery();
//結果集rs得到結果集元資料
ResultSetMetaData md=rs.getMetaData();
//獲取結果集總列數
var columnCount = md.getColumnCount();
//6、決議rs
T t=null;
if (rs.next()) {
t = (T) rs.getObject(1);
}
//7、關閉資源
st.close();
conn.close();
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
增刪改封裝方法
//增刪改
public static int update(String sql,Object...params){
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.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
st.setObject(i+1,params[i]);
}
//5、statement 執行sql,回傳 結果集
var i = st.executeUpdate();
//7、關閉資源
st.close();
conn.close();
return i;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
總的來說,封裝只是為了讓代碼變得更簡潔,為后面的開發做鋪墊!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/557014.html
標籤:其他
上一篇:Python采集網站VIP檔案,實作圖片文字識別,并保存word格式!
下一篇:返回列表