Spring和MyBatis整合,Spring的作用
1. Mapper接口的实现类交给Spring的IOC容器管理,包括给Service依赖注入Mapper实现类
class MyService
{
@Autowired
Mapper mapper1;
}
2. 管理Service层的事务处理。
class MyService
{
@Autowired
mapper mapper1;
public void test()
{
mapper1.aa()
mapper2.bb();
}
}
配置applicationContext.xml
MyBatis交给Spring管理
~~~
<bean id="ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 加载mybatis的主配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml"/>
<!-- 注入数据源 -->
<property name="dataSource" ref="ds" />
</bean>
~~~
Service和Mapper扫描
~~~
<context:component-scan base-package="com.neuedu.model.service"></context:component-scan>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定扫描的包名
如果扫描多个包,每个包中间使用半角逗号分隔
-->
<property name="basePackage" value="com.neuedu.model.dao"/>
<!-- 自动创建session(connection)去数据库交互 -->
<property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
</bean>
~~~
配置事务管理
~~~
<!-- 声明事务管理器 -->
<bean id="txm" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds"></property>
</bean>
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="txm">
<!-- 配置事务的传播特性 -->
<!--
配置事务传播特性
REQUIRED 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。常用于DML语句的操作
SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。 常用于DQL语句的操作
MANDATORY 支持当前事务,如果当前没有事务,就抛出异常。
REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与REQUIRED类似的操作。
-->
<!--
持久层,业务层的方法命名遵循规范
规定: 以save insert update delete为起始名的方法,执行事务 强制执行事务
以find select get validate为起始名的方法,不执行事务 不强制执行事务
规范大于规则:不准起其他的名字
-->
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 通过aop切面来控制事务 -->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.neuedu.model.service.*.*(..))"/>
</aop:config>
~~~
事务管理方法二
~~~
<!-- 配置事务管理器-->
<p:bean id=" txm " class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<p:property name="dataSource" ref="dataSource"></p:property>
</p:bean>
<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager=" txm"/>
~~~
练习:
EMP, lizhi
编写一个Service方法,模拟一个员工离职了。