1. 程式人生 > >jdbc 操作資料庫 資料的公用方法

jdbc 操作資料庫 資料的公用方法



/*
 * 處理Sql語句的工具類
 */
public class SqlUtil {


/*
* 執行 增 改 的公用方法(支援事物)
*/
public static int executeUpdate(Connection conn ,String sql, Object... args) {

// 建立 PreparedStatement 物件
PreparedStatement ps = null;


try {
// 將sql 語句傳入 資料庫
ps = conn.prepareStatement(sql);


// 迴圈 處理佔位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}


// 獲得 處理結果(返回受影響
return ps.executeUpdate();


} catch (Exception e) {
e.printStackTrace();
return 0;
} finally {
// 關閉流
DriverUitl.close(null, ps, null);
}
}


/*
* 提取查詢單條記錄的公用方法 (支援事務)
*/
public static <T> T executeQuerySingle(Connection conn ,Class<T> clazz, String sql, Object... args) {
// 建立各個物件
PreparedStatement ps = null;
ResultSet rs = null;
T t = null;


try {
// 1.獲取連線物件
// 2.獲取PreparedStatement 物件
ps = conn.prepareStatement(sql);
// 3.填充佔位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
// 4.傳送sql語句 獲取 ResultSet 物件
rs = ps.executeQuery();


// 5.處理ResultSet物件的結果集
// 5.1獲取 ResultSet 元資料 物件
ResultSetMetaData rsmd = rs.getMetaData();
// 5.2獲取元資料物件的列數
int columnCount = rsmd.getColumnCount();
if (rs.next()) {
t = clazz.newInstance();
// 5.3利用迴圈,根據 元資料物件的列索引,獲取列的名稱(表頭中的每一列名)
for (int i = 0; i < columnCount; i++) {
// 5.4 根據 元資料物件的列索引,獲取列的名稱(表頭中的每一列列名)
String columnName = rsmd.getColumnLabel(i + 1);
// 5.5根據取出的列名,查詢當條記錄所對應的具體值 即(rs.getInt())
Object columnValue = rs.getObject(columnName);


// 5.6注意:列的別名必須與屬性名保持一致!!!!!!!!
// 將資料庫中查詢到的每個欄位的值,賦值給傳入的類的每個對應欄位
Field field = clazz.getDeclaredField(columnName); // 利用反射,獲取屬性名
field.setAccessible(true); // 修改可訪問私屬性許可權
field.set(t, columnValue); // 為傳入類物件的屬性賦值
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7.關閉流
DriverUitl.close(rs, ps, null);
}
return t;
}


/*
* 提取查詢多條記錄的公用方法  (支援事務)
*/

public static <T> List<T> executeQueryAll(Connection conn, Class<T> clazz,String sql, Object...args){
List<T> list = new ArrayList<>();

//1. 獲取連線 從引數中獲取
//2. 獲取 PreparedStatement,用於傳送 SQL
PreparedStatement ps = null;
//4. 執行 SQL,ResultSet 結果集
ResultSet rs = null;
try {
//1.獲取具體的資料庫連線  從引數中獲取

//2.將sql語句傳送給資料庫,返回一個PreparedStatement物件
ps = conn.prepareStatement(sql);
//3. (利用迴圈根據可變引數,填充佔位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i+1, args[i]);
}

//4。 獲取結果集(ResultSet 物件
rs = ps.executeQuery();

//5. 獲取當前結果集的元資料 ResultSetMetaData
ResultSetMetaData rsmd = rs.getMetaData();

//6. 獲取結果集的列數
int columnCount = rsmd.getColumnCount();

//7. 獲取結果集的資料
while(rs.next()){
//利用反射,獲取傳入的型別的具體例項
T t = clazz.newInstance();

for (int i = 0; i < columnCount; i++) {
//7.1 獲取列名,根據列名獲取結果集的資料
   //7.1.1 根據列的索引,獲取列名(表頭列名
String columnName = rsmd.getColumnLabel(i+1);
   //7.1.2 根據獲取的列名,獲取對應的資料的值
Object columnValue = rs.getObject(columnName);


//8. 將資料封裝進物件(t 傳入的具體的物件, columnName:t類中的 屬性,columnValue:需要設定的具體的值)
PropertyUtils.setProperty(t, columnName, columnValue);
}


//9. 將加入集合中
list.add(t);
}
}  catch (Exception e) {
e.printStackTrace();
} finally {
//10. 關閉連線
DriverUitl.close(rs, ps, null);
}

return list;


}


}