zoukankan      html  css  js  c++  java
  • DBUtils框架

    Apache DBUtils轻量级JDBC框架
    使用方便,只是对JDBC进行简单封装从而简化了开发者创建连接,结果集封装,释放资源等一些常用操作。

    DBUtils类 :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。代替了之前自己编写的JDBCUtils工具类,但是要注意DBUtils内部并没有封装获取数据库连接池的方法。
    主要方法如下:
    public static void close(…) throws java.sql.SQLException: 
    DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。
    public static void closeQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLException。
    public static void commitAndCloseQuietly(Connection conn): 用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。
    public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。

    QueryRunner类
    该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。 QueryRunner类提供了两个构造方法: 默认的构造方法 需要一个 javax.sql.DataSource 来作参数的构造方法。
    如果使用QueryRunner(DataSource ds)构造QueryRunner对象,数据库事务交给DBUtils框架进行处理,默认每条sql一个事务。
    batch(String sql,Object[] params)
    query(String sql,ResultSetHandler<T> rsh,Object...params)
    update(String sql,Object...params)
    如果使用QueryRunner()空参构造对象,需要自己管理事务,因为框架没有连接池无法获得数据库连接
    batch(Connection conn,String sql,Object[][]params)
    query(Connection conn,String sql,ResultSetHandler<T> rsh,Object...params)
    update(Connection conn,String sql,Object...params)

    QueryRunner通用的insert,update,delete操作方法update

    public void testUpdate() throws SQLException {
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            String sql = "update users set password = ? where username = ?";
            Object[] param = { "nihao", "小明" };
            queryRunner.update(sql, param);
        }

    对于使用无参构造函数的手动事务控制

    // 事务控制
        @Test
        public void testTransfer() throws SQLException {
            double money = 100;
            String outAccount = "aaa";
            String inAccount = "bbb";
            String sql1 = "update account set money = money - ? where name= ?";
            String sql2 = "update account set money = money + ? where name= ?";
    
            // QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            // 默认每条sql 一个单独事务
    
            QueryRunner queryRunner = new QueryRunner();// 不要传递连接池 --- 手动事务管理
            Connection conn = JDBCUtils.getConnection();
            conn.setAutoCommit(false);
            try {
                queryRunner.update(conn, sql1, money, outAccount);
                // int d = 1 / 0;
                queryRunner.update(conn, sql2, money, inAccount);
    
                System.out.println("事务提交!");
                DbUtils.commitAndCloseQuietly(conn);//提交事务并关闭连接。
            } catch (Exception e) {
                System.out.println("事务回滚!");
                DbUtils.rollbackAndCloseQuietly(conn);
                e.printStackTrace();
            }
        }

    ResultSetHandler接口及其九个实现类
    该接口用于处理 java.sql.ResultSet,将数据按要求转换为另一种形式。 ResultSetHandler 接口提供了一个单独的方法:Object handle (java.sql.ResultSet .rs)。

    ArrayHandler:把结果集中的第一行数据转成对象数组。

    // ArrayHandler 将结果集 第一行数据 存入Object[]
        @Test
        public void demo1() throws SQLException {
            // 使用DBUtils
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            String sql = "select * from account";
    
            // 数组每一个元素,第一行数据每一列
            Object[] values = queryRunner.query(sql, new ArrayHandler());
            System.out.println(Arrays.toString(values));
        }
    }

    ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。

    / ArrayListHandler 结果集每一行数据保存Object[] ----- List
        @Test
        public void demo2() throws SQLException {
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            String sql = "select * from account";
            List<Object[]> list = queryRunner.query(sql, new ArrayListHandler());
    
            for (Object[] objects : list) {
                System.out.println(Arrays.toString(objects));
            }
        }

    BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中

    // BeanHandler 将结果集第一行数据 封装 JavaBean对象中
        @Test
        public void demo3() throws SQLException {
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            String sql = "select * from account";
    
            // 传入 Account.class 为了在方法中 通过反射构造Account对象
            // 使用BeanHandler 注意事项 :表列名 与 类中属性名称一致
            Account account = queryRunner.query(sql, new BeanHandler<Account>(
                    Account.class));
            System.out.println(account.getId());
            System.out.println(account.getName());
            System.out.println(account.getMoney());
        }

    BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

    // BeanListHander 结果集每一条数据 ---JavaBean对象 再保存list集合
        @Test
        public void demo4() throws SQLException {
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            String sql = "select * from account";
            List<Account> accounts = queryRunner.query(sql,
                    new BeanListHandler<Account>(Account.class));
    
            for (Account account : accounts) {
                System.out.println(account.getId());
                System.out.println(account.getName());
                System.out.println(account.getMoney());
                System.out.println("----------------");
            }
        }

    ColumnListHandler:将结果集中某一列的数据存放到List中。

    // ColumnListHandler 作用获得结果集的某一列
        @Test
        public void demo5() throws SQLException {
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            String sql = "select * from account";
    
            // 因为每列类型 都不一样
            // List<Object> list = queryRunner.query(sql,
            // new ColumnListHandler("name"));
            List<Object> list = queryRunner.query(sql, new ColumnListHandler(2));
            System.out.println(list);
        }

    MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。

    // MapHander 将结果集第一行数据 封装Map集合,key是列名 value第一行数据
        @Test
        public void demo6() throws SQLException {
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            String sql = "select * from account";
            Map<String, Object> map = queryRunner.query(sql, new MapHandler());
            System.out.println(map);
        }

    MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List集合中。

    // MapListHandler 将结果集每一行数据 保存map中,key列名 value数据 ---- 在讲map对象保存List集合
        @Test
        public void demo7() throws SQLException {
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            String sql = "select * from account";
            List<Map<String, Object>> list = queryRunner.query(sql,
                    new MapListHandler());
            for (Map<String, Object> map : list) {
                System.out.println(map);
            }
        }

    KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List<Map>),再把这些map再存到一个map里,其key为指定的key。

    // KeyedHandler 将结果集每一行数据 保存map , 将map保存另一个map , key 指定列
        @Test
        public void demo8() throws SQLException {
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            String sql = "select * from account";
    
            Map<Object, Map<String, Object>> map = queryRunner.query(sql,
                    new KeyedHandler("id"));
            System.out.println(map);
        }

    ScalarHandler 通过保存只有一行一列 结果数据 

    // ScalarHandler 通过保存只有一行一列 结果数据 ---- 分组函数
        @Test
        public void demo9() throws SQLException {
            QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
            String sql = "select count(*) from account";
    
            long count = (Long) queryRunner.query(sql, new ScalarHandler(1));
            System.out.println(count);
        }
  • 相关阅读:
    微信小程序-上传多张图片加进度条(支持预览、删除)
    php中120个内置函数
    angular6 NgModule中定义模块module
    Aliasing input/output properties
    angular6 Can't bind to 'zzst' since it isn't a known property of
    [转]DOM 中 Property 和 Attribute 的区别
    Angular6
    [转]VirtualBox 修改UUID实现虚拟硬盘复制
    pthread_create如何传递两个参数以上的参数
    linux 线程操作问题undefined reference to 'pthread_create'的解决办法(cmake)
  • 原文地址:https://www.cnblogs.com/ss561/p/4646900.html
Copyright © 2011-2022 走看看