现在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(执行器).