为了更加简单地使用JDBC,Apache组织提供了一个DBUtils工具,它是操作数据库的一个组件,实现了对JDBC的简单封装,可以在不影响性能的情况下极大地简化JDBC的编码工作量。
DBUtils工具的核心是org.apache.commons.dbutils.QueryRunner类和org.apache.commons.dbutils.ResultSetHandler接口。
QueryRunner类简化了执行SQL语句的代码,它与ResultSetHandler组合在一起就能完成大部分的数据库操作,大大的减少了编码量。
QueryRunner类提供了带有一个参数的构造方法,该方法以javax.sql.DataSource作为参数传递到QueryRunner的构造方法中来获取Connection对象。
ResultSetHandler接口用于处理ResultSet结果集,它可以将结果集中的数据转为不同的形式。根据结果集中数据类型的不同,ResultSetHandler提供了几种常见的实现类,具体如下: BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,并存放到List里。
ScalarHandler:将结果集中某一条记录的其中某一列的数据存储成Object对象。
如果上述实现类没有提供想要的功能,可以自定义一个类,实现ResultSetHandler接口的handle()方法。
use jdbc; create table `user` ( `id` int (11) primary key auto_increment, `name` varchar (120), `password` varchar (120) ); insert into `user` (`name`, `password`) values('zs','123456'); insert into `user` (`name`, `password`) values('lisi','123456'); insert into `user` (`name`, `password`) values('wangyu','123456');
public class BaseDao { // 优化查询 public static Object query(String sql, ResultSetHandler<?> rsh, Object... params) throws SQLException { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { // 获得连接 conn = JDBCUtils.getConnection(); // 预编译sql pstmt = conn.prepareStatement(sql); // 将参数设置进去 for (int i = 0; params != null && i < params.length; i++) { pstmt.setObject(i + 1, params[i]); } // 发送sql rs = pstmt.executeQuery(); // 让调用者去实现对结果集的处理 Object obj = rsh.handle(rs); return obj; } catch (Exception e) { e.printStackTrace(); }finally { // 释放资源 JDBCUtils.release(rs, pstmt, conn); } return rs; } }
public class User { private int id; private String name; private String password; //补充getter setter
public class ResultSetTest1 { public static void testBeanHandler() throws SQLException { BaseDao basedao = new BaseDao(); String sql = "select * from user where id=?"; User user = (User) basedao.query(sql, new BeanHandler(User.class), 1); System.out.print("id为1的User对象的name值为:" + user.getName()); } public static void main(String[] args) throws SQLException { testBeanHandler(); } }
public class ResultSetTest2 { public static void testBeanListHandler() throws SQLException { BaseDao basedao = new BaseDao(); String sql = "select * from user "; ArrayList<User> list = (ArrayList<User>) basedao.query(sql, new BeanListHandler(User.class)); for (int i = 0; i < list.size(); i++) { System.out.println("第" + (i + 1) + "条数据的username值为:" + list.get(i).getName()); } } public static void main(String[] args) throws SQLException { testBeanListHandler(); } }
public static void testScalarHandler() throws SQLException { BaseDao basedao = new BaseDao(); String sql = "select * from user where id=?"; Object arr = (Object) basedao.query(sql, new ScalarHandler("name"), 1); System.out.println(arr); } public static void main(String[] args) throws SQLException { testScalarHandler(); } }