对JDBC的封装,主要在三个方面的优化:html
Dbutils做为一种初级的JDBC封装框架,对JDBC进行了必定的封装,可是面对复杂业务的支持则不够。来看一个简单的demo:java
先定义个Connection的帮助类,用来注册驱动和建立链接mysql
public class ConnectionUtil { static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException{ return DriverManager.getConnection("jdbc:mysql://192.168.1.160:3306/lichao", "root", "root"); } }
Dbutils以QueryRunner为入口,传入Connection链接和sql,以及结果集的处理器sql
ResultSetHandler<User> rsh = new ResultSetHandler<User>() { @Override public User handle(ResultSet rs) throws SQLException { rs.next(); Long id = rs.getLong("id"); String name = rs.getString("name"); Integer age = rs.getInt("age"); return new User(id, name, age); } }; QueryRunner queryRunner = new QueryRunner(); User user = queryRunner.query(ConnectionUtil.getConnection(), "select * from user limit 1", rsh); System.out.println(user);
咱们须要建立一个ResultSetHandler的实现类,并实现handler方法,方法中完成ResultSet到java对象之间的转换。数据库
Connection帮助类减小了Connection建立的重复代码,QueryRunner帮咱们处理了Statement的操做以及资源的关闭(Connection默认是不关闭的),可是ResultSet到Java对象的映射仍是由本身来实现。可不能够将结果集和java对象的映射再简化呢?Dbutils提供了ResultSetHandler的一种实现BeanHandler,支持将数据库字段直接映射到java对象中。apache
ResultSetHandler<User> h = new BeanHandler<User>(User.class); QueryRunner queryRunner = new QueryRunner(); User user = queryRunner.query(ConnectionUtil.getConnection(), "select * from user limit 1", h); System.out.println(user);
BeanHandler把数据库字段同User类中的属性进行匹配,反射生成新的对象。框架
可是存在一个问题,数据库字段通常如下划线分隔,而Java则是驼峰式命名,所以字段名称直接匹配每每不行。异步
Dbutils提供了BeanProcessor来处理这个问题,只要将数据库字段名和java类中的属性名经过Map传入,便可完成映射关系。好比增长一个字段月薪(month_salary,对应属性monthSalary)。async
Map<String, String> map = new HashMap<String, String>(); map.put("month_salary", "monthSalary"); BeanProcessor customBeanProcessor = new BeanProcessor(map); ResultSetHandler<User> h = new BeanHandler<User>(User.class,new BasicRowProcessor(customBeanProcessor)); QueryRunner queryRunner = new QueryRunner(); User user = queryRunner.query(ConnectionUtil.getConnection(), "select * from user limit 1", h); System.out.println(user);
Dbutils对查询多条数据也提供了支持ide
ResultSetHandler<List<User>> h = new BeanListHandler<User>(User.class); QueryRunner queryRunner = new QueryRunner(); List<User> users = queryRunner.query(ConnectionUtil.getConnection(), "select * from user", h); for(User user : users){ System.out.println(user); }
Dbutils还提供了异步处理的方式,AsyncQueryRunner类支持了这个特性。
ResultSetHandler<List<User>> rsh = new BeanListHandler<User>(User.class); AsyncQueryRunner asyncQueryRunner = new AsyncQueryRunner(Executors.newCachedThreadPool()); Future<List<User>> future = asyncQueryRunner.query(ConnectionUtil.getConnection(), "select * from user", rsh); List<User> users = null; try { users = future.get(5, TimeUnit.SECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { e.printStackTrace(); } for(int i=0;i<users.size();i++){ System.out.println(users.get(i)); }
Dbutils也支持使用DataSource获取数据库链接
ResultSetHandler<User> rsh = new ResultSetHandler<User>() { @Override public User handle(ResultSet rs) throws SQLException { rs.next(); Long id = rs.getLong("id"); String name = rs.getString("name"); Integer age = rs.getInt("age"); return new User(id, name, age); } }; DataSource dataSource = null;// establish DataSource QueryRunner queryRunner = new QueryRunner(dataSource); User user = queryRunner.query("select * from user limit 1", rsh); System.out.println(user);
Dbutils对JDBC的封装避免了冗杂的代码,并提供了多种方式的API,支持Connection和DataSource两种方式得到链接。在简单的项目中,使用Dbutils会带来很大的便利。
参考文档: