JDBC高級(二)

1. BaseDao方法補充

1.1 需求分析

        完成一個查詢,返回值類型是Object[],並且存儲於List集合中,實際返回值類型是 List<Object[ ]>
        處理的是查詢數據結果無法映射到類對象中、無法完成ORM模式的情況,按照查詢結果的字段順序從數據庫讀取數據並保存到Object數組,爲了能滿足多行數據查詢要求,Object數組存儲到List集合中

1.2 方法分析

【權限修飾符】:public
【返回之類型】:List<Object[ ]>
【方法名】:query
【形式參數列表】:
        1.String sql ,select 查詢語句
        2.對應當前SQL語句的參數
方法聲明:

	public List<Object[]> query(String sql, Object[] parameters)

具體操作:

/**
 * 通用查詢方法,返回值是對應字段數據的Object類型數組,並且存儲於List集合
 *
 * @param sql        Select查詢SQL語句
 * @param parameters 對應當前SQL語句的參數
 * @return 包含數據行數據的List<Object[]> 如果沒有查詢到數據,返回null
 */
public List<Object[]> query(String sql, Object[] parameters) {
    ResultSet resultSet = null;
    Connection connection = null;
    PreparedStatement preparedStatement = null;
    List<Object[]> list = new ArrayList<>();
    try {
        connection = JdbcUtil.getConnection();
        preparedStatement = connection.prepareStatement(sql);
        /*
        獲取SQL語句參數個數!!!通過SQL語句元數據獲取(ParameterMetaData)
         */
        int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
        /*
        parameterCount 參數個數不能爲0
        parameters != null 參數數組不爲null,因爲存在當前方法沒有參數,數組傳入null
        parameterCount == parameters.length 參數個數和傳入的Object類型參數數容量一致
         */
        if (parameterCount != 0 && parameters != null && parameterCount == parameters.length)
            for (int i = 0; i < parameters.length; i++) {
                /*
                SQL語句參數下標從1開始
                數組數據下標從0開始
                 */
                preparedStatement.setObject(i + 1, parameters[i]);
            }
        }
        resultSet = preparedStatement.executeQuery();
        ResultSetMetaData metaData = resultSet.getMetaData();
        int columnCount = metaData.getColumnCount();
        while (resultSet.next()) {
            Object[] values = new Object[columnCount];
            for (int i = 1; i <= columnCount; i++) {
                values[i - 1] = resultSet.getObject(i);
            }
            list.add(values);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        JdbcUtil.close(connection, preparedStatement, resultSet);
    }
    return list.size() != 0 ? list : null;
}

1.3 BaseDao優化

// Ctrl + Alt + M 光標選擇代碼塊生成一個方法
/**
 * 類內私有化處理PreparedStatement預處理SQL語句和參數數組賦值操作
 *
 * @param preparedStatement 預處理SQL語句對應的PreparedStatement對象
 * @param parameters        對應當前SQL語句的Object類型數組
 * @throws SQLException SQL異常
 */
private void parseSqlParameter(PreparedStatement preparedStatement, Object[] parameters) throws SQLException {
    /*
    獲取SQL語句參數個數!!!通過SQL語句元數據獲取(ParameterMetaData)
    */
    int parameterCount = preparedStatement.getParameterMetaData().getParameterCount();
    
    /*
    parameterCount 參數個數不能爲0
    parameters != null 參數數組不爲null,因爲存在當前方法沒有參數,數組傳入null
    parameterCount == parameters.length 參數個數和傳入的Object類型參數數容量一致
    */
    if (parameterCount != 0 && parameters != null && parameterCount == parameters.length) {
        for (int i = 0; i < parameters.length; i++) {
            /*
            SQL語句參數下標從1開始
            數組數據下標從0開始
            */
            preparedStatement.setObject(i + 1, parameters[i]);
        }
    }
}

2. 項目使用JdbcUtil,BaseDao完成數據持久化操作

2.1 需求

        使用數據庫作爲數據持久化操作非常常見。
        剝離原本的數據保存方式(之前保存數據使用的是JSON格式文件),並且使用到Dao層
        項目Dao層需要繼承BaseDao完成對於數據的CRUD操作。並且數據庫和當前項目中的實體類是對應關係:
                數據表 ==> 實體類名一致
                字段名 ==>成員變量名
                數據類型 ==> 成員變量數據類型
完成一個簡版Student管理系統:

dao
	interface StudentDao
	impl(package)
		StudentDaoImpl
service
	interface StudentService
	impl(package)
		StudentServiceImpl
view
	interface ProjectView
	impl(package)
		ProjectViewImpl
mainproject
	main方法

2. 數據庫設計

字段 數據類型
id int PRI AI
name varchar(50) NN
age int NN
gender boolean NN
score float(5,2) NN
address text NN

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章