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 |