整合版本:
SPRING3.0.5
MYBATIS:3.1.0
MYBATIS-SPRING:1.0.3(包mybatis-spring-1.0.3-SNAPSHOT.jar)
整合过程说简单也简单,说难也难,关键是现代人行文不像古人那么严谨,文档结构不严谨,没重点,有歧义,网上的资料有一些多多少少都有点问题,也或者那种整合结果并不是我想要的,经过了昨晚和今天的研究,终于将他们按我的想法整合了
整合过程中卡了两次,一次是在SPRING启动时sqlSessionFactory创建失败,网上的资料说MYBATIS3和SPRING2.5整合会报那个错,但是我的两个版本都是3.X,最终是将整合包换成了最新的才解决;另外一次是SPRING管理MYBATIS的事务,要让其管理事务必须使用SqlSessionTemplate才行,这是最后研究了MyBatis-Spring Reference Simplied Chinese.pdf这个文档的结果;
下面贴出spring的主要配置代码:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/mysys_dev" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:com/mycomp/mysys/dao/*.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<context:component-scan base-package="com.mycomp" />
下面是DAO中的代码:
@Repository
public class MyDAO{
@Resource
private SqlSession sqlSession;
public SqlSession getSqlSession() {
return sqlSession;
}
public void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
public void insertData(){
sqlSession.insert("mypkg.testInsert");
sqlSession.insert("mypkg.testInsertForEx");
}
}
其中SqlSession也可以放在DAO中新建,那么新建的时候也必须用到SqlSessionTemplate;
下面是mapper
<mapper namespace="mypkg">
<insert id="testInsert">
insert into tmp_wmh_1(msg)values(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'))
</insert>
<insert id="testInsertForEx">
insert into tmp_wmh_1(msg)values(to_char(sysdate,'yyyymmdd'));
</insert>
</mapper>
这么做了之后,第一个insert语句成功无问题,可以insert成功,第二个语句有问题,因为带了分号,执行时将抛出异常导致回滚,整个方法执行之后是全部回滚掉了的;如果在DAO中直接引入sqlSessionFactory,然后获取SqlSession的话,事务不会被Spring所管理,这个在DEBUG日志中可以看到;
以上就是整合的重点,欢迎交流!