基于JDBC,JPA Annotation 实现的简易CRUD的泛型Dao
想法的由来是蛮长的历史原因:
[使用iBATIS的历史]
使用iBATIS已经有很长一段时间了,系统中的CRUD是使用模板工具生成的代码,虽说有工具生成,但看着一大堆CRUD的SqlMap.xml文件,依旧是很不爽的一件事情.
[Hibernate与iBATIS的整合]
后来, 考虑了整合Hibernate和iBATIS的想法,也就是Hibernate处理CRUD, iBATIS负责复杂查询. 实践后是可行的,目前项目中也采纳并加以推广使用.
但是, Hibernate是有自己的缓存机制,而iBATIS完全没有像Hibernate这么强烈的延时缓存的概念, (当然,iBATIS有CacheModel,但那也是结果集的缓存,而不是new一个对象都是缓存的.) 而且, Hibernate是最后一次性flush事务,一个事务内的其他操作都是对缓存的操作.而iBATIS在一个事务内的操作都是直接对connection进行操作.
正由于Hibernate与iBATIS之间有这么大的差异,处理起来就必须注意调用Hibernate与iBATIS的先后顺序.
[使用JDBC实现基本CRUD功能,替换掉Hibernate]
但是,最近又在想,既然只是一个简单的CRUD功能就劳师动众的使用Hibernate,而且,还带来很多不必要的麻烦, 于是考虑在JDBC的基础上自己实现CRUD的功能, 由于iBATIS也是直接进行connection操作的,JDBC同样也是,那么就事务而言比Hibernate与iBATIS的整合简单多了,避免了很多不必要的烦恼.
[依赖JPA的Entity,Id,Column的Annotation配置]
在基本实现后,考虑继续使用JPA的Annotation配置来维护Entity Bean,使用后,虽然感觉比较冗余,不过也蛮不错的. 由于Annotation不熟,目前只能将@Id, @Column等配置写于getter方法上. 目前的实现也没有处理任何的容错,field都必须标注@Column.
东西蛮简单的, 莫见怪. 具体内容可以见项目代码, 项目基于Eclipse3.4,Spring2.5,Mysql.
项目rar的lib中已经包含了所依赖的所有jar包. 项目rar中也有基本的说明文字.
摘录基本代码:
Entity Bean
@Entity(name = "ONE")public class OneBean extends BaseBo {private BigDecimal id;@Id@Column(name = "ID")public BigDecimal getId() {return id;} // ...}public class OneBeanService implements IOneBeanService {private CrudDaoFactory crudDaoFactory;public void noException() throws Exception {CrudDao<OneBean> crudDao = crudDaoFactory.getCrudDao(OneBean.class);OneBean bean = this.createOneBean(new BigDecimal(100));crudDao.insert(bean);} // ...}<bean id="crudDaoFactory" value="mysql"/><property name="dataSource" ref="dataSource"/></bean><bean id="oneBeanService" ref="crudDaoFactory"/></bean>
16:48:11,156 DEBUG CrudDao:36 - INSERT INTO ONE(NAME, ID, PASSWORD, SEX, BIRTH_DATE_TIME) VALUES ('xx', 200, 'psw', null, '2009-02-23 16:48:11.156')16:48:11,171 DEBUG CrudDao:66 - SELECT NAME, ID, PASSWORD, SEX, BIRTH_DATE_TIME FROM ONE WHERE ID = 20016:48:11,203 DEBUG CrudDao:124 - NAME,ID,PASSWORD,SEX,BIRTH_DATE_TIME16:48:11,203 DEBUG CrudDao:128 - xx,200,psw,null,2009-02-23 16:48:11.156