JDBC的封裝(下)

JDBC的封裝(下)

BaseDao封裝

目的:

  1. 完成通用的更新方法,滿足insert、update、delete操作。
  2. 完成通用的查詢方法,滿足select

針對於以上兩個目的,我們需要解決的問題如下:

  1. 數據庫連接對象的獲取 以及資源關閉問題 已解決
  2. 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!");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章