`

commons-dbutils

 
阅读更多
现在ORM框架很多,什么Hibernate,ibatis等等。

Hibernate是提供了便利的方法来自动生成sql,帮你做了很多事情,但是你要花大量时间去学习那该死的,难记的,复杂的hsql语言,我业内的朋友也在向我抱怨,什么one-to-one,one-to-many,many-to-many,any等,把对象关系写在hbm文件里,自己看了都想吐.还不如自己写sql.

其实Hibernate还做了一级缓存(启用),二级缓存(默认未启用),如果你做批量操作,悲剧来了,OOM是正常的,因为缓存了太多的对象。

其实ibatis是不错的选择,半自动,可以自己写sql,最好帮你吧结果集设置到对象属性中,所以这个框架用的还是很多的.

以上两个框架就是最流行的ORM,那么如果我想更简单一点,我不要xml配置文件,我不要配置属性与数据库对象的映射, 那么选择commons-dbutils.

基于逻辑分离,我这里也把sql放到单独的文件中.
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>ENTITY event, TABLE events</comment>
	<entry key="eventsSequnce">
		EVENTS_SEQUENCE
	</entry> 
	<entry key="queryEvents">
		SELECT event_id,event_date,title FROM events 
	</entry> 
	<entry key="queryEventById">
		SELECT event_id,event_date,title FROM events WHERE event_id = ?
	</entry>
	<entry key="deleteEvent">
		DELETE events WHERE event_id = ?
	</entry>
	<entry key="updateEvent">
		UPDATE events SET event_date = ?, title = ? WHERE event_id = ?
	</entry>
	<entry key="insertEvent">
		INSERT into events(event_id,event_date,title) VALUES(?,?,?)
	</entry>
</properties>



这就是Property的xml结构,用xml格式能够清晰一点。 接下来加载使用。


public Map<String, String> loadQueries(String path){
		QueryLoader ql = QueryLoader.instance();
		Map<String, String> queries = new HashMap<String, String>();
		try {
			queries = ql.load(path);
		} catch (IOException e) {
			 throw new RuntimeException("Load Queries  fail, ["+path+"]");
		}
		return queries;
}

这是dbutils提供的属性文件加载类,返回Map<key,sql>,这样我们使用的时候只需要get就可以了。

接下来演示一个搜索并把结果集设置到对象的例子


 public <T> T queryBean(String sql, final Class<T> clazz,final Map<String, String> columnToPropertyOverrides,Object...params) throws SQLException { 
			ResultSetHandler<T> rsh = new ResultSetHandler<T>(){ 
				@Override
				public T handle(ResultSet rs) throws SQLException { 
					BeanProcessor bp = new BeanProcessor(columnToPropertyOverrides);
					if(rs.next()){
						return bp.toBean(rs, clazz);
					}
					return null;
				}
				
			};
			return queryRunner.query(sql, rsh, params)
}



这里我建了一个ResultSetHandler,故名思义,就是转化结果集的。 属性到字段的映射,如果一样的话,不需要配置,如果不一样,可以columntoProperty overrride.
还有这是一个泛型方法,支持所有类型哦。

例子就不发了,加载sql, 然后但用执行。

每一个DAO都加载属于自己的xml,并且通过简单的文件维护来获取. 这里的key随便定义,最好是DAO方法名,这样可以方便维护,每一个DAO的方法对应一条Sql语句, 再加上以上的简单QueryRunner(执行器).



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics