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