JDBC的封裝(下)
BaseDao封裝
目的:
- 完成通用的更新方法,滿足insert、update、delete操作。
- 完成通用的查詢方法,滿足select
針對於以上兩個目的,我們需要解決的問題如下:
- 數據庫連接對象的獲取 以及資源關閉問題 已解決
- PreparedStatement參數賦值過程 以及 查詢結果的解析
首先,我們需要知道PreparedStatement預處理?有多少個,參數傳入方式和順序問題。
對於這個地方我們需要了解元數據(中介數據,就是用來描述數據的)MetaData。
數據庫元數據
通過java.sql.Connection獲取對應的元數據,Connection對象調用getMetaData()
SQL語句元數據
通過java.sql.PreparedStatement獲取對應的元數據,PreparedStatement對象調用getParameterMetaData()
數據庫結果集元數據
通過java.sql.ResultSet獲取對應的元數據,ResultSet對象getMetaData()
其次,我們進行數據展示的時候(查詢結果的解析),我們可以可以使用BeanUtils工具類,它提供了對於符合JavaBean規範的實體類進行賦值,取值,拷貝操作的一系列方法,可以自動完成數據類型的轉換。
開搞
通用更新方法的實現
public int update(String sql, Object[] parameters) {
int affectedRows = 0;
Connection connection = null;
PreparedStatement preparedStatement = null;
try{
connection = JdbcUtil.getConnection();
preparedStatement = connection.prepareStatement(sql);
//獲取sql語句的參數個數
int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
//這說明我sql語句的參數個數和傳入的參數在數量上必須一致
if (parameterCount !=0 && parameters != null && parameterCount == parameters.length){
for (int i = 0; i < parameters.length; i++) {
//sql參數的下標是從1開始的
preparedStatement.setObject(i + 1, parameters[i])
}
}
//執行
affectedRows = preparedStatement.executeUpdate();
}catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, preparedStatement);
}
return affectedRows;
}
使用的時候
//以更新和刪除爲例
//更新
User user = new User(20, "小磊哥", "6666");
String sql = "update user set userName = ?, password = ? where id = ?";
Object[] parameters = {user.getUserName(), user.getPassword(), user.getId()};
int update = super.update(sql, parameters);
//1的話就是成功
System.out.println(update);
//刪除,這樣寫也是可以的
int id = 20;
String sql = "delete from user where id = " + id;
int update = super.update(sql, null);
System.out.println(update);
通用查詢方法的實現
因爲我們要使用BeanUtils,所以說我們需要引入對應的jar包
之後開搞
public <T> List<T> query(String sql, Object[] parameters, Class<T> cls) {
ResultSet resultSet = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
List<T> list = new ArrayList<>();
try{
connection = JdbcUtil.getConnection();
preparedStatement = connection.prepareStatement(sql);
int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
if (parameterCount != 0 && parameters != null && parameterCount == parameters.length) {
for (int i = 0; i < parameters.length; i++) {
preparedStatement.setObject(i + 1, parameters[i]);
}
}
// 執行SQL語句,得到結果集對象
resultSet = preparedStatement.executeQuery();
// 結果集元數據
ResultSetMetaData metaData = resultSet.getMetaData();
// 字段個數
int columnCount = metaData.getColumnCount();
while (resultSet.next()) {
//反射
T t = cls.getConstructor().newInstance();
for (int i = 1; i <= columnCount; i++) {
// 獲取字段名
String fieldName = metaData.getColumnName(i);
// 獲取對應字段數據
Object value = resultSet.getObject(fieldName);
//類t,成員變量名fieldName,值value
BeanUtils.setProperty(t, fieldName, value);
}
list.add(t);
} catch (SQLException | NoSuchMethodException | InstantiationException| IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(connection, preparedStatement, resultSet);
}
//判斷結果
return list.size() != 0 ? list : null;
}
}
使用的時候
String sql = "select * from user";
List<User> list = super.query(sql, null, User.class);
if (list != null) {
for (User user : list) {
System.out.println(user);
}
} else {
System.out.println("Not Found!");
}