Spring集成Mybatis3
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring集成Mybatis3相关的知识,希望对你有一定的参考价值。
0 说明
Mybatis使用 MyBatis-Spring 类库来集成spring框架
MyBatis-Spring | MyBatis | Spring |
---|---|---|
1.0.0 and 1.0.1 | 3.0.1 to 3.0.5 | 3.0.0 or higher |
1.0.2 | 3.0.6 | 3.0.0 or higher |
1.1.0 or higher | 3.1.0 or higher | 3.0.0 or higher |
1.3.0 or higher | 3.4.0 or higher | 3.0.0 or higher |
1 添加依赖
如果用了maven,则添加
<dependency>
<groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.1</version> </dependency>
2 基本配置
在Spring中使用Mybatis最少要在Spring 中配置两个东西:一个SqlSessionFactory 和至少一个映射接口
在MyBatis-Spring中, 一个 SqlSessionFactoryBean 用来创建 SqlSessionFactory ,要配置这个工程bean,在spring xml配置文件中加入以下内容:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
注意 SqlSessionFactory 需要依赖一个 DataSource . 此 DataSource 可以是任意的Spring中配置的数据源连接配置。
假定你有了一个这样定义的接口映射:
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{userId}")
User getUser(@Param("userId") String userId);
}
那么这个接口要在Spring中的声明需要配置为 MapperFactoryBean 的实例:
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
注意这个映射类必须是一个接口,而不是一个实际的实现类。在这个例子中,我们使用注解方式来指定SQL,当然也可以使用MyBatis的XML配置文件。
一旦配置好以后,就可以将映射直接注入到需要使用的业务/服务对象中,方法和其他spring bean的注入方式一样。
MapperFactoryBean 工厂类负责 SqlSession 的创建和关闭。如果当前线程处于Spring管理的事务中,会话会在事务完成时提交或回滚。最后,所有异常都会被转化Spring DataAccessExceptions.
调用MyBatis 数据访问方法现在只需要一行代码:
public class FooServiceImpl implements FooService {
private UserMapper userMapper;
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User doSomeBusinessStuff(String userId) {
return this.userMapper.getUser(userId);
}
3 事务管理
使用 MyBatis-Spring的一个主要原因就是允许MyBatis使用Spring的事务管理,MyBatis-Spring 利用Spring现有的DataSourceTransactionManager 来管理事务
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 启动声明式事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/><!-- a PlatformTransactionManager is still required -->
// the service class that we want to make transactional
@Transactional
public class DefaultFooService implements FooService {
Foo getFoo(String fooName);
Foo getFoo(String fooName, String barName);
void insertFoo(Foo foo);
void updateFoo(Foo foo);
}
<tx:advice id="txAdvice" transaction-manager="txManager">
<!-- the transactional semantics... -->
<tx:attributes>
<!-- all methods starting with ‘get‘ are read-only -->
<tx:method name="get*" read-only="true"/>
<!-- other methods use the default transaction settings (see below) -->
<tx:method name="insert*"/> <tx:method name="update*"/>
</tx:attributes>
</tx:advice>
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="updateStock" no-rollback-for="InstrumentNotFoundException" iolation="DEFAULT" propagation="REQUIRED" />
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = txManager.getTransaction(def);
try {
userMapper.insertUser(user);
}
catch (MyException ex) {
txManager.rollback(status);
throw ex;
}
txManager.commit(status);
@Transactional(readOnly = true) public class DefaultFooService implements FooService { public Foo getFoo(String fooName) { // do something } // these settings have precedence for this method @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) public void updateFoo(Foo foo) { // do something } }
以上是关于Spring集成Mybatis3的主要内容,如果未能解决你的问题,请参考以下文章
Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解 - 基本介绍
Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解 - 基本介绍