整合思想:
myBatis的角色:持久層框架;加載生成SqlSessionFactory會話工廠,特點:一旦創建運行期一直存在,設計爲單例模式。採用的mapper動態代理的方式。
spring角色:是一種容器,用來管理類的。並且可以設計scope爲單例的。spring是用來代理mapper接口的實現類,聲明爲springBean。
spring事務管理
spring的聲明式事務AOP技術
xml配置文件形式
<!-- 讀取外部資源文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 1、配置數據庫連接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--2、 配置會話工廠,讓spring來管理SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入數據源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 記載mybatis的全局配置文件 -->
<!-- <property name="configLocation" value="classpath:mybatis.xml"></property>-->
<!-- 起別名 -->
<property name="typeAliasesPackage" value="com.hpe.pojo"></property>
</bean>
<!-- 3、spring來管理mapper代理Bean,使用包掃描的方式,批量創建mapper的代理Bean。
bean的名字就是接口的名字,首字母小寫
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定mapper接口所在的包路徑 -->
<property name="basePackage" value="com.hpe.mapper"></property>
</bean>
<!-- 開啓註解掃描 -->
<context:component-scan base-package="com.hpe.service.*"></context:component-scan>
<!-- 4.1spring事務管理 -->
<!-- 事務管理器 spring的聲明式事務 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入數據源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 4.2事務的通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- propagation="REQUIRED" 傳播行爲
當前方法必須運行在一個事務中,如果當前沒有事務,則會開啓一個新的事務,如果沒有,則使用現在的事務
propagation="SUPPORTS":當前方法在運行在事務中,則使用當前事務,如果當前沒有事務,則不使用事務
-->
<tx:method name="select*" propagation="SUPPORTS"/>
<tx:method name="tran*" propagation="REQUIRED"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 4.3AOP的事務開頭 -->
<aop:config>
<!-- 切點 -->
<aop:pointcut expression="execution(* com.hpe.service..*.*(..))" id="cut1"/>
<!-- 通知 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="cut1"/>
</aop:config>
註解事務管理
<!-- 開啓註解事務 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
@Transactional 可以註解到方法上,標識當前方法進行事務管理
註解到類上:表示當前類中的所有方法都進行事務管理
注意:spring的事務管理,一定要對進行事務管理的地方往外拋異常,而不能try-catch捕捉異常。
如果想主動對事務進行回滾,可以往外拋異常throw new RuntimeException();