• 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);
        }
    }
    

    参考资料:

  • 相关阅读:
    CSS快速入门
    Kafka (一) 核心概念
    软件工程模型
    函数式编程
    spark计算操作整理
    HBase 文件合并
    HBase 数据存储结构
    目的论浅谈
    PHP8的注解
    JS的移入移除
  • 原文地址:https://www.cnblogs.com/linkworld/p/7625704.html
Copyright © 2020-2023  润新知