JDBC高级(二)

JDBC高级

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 参数个数不能为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. 项目使用JdbcUitl,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.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方法
发布了49 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_46292175/article/details/105100724
今日推荐