:D 想法的由来是蛮长的历史原因:
[color=red][b][使用iBATIS的历史][/b][/color]
使用iBATIS已经有很长一段时间了,系统中的CRUD是使用模板工具生成的代码,虽说有工具生成,但看着一大堆CRUD的SqlMap.xml文件,依旧是很不爽的一件事情.
[color=red][b][Hibernate与iBATIS的整合][/b][/color]
后来, 考虑了[b]整合Hibernate和iBATIS[/b]的想法,也就是[b]Hibernate处理CRUD, iBATIS负责复杂查询[/b]. 实践后是可行的,目前项目中也采纳并加以推广使用.
但是, Hibernate是有自己的缓存机制,而iBATIS完全没有像Hibernate这么强烈的延时缓存的概念, (当然,iBATIS有CacheModel,但那也是结果集的缓存,而不是new一个对象都是缓存的.) 而且, Hibernate是最后一次性flush事务,一个事务内的其他操作都是对缓存的操作.而iBATIS在一个事务内的操作都是直接对connection进行操作.
正由于Hibernate与iBATIS之间有这么大的差异,处理起来就必须注意调用Hibernate与iBATIS的先后顺序.
[color=red]
[b][使用JDBC实现基本CRUD功能,替换掉Hibernate][/b][/color]
但是,最近又在想,既然只是一个简单的CRUD功能就劳师动众的使用Hibernate,而且,还带来很多不必要的麻烦, 于是考虑在[b]JDBC的基础上自己实现CRUD的功能[/b], 由于iBATIS也是直接进行connection操作的,JDBC同样也是,那么就事务而言比Hibernate与iBATIS的整合简单多了,避免了很多不必要的烦恼.
[color=red][b][依赖JPA的Entity,Id,Column的Annotation配置][/b][/color]
在基本实现后,考虑继续使用JPA的Annotation配置来维护Entity Bean,使用后,虽然感觉比较冗余,不过也蛮不错的. 由于Annotation不熟,目前只能将@Id, @Column等配置写于getter方法上. 目前的实现也没有处理任何的容错,field都必须标注@Column.
东西蛮简单的, 莫见怪. 具体内容可以见项目代码, 项目基于Eclipse3.4,Spring2.5,Mysql.
项目rar的lib中已经包含了所依赖的所有jar包. 项目rar中也有基本的说明文字.
摘录基本代码:
[b]Entity Bean[/b]
[b]CrudDao的使用[/b]
[b]Spring配置[/b]
下面是Test.java运行时输出的log信息:
[color=red][b][使用iBATIS的历史][/b][/color]
使用iBATIS已经有很长一段时间了,系统中的CRUD是使用模板工具生成的代码,虽说有工具生成,但看着一大堆CRUD的SqlMap.xml文件,依旧是很不爽的一件事情.
[color=red][b][Hibernate与iBATIS的整合][/b][/color]
后来, 考虑了[b]整合Hibernate和iBATIS[/b]的想法,也就是[b]Hibernate处理CRUD, iBATIS负责复杂查询[/b]. 实践后是可行的,目前项目中也采纳并加以推广使用.
但是, Hibernate是有自己的缓存机制,而iBATIS完全没有像Hibernate这么强烈的延时缓存的概念, (当然,iBATIS有CacheModel,但那也是结果集的缓存,而不是new一个对象都是缓存的.) 而且, Hibernate是最后一次性flush事务,一个事务内的其他操作都是对缓存的操作.而iBATIS在一个事务内的操作都是直接对connection进行操作.
正由于Hibernate与iBATIS之间有这么大的差异,处理起来就必须注意调用Hibernate与iBATIS的先后顺序.
[color=red]
[b][使用JDBC实现基本CRUD功能,替换掉Hibernate][/b][/color]
但是,最近又在想,既然只是一个简单的CRUD功能就劳师动众的使用Hibernate,而且,还带来很多不必要的麻烦, 于是考虑在[b]JDBC的基础上自己实现CRUD的功能[/b], 由于iBATIS也是直接进行connection操作的,JDBC同样也是,那么就事务而言比Hibernate与iBATIS的整合简单多了,避免了很多不必要的烦恼.
[color=red][b][依赖JPA的Entity,Id,Column的Annotation配置][/b][/color]
在基本实现后,考虑继续使用JPA的Annotation配置来维护Entity Bean,使用后,虽然感觉比较冗余,不过也蛮不错的. 由于Annotation不熟,目前只能将@Id, @Column等配置写于getter方法上. 目前的实现也没有处理任何的容错,field都必须标注@Column.
东西蛮简单的, 莫见怪. 具体内容可以见项目代码, 项目基于Eclipse3.4,Spring2.5,Mysql.
项目rar的lib中已经包含了所依赖的所有jar包. 项目rar中也有基本的说明文字.
摘录基本代码:
[b]Entity Bean[/b]
@Entity(name = "ONE")
public class OneBean extends BaseBo {
private BigDecimal id;
@Id
@Column(name = "ID")
public BigDecimal getId() {
return id;
}
// ...
}
[b]CrudDao的使用[/b]
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);
}
// ...
}
[b]Spring配置[/b]
<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