dbUtils 原理

// Jdbc 的增,删, 改流程类似,只是参数不同, 因此可以向上抽取
    public class Demo{

        // Jdbc 的增加
        public void addStu(Stu stu){

            Connection con = null;
            PreparedStatement pstmt = null;
            try{
                con = JdbcUtils.getConnection();
                String sql = "INSERT INTO t_stu VALUES(?,?,?,?)";
                pstmt = con.prepareStatement(sql);

                pstmt.setInt(1,stu.getSid());
                pstmt.setString(2,stu.getSname());
                pstmt.setInt(3,stu.getAge());
                pstmt.setString(4,stu.getGender());

                pstmt.executeUpdate();
            } catch(Exception e){
                // 处理异常
            } finally{
                // 关闭资源
            }
        }

        // jdbc 修改方法
        public void UpdateStu(Stu stu){

            Connection con = null;
            PreparedStatement pstmt = null;
            try{
                con = JdbcUtils.getConnection();
                // 只需要 sql 语句修改
                String sql = "UPDATE t_stu SET sname=?,age=?,gender=? WHERE sid=?";
                pstmt = con.prepareStatement(sql);

                pstmt.setInt(4,stu.getSid());
                pstmt.setString(1,stu.getSname());
                pstmt.setInt(2,stu.getAge());
                pstmt.setString(3,stu.getGender());

                pstmt.executeUpdate();
            } catch(Exception e){
                // 处理异常
            } finally{
                // 关闭资源
            }
        }

        // jdbc 删除方法
        public void UpdateStu(int sid){

            Connection con = null;
            PreparedStatement pstmt = null;
            try{
                con = JdbcUtils.getConnection();
                // 只需要 sql 语句修改
                String sql = "DELETE FROM t_stu WHERE sid=?";
                pstmt = con.prepareStatement(sql);

                pstmt.setInt(1,stu.getSid());

                pstmt.executeUpdate();
            } catch(Exception e){
                // 处理异常
            } finally{
                // 关闭资源
            }
        }

        // jdbc 的查询方法 (查询一个)
        public Stu load(int sid){

            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSetHandler rs = null;
            try{
                con = JdbcUtils.getConnection();
                // 只需要 sql 语句修改
                String sql = "SELECT * FROM t_stu WHERE sid=?";
                pstmt = con.prepareStatement(sql);

                pstmt.setInt(1,stu.getSid());

                // 发送 sql 语句需要变化
                rs = pstmt.executeQuery();

                if(!rs.next()) return null;

                // 需要把 rs 转换成 Stu 对象
                Stu stu = new Stu();
                stu.setSid(rs.getInt("sid"));
                stu.setSname(rs.getString("sname"));
                stu.setAge(rs.getInt("age"));
                stu.setGender(rs.getString("gender"));

                return stu;
            } catch(Exception e){
                // 处理异常
            } finally{
                // 关闭资源
            }    
        }
    }


// 升级
    public class QR<T>{

        private DataSource dataSource;

        // 构造函数
        public QR(DataSource dataSource){
            super();
            this.dataSource = dataSource;
        }

        // 无参构造函数
        public QR(){
            super();
        }

        // 可以实现数据库的 insert,update, delete
        public int update(String sql, Object... params){
                Connection con = null;
                PreparedStatement pstmt = null;
                try{
                    con = dataSource.getConnection();

                    pstmt = con.prepareStatement(sql);
                    initParams(pstmt, params); // 设置参数

                    // 返回影响的行数
                    return pstmt.executeUpdate();
                } catch(Exception e){
                    throw new RuntimeException(e);
                } finally{
                    // 关闭资源
                    try{
                        if(pstmt != null) pstmt.close();
                        if(con != null) con.close();
                    } catch(SQLException e){
                        throw new RuntimeException(e);
                    }
                }
        }

        // 私有方法, 专门给 sql 语句的参数赋值
        private void initParams(PreparedStatement pstmt, Object... params)
                        throws SQLException{

            // 循环遍历赋值
            for(int i=0; i<params.length; i++){
                pstmt.setObject(i+1, params[i]);
            }
        }

        // 查询方法
        public T query(String sql, RsHandler rh, Object... params){
            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            try{
                con = dataSource.getConnection();

                pstmt = con.prepareStatement(sql);
                initParams(pstmt,params);

                rs = pstmt.executeQuery();

                return (T)rh.handle(rs);

            }catch(Exception e){
                throw new RuntimeException(e);
            } finally{
                try{
                    if(pstmt != null) pstmt.close();
                    if(con != null) con.close();
                } catch(SQLException e){
                    throw new RuntimeException(e);
                }
            }
        }
    }

    // 接口, 将 ResultSet 转换成 JavaBean 实体
    interface RsHandler<T>{
        public T handle(ResultSet rs) throws SQLException;
    }


// 使用上述 QR 类操作数据库
    public class Demo2{

        public void fun(){
            Stu stu = new Stu(1001,"lisi",22,"male");

            addStu(stu);
        }

        // 添加操作
        public void addStu(Stu stu){
            // 创建对象时, 给出连接池
            QR qr = new QR(JdbcUtils.getDataSource());

            // 给出 sql 模板
            String sql = "INSERT INTO t_stu VALUES(?,?,?,?)";

            // 给出参数
            Object[] params = {stu.getSid(),stu.getSname(),stu.getAge(),stu.getGender()};

            // 调用 QR 类的 update 方法
            qr.update(sql,params);
        }

        // 查询操作
        public Stu load(int sid){
            QR qr = new QR(JdbcUtils.getDataSource());

            String sql = "SELECT * FROM WHERE sid=?";
            Object[] params = {sid};

            // 实现 RsHandler 接口,
            // 可以将 ResultSet 结果集转换为 Stu 对象
            RsHandler<Stu> rh = new RsHandler<Stu>(){
                // 实现方法
                public Stu handle(ResultSet rs) throws SQLException {
                    if(!rs.next()) return null;
                    Stu stu = new Stu();
                    stu.setSid(rs.getInt("sid"));
                    stu.setSname(rs.getString("sname"));
                    stu.setAge(rs.getInt("age"));
                    stu.getGender(rs.getString("gender"));

                    return stu;
                }

            };

            qr.query(sql,rh,params);
        }
    }

DBUtils 工具类的使用

public class Demo(){

    // 数据库添加数据
    public void fun1() throws SQLException{
        // 给出连接池参数
        QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());

        // 给出 sql 模板
        String sql = "INSERT INTO t_stu VALUES(?,?,?,?)";

        // 给出参数的值
        Object[] params = {1003,"zhaoliu",24,"male"};

        qr.update(sql,params);
    }

    // 数据库查询
    public void fun2() throws SQLException{
        // 给出连接参数
        QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());

        // 给出 sql 模板
        String sql ="SELECT * FROM t_stu WHERE sid=?";

        // 传入参数
        Object[] params = {1003};

        // 执行query() 方法, 需要给出结果集处理器, 即 ResultSetHandler 的实现类.
        // ResultHandler 实现类也就是将 ResultSet 结果集转换为 Stu 对象
        Stu stu = qr.query(sql,new BeanHandler<Stu>(Stu.class),params);

        System.out.println(stu);
    }
}

参考资料: