自定义DBUtils查询多条数据封装到List<JavaBean>

本文介绍了如何模仿DBUtils库,实现对数据库的查询操作,特别是将查询结果批量封装到List<JavaBean>中,支持Java JDBC的增删改功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模仿DBUtils, 完成增删改的功能

public class MyQueryRunner {
    private DataSource dataSource;

    public MyQueryRunner(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public int update(String sql,Object... params) throws SQLException {
        //执行sql语句
        //1. 获得连接
        Connection conn = this.prepareConnection();
        //2. 预编译sql语句
        PreparedStatement pstm = this.prepareSql(sql, conn);
        //3. 填充占位符处的参数
        this.fillStatement(pstm,params);
        //4. 执行sql语句
        int rows = pstm.executeUpdate();
        //5. 关闭资源
        pstm.close();
        conn.close();
        return rows;
    }

    private void fillStatement(PreparedStatement pstm, Object... params) throws SQLException {
        //1. 判断sql语句的参数个数和传入的参数个数是否一致
        //获取参数元数据
        ParameterMetaData parameterMetaData = pstm.getParameterMetaData();
        //使用参数元数据获取sql语句的参数个数
        int parameterCount = parameterMetaData.getParameterCount();
        int paramsCount = params.length;
        if (parameterCount != paramsCount) {
            //说明参数个数有误
            throw new RuntimeException("你传入的参数个数有误,期望是:"+parameterCount+",但是你给了:"+paramsCount);
        }

        //开始遍历设置参数
        for(int i=0;i<parameterCount;i++){
            pstm.setObject(i+1,params[i]);
        }
    }

    /**
     * 预编译sql语句
     */
    private PreparedStatement prepareSql(String sql, Connection conn) throws SQLException {
        if(conn == null){
            //如果连接为空
            throw new RuntimeException("执行SQL语句的连接不能为空");
        }
        return conn.prepareStatement(sql);
    }

    private Connection prepareConnection() throws SQLException {
        if (this.dataSource == null) {
            //如果没有连接池则报错
            throw new RuntimeException("需要一个连接池来获取连接执行SQL语句!!!");
        }

        return dataSource.getConnection();
    }

    /**
     * 查询到多条数据封装到List<T>
     */
    public <T> List<T> queryList(String sql, Class<T> clazz, Object... params) throws Exception {
        //1. 获取连接对象
        Connection conn = this.prepareConnection();
        //2. 预编译SQL语句
        PreparedStatement pstm = this.prepareSql(sql, conn);
        //3. 设置参数
        this.fillStatement(pstm,params);
        //4. 执行SQL语句
        ResultSet rst = pstm.executeQuery();
        //获取结果集元数据
        ResultSetMetaData rstMetaData = rst.getMetaData();
        //获取结果集的列数
        int columnCount = rstMetaData.getColumnCount();

        //1. 获取POJO中的所有方法
        Method[] methods = clazz.getMethods();

        //声明一个集合存储t
        List<T> tList = new ArrayList<>();
        while (rst.next()) {
            //创建出封装数据的POJO对象
            T t = clazz.newInstance();

            for (int i = 1; i <= columnCount; i++) {
                //获取每列的名字(字段名)
                String columnName = rstMetaData.getColumnName(i);
                //1. 获取每一行数据的各个字段的数据
                Object columnValue = rst.getObject(columnName);

                //2. 调用对象的对应的set方法,往对象中设置数据
                //遍历出POJO的每一个方法
                for (Method method : methods) {
                    //获取方法名
                    String methodName = method.getName();
                    //匹配方法名
                    if (methodName.equalsIgnoreCase("set"+columnName)) {
                        //说明匹配到了对应的set方法,那么就调用这个set方法,设置columnValue
                        method.invoke(t,columnValue);
                    }
                }

            }

            tList.add(t);
        }
        //关闭资源
        rst.close();
        pstm.close();
        connection.close();
        return tList;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值