1.DbUtils介绍
DbUtils库是一套小巧的用来简化 JDBC 调用的库。JDBC源代码库单调且易出错,所以DBUtils 类抽象出所有简单的任务,让你更专注于使用JDBC做Query和Update的工作。
DbUtils的优势:
Some of the advantages of using DbUtils are:
- 不会资源泄露。更正JDBC代码并不困难,但是却非常耗时且单调。这通常会造成难以追踪的Connection泄露。
- 清爽整洁的代码。访问数据库的代码会大量的减少。剩下的代码更简介的表达了你的意图。
- JavaBean属性自动从ResultSet中填充值。不用手动调用setXxx为属性赋值。
在使用JDBC访问数据库是,有大量重复的代码(注册驱动,获取连接,访问数据库,处理结果集,释放资源等)DbUtils抽象并封装了这些操作,方便开发人员DAO操作。
2.DbUtils结构
DbUtils
JDBC Helper 方法的集合,线程安全。
控制事务,数据库连接,驱动加载等。
构造函数: public DbUtils()
QueryRunner
使用插拔策略执行SQL查询,线程安全。
构造函数:
- QueryRunner()
- QueryRunner(boolean pmdKnownBroken)
- QueryRunner(DataSource ds)
- QueryRunner(DataSource ds,boolean pmdKnownBroken)
QueryRunner核心:
- update(Connection conn, String sql, Object... params) ,用来完成表数据的增加、删除、更新操作
- query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) ,用来完成表数据的查询操作
ResultSetHandler<T>接口
这个接口的实现类,转换查询结果为对象。
主要实现类:
- ArrayHandler:结果集第一行放入Object[]数组中,数组中的元素依次是各个字段的值
- ArrayListHandler:结果集每一行放入Object[]数组中,数组中的元素依次是各个字段的值。并将Object[]封装到一个集合List中。
- BeanHandler:将结果集中的第一行放入指定的JavaBean对象中。
- BeanListHandler:将结果集中的每一行放入指定的JavaBean对象中,并将这些对象封装到List中。
- ColumnListHandler:将结果集中指定字段的值封装到一个List中
- ScalarHandler:用于但数据处理,如avg,sum,count等
- MapHandler:将结果集第一行封装到Map集合中,Key 列名, Value 该列数据
- MapListHandler:将结果集第一行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合
3.DbUtils实现增删改查
3.1 增删改:调用Update方法
public static void insert() { try { //新建QueryRunner对象 QueryRunner qr = new QueryRunner(); //执行的Sql语句 String sql = "insert into Student (sname,age)values(?,?)"; //参数,可以使用Object数组,也可以直接写 Object[] params = { "王六", 22 }; //执行Update,返回受影响的记录 Connection conn = getConnection();
int result = qr.update(conn,sql, params); System.out.println(result);
conn.close(); } catch (SQLException ex) { System.out.println(ex); throw new RuntimeException(""); } }
3.2查询
3.2.1 使用ArrayHander和ArrayListHandler操作结果集,结果集为空则返回[ ]空集合
public static void QueryByArrayHandler() { try { QueryRunner qr = new QueryRunner(); String sql = "select * from Student ";
Connection conn = getConnection(); Object[] result = qr.query(conn, sql, new ArrayHandler()); System.out.println(result); System.out.println(Arrays.toString(result)); conn.close(); } catch (SQLException ex) { System.out.println(ex); throw new RuntimeException(""); } } public static void QueryByArrayListHandler() { try { QueryRunner qr = new QueryRunner(); String sql = "select * from Student";
Connection conn = getConnection(); List<Object[]> result = qr.query(conn, sql, new ArrayListHandler()); System.out.println(result); for (Object[] objs : result) { System.out.println(Arrays.toString(objs)); }
conn.close(); } catch (SQLException ex) { System.out.println(ex); throw new RuntimeException(""); } }
3.2.2 BeanHandler和BeanListHandler
public static void QueryByBeanHandler() { try { QueryRunner qr = new QueryRunner(); String sql = "select * from student where id>10";
Connection conn = getConnection(); Student s = qr.query(conn, sql, new BeanHandler<Student>(Student.class)); System.out.println(s);
conn.close(); } catch (SQLException ex) { System.out.println(ex); throw new RuntimeException(""); } } public static void QueryByBeanListHandler() { try { QueryRunner qr = new QueryRunner(); String sql = "select * from student";
Connection conn = getConnection(); List<Student> stus = qr.query(conn, sql, new BeanListHandler<Student>(Student.class)); for (Student s : stus) { System.out.println(s.ToString()); }
conn.close(); } catch (SQLException ex) { System.out.println(ex); throw new RuntimeException(""); } }
3.3.3 ColumnHandler和ScalarHandler
public static void QueryByColumnListHandler() { try { QueryRunner qr = new QueryRunner(); String sql = "select * from student ";
Connection conn = getConnection(); List<String> names = qr.query(conn, sql, new ColumnListHandler<String>("sname")); for (String name : names) { System.out.println(name); } conn.close(); } catch (SQLException ex) { System.out.println(ex); throw new RuntimeException(""); } } public static void QueryByScalarHandler(){ try { QueryRunner qr = new QueryRunner(); String sql = "select count(*) from student ";
Connection conn = getConnection(); //new ScalarHandler<Long>() 内部应该是用的Long,所以泛型用Long long num = qr.query(conn, sql, new ScalarHandler<Long>()); System.out.println(num);
conn.close(); } catch (SQLException ex) { System.out.println(ex); throw new RuntimeException(""); } }
3.3.4 MapHandler和MapListHandler :返回的Map是有序的
public static void QueryByMapHandler() { try { QueryRunner qr = new QueryRunner(); String sql = "select * from student ";
Connection conn = getConnection(); Map<String, Object> data = qr.query(conn, sql, new MapHandler()); // Map的类型:org.apache.commons.dbutils.BasicRowProcessor$CaseInsensitiveHashMap // 继承自LinkedHashMap<String, Object>,所以它是有序的 System.out.println(data.getClass()); for (String key : data.keySet()) { System.out.println(data.get(key)); }
conn.close(); } catch (SQLException ex) { System.out.println(ex); throw new RuntimeException(""); } } public static void QueryByMapListHandler() { try { QueryRunner qr = new QueryRunner(); String sql = "select * from student ";
Connection conn = getConnection(); List<Map<String,Object>> data = qr.query(conn, sql, new MapListHandler()); for (Map<String,Object> map : data) { //map的类型:org.apache.commons.dbutils.BasicRowProcessor$CaseInsensitiveHashMap //继承自LinkedHashMap<String, Object>,所以它是有序的 System.out.println(map.getClass()); for(String key:map.keySet()){ System.out.println(map.get(key)); } }
conn.close(); } catch (SQLException ex) { System.out.println(ex); throw new RuntimeException(""); } }