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方法,模擬一個員工離職了。