Hibernate是提供了便利的方法来自动生成sql,帮你做了很多事情,但是你要花大量时间去学习那该死的,难记的,复杂的hsql语言,我业内的朋友也在向我抱怨,什么one-to-one,one-to-many,many-to-many,any等,把对象关系写在hbm文件里,自己看了都想吐.还不如自己写sql.
其实Hibernate还做了一级缓存(启用),二级缓存(默认未启用),如果你做批量操作,悲剧来了,OOM是正常的,因为缓存了太多的对象。
其实ibatis是不错的选择,半自动,可以自己写sql,最好帮你吧结果集设置到对象属性中,所以这个框架用的还是很多的.
以上两个框架就是最流行的ORM,那么如果我想更简单一点,我不要xml配置文件,我不要配置属性与数据库对象的映射, 那么选择commons-dbutils.
基于逻辑分离,我这里也把sql放到单独的文件中.
ENTITY event, TABLE events EVENTS_SEQUENCE SELECT event_id,event_date,title FROM events SELECT event_id,event_date,title FROM events WHERE event_id = ? DELETE events WHERE event_id = ? UPDATE events SET event_date = ?, title = ? WHERE event_id = ? INSERT into events(event_id,event_date,title) VALUES(?,?,?)
这就是Property的xml结构,用xml格式能够清晰一点。 接下来加载使用。
public MaploadQueries(String path){ QueryLoader ql = QueryLoader.instance(); Map queries = new HashMap (); try { queries = ql.load(path); } catch (IOException e) { throw new RuntimeException("Load Queries fail, ["+path+"]"); } return queries; }
这是dbutils提供的属性文件加载类,返回Map
接下来演示一个搜索并把结果集设置到对象的例子
publicT queryBean(String sql, final Class clazz,final Map columnToPropertyOverrides,Object...params) throws SQLException { ResultSetHandler rsh = new ResultSetHandler (){ @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(执行器).