1.BaseDao方法补充法补充
1.1 为什么要提供该方法
完成一个查询返回值类型是Object[],并且是存储于List集合中的一种方式,实际返回值类型是 List<Object[]>处理的是查询数据结果无法映射到类对象中,ORM,所有的数据按照查询结果字段顺序要求从数据库读取数据保存到Object数组,为了能满足多行数据查询要求,Object数组存储到List中
1.2 方法分析
分析:权限修饰符:public返回值类型:List<Object[]>方法名:query形式参数列表:String sql select查询语句对应当前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 参数个数不能为0parameters != null 参数数组不为null,因为存在当前方法没有参数,数组传入nullparameterCount == 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 参数个数不能为0parameters != null 参数数组不为null,因为存在当前方法没有参数,数组传入nullparameterCount == 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. 项目使用JdbcUitl,BaseDao完成数据持久化操作
2.1 需求
使用数据库作为数据持久化操作是一个非常非常常见。剥离原本的数据保存方式,之前数据保存使用的是Json个数文件,并且使用到Dao层项目Dao层需要继承BaseDao完成对于数据的操作CRUD。并且数据库和当前项目中的实体类是对应关系:数据表 ==> 实体类名一致 字段名 ==> 成员变量名 数据类型 ==> 成员变量数据类型完成一个简版Student管理系统daointerface StudentDaoimpl(package)StudentDaoImplserviceinterface StudentServiceimpl(package)StudentServiceImplviewinterface ProjectViewimpl(package)ProjectViewImplmainprojectmain方法
2.2 数据库设计
| 字段 |
数据类型 |
| id |
int PRI AI |
| name |
varchar(50) NN |
| age |
int NN |
| gender |
boolean NN |
| score |
float(5, 2) NN |
| address |
text NN |
2.3 Student实体类
2.4 StudentDao规范
2.5 StudentDaoImpl实现
2.6 StudentService规范
2.7 StudentServiceImpl实现
2.8 StudentView规范
2.9 StudentViewImpl实现
2.10 StudentController实现
2.11 StudentProject main方法
