深刻淺出JDBC(二) - Dbutils

對JDBC的封裝,主要在三個方面的優化:html

  1. 資源的開啓和關閉,每次與數據庫的交互都寫一遍,形成大量的重複
  2. sql對象和參數傳遞的簡化
  3. 結果集與java對象的映射

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會帶來很大的便利。

參考文檔:

  1. http://commons.apache.org/proper/commons-dbutils/examples.html
相關文章
相關標籤/搜索