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

 

posted @ 2015-07-14 23:15  偷月光的贼  阅读(376)  评论(0编辑  收藏  举报