日期:2014-05-16  浏览次数:20416 次

基于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;
	}
        // ...
}


CrudDao的使用
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);
	}
        // ...
}


Spring配置
	<bean id="crudDaoFactory" class="cn.iwoo.frame.orm.CrudDaoFactory">
		<property name="dbType" value="mysql"/>
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<bean id="oneBeanService" class="cn.iwoo.frame.orm.service.impl.OneBeanService">
		<property name="crudDaoFactory" ref="crudDaoFactory"/>
	</bean>



下面是Test.java运行时输出的log信息:
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 = 200

16:48:11,203 DEBUG CrudDao:124 - NAME,ID,PASSWORD,SEX,BIRTH_DATE_TIME

16:48:11,203 DEBUG CrudDao:128 - xx,200,psw,null,2009-02-23 16:48:11.156

1 楼 lggege 2009-05-10  
iBatis-Ext: 一个iBatis + annotations 的框架,通过 annotations, 来简化你的开发
http://www.ibstaff.net/fmartinez/?p=48

使用步骤
1. 编写你的 POJO
See the code here
2. 使用@DAO annotate 来编写DAO接口
3. 使用@SelectStatement, @UpdateStatement, ….来给接口增加方法
4. 编写sqlmap.xml 文件
5. 编写sqlMap config文件
6.其他的使用同IBatis

如果步骤5使用代码生成工具替换的话,那么还是一个不错的解决方案。


iBATIS 3.0将支持Annotation,看来,iBATIS也是逃不错Annotation的大趋势呀。
2 楼 zozoh 2009-05-23