JDBC高级(二)

残梦殇流年 12天前   阅读数 10 0

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

在这里插入图片描述

发布了37 篇原创文章 · 获赞 78 · 访问量 1万+

注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: