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 等待操作的sql语句
     * @param parameters 与sql语句对应的参数列表
     * @return 返回包含数据行数据的List<Object[]>,如果没查到返回null
     */
    public List<Object[]> query(String sql, Object... parameters) {
        Connection connection = null;
        PreparedStatement preparedStatement =null;
        ResultSet resultSet = null ;
        List<Object[]> list = new ArrayList<>();
        try {
            connection= JDBCUtils.getConnection();
            preparedStatement = connection.prepareStatement(sql);
            parseSqlParameter(preparedStatement,parameters);
            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 {
            JDBCUtils.closeAll(connection,preparedStatement,resultSet);
        }
        return list.size() != 0 ? list : null;
    }

1.3 BaseDao优化

/**
     * 预处理sql语句
     * @param preparedStatement
     * @param parameters
     * @throws SQLException
     */
    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方法

3. 轻量级数据库ORM框架DbUtils

3.1 DbUtils介绍

Apache组织下的一个轻量级ORM框架
Commons DbUtils: JDBC Utility Component
两个核心方法
update方法 ==> insert,update,delete
query方法 ==> select
一个核心类 QueryRunner DbUtils的核心类

3.2 DbUtils ORM工具使用

@Test
    public void testInsert() throws SQLException {
        QueryRunner runner = new QueryRunner();
        String sql = "insert into student(name,age, gender, score, address) value(?, ?, ?, ?, ?)";
        Object[] parameters = {"小明",22,false,100,"金星"};
        Connection connection = JDBCUtils.getConnection();
        runner.update(connection,sql,parameters);
        JDBCUtils.closeAll(connection);
    }
@Test
    public void test2() throws SQLException {
        QueryRunner runner = new QueryRunner();

        // 2. SQL语句
        String sql = "select * from student where id = 1";

        Connection connection = JDBCUtils.getConnection();

        /*
        BeanHandler: 处理符合JavaBean规范的类对象,传入参数是对应JavaBean规范 Class对象
         */
        Student student = runner.query(connection, sql, new BeanHandler<>(Student.class));

        System.out.println(student);

        JDBCUtils.closeAll(connection);
    }
@Test
    public void queryBeanList() throws SQLException {
        // 1. DbUtils核心类 QueryRunner对象
        QueryRunner runner = new QueryRunner();

        // 2. SQL语句
        String sql = "select * from student where id > ?";

        Connection connection = JDBCUtils.getConnection();

        /*
        BeanListHandler: 处理符合JavaBean规范的实体类,并且返回值是一个List集合
        包含制定的JavaBean实体类
         */
        List<Student> list = runner.query(connection, sql, new BeanListHandler<>(Student.class), 2);

        for (Student student : list) {
            System.out.println(student);
        }
        JDBCUtils.closeAll(connection);
    }
@Test
    public void test4() throws SQLException {
        QueryRunner runner = new QueryRunner();
        String sql = "select * from student where id = 1";
        Connection connection = JDBCUtils.getConnection();
        Object[] query = runner.query(connection, sql, new ArrayHandler());
        System.out.println(Arrays.toString(query));
        JDBCUtils.closeAll(connection);
    }
@Test
    public void test5() throws SQLException {
        QueryRunner runner = new QueryRunner();
        String sql = "select * from student where id > ?";
        Connection connection = JDBCUtils.getConnection();
        List<Object[]> list = runner.query(connection, sql, new ArrayListHandler(), 2);
        for (Object[] values : list) {
            System.out.println(Arrays.toString(values));
        }
        JDBCUtils.closeAll(connection);
    }
@Test
    public void test6() throws SQLException {
        QueryRunner runner = new QueryRunner();
        String sql = "select * from student where id = 1";
        Connection connection = JDBCUtils.getConnection();
        Map<String, Object> map = runner.query(connection, sql, new MapHandler());
        System.out.println(map);
        JDBCUtils.closeAll(connection);
    }
    @Test
    public void test7() throws SQLException {
        QueryRunner runner = new QueryRunner();
        String sql = "select * from student where id > ?";
        Connection connection = JDBCUtils.getConnection();
        List<Map<String, Object>> maps = runner.query(connection, sql, new MapListHandler(), 2);
        for (Map<String,Object> map : maps) {
            System.out.println(map);
        }
        JDBCUtils.closeAll(connection);
    }

3.3 ResultHandler以及其子类

ResultSetHandler 核心接口
ResultSet结果集 Handler处理,核心方法 handler(ResultSet rs)

BeanHandler:
处理符合JavaBean规范的类对象,传入参数是对应JavaBean 规范 Class对象
BeanListHandler:
处理符合JavaBean规范的实体类,并且返回值是一个List集 合包含制定的JavaBean实体类
ArrayHandler:
查询一个数据行,数据行中的所有数据整合成一个Object类型 数组返回
ArrayListHandler:
查询结果集中所有数据行,每一行数据对应一个Object类型数 组,存储在List集合中
MapHandler:
处理一个数据行,数据行中字段是对应Key,字段对应数据是 value,组成一个Map双边队列
MapListHandler:
结果集中所有的数据行,每一行对应一个Map对象,字段名为 Key,字段对应的数据为value,所有数据行存储在List中

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值