Spring事務(wù)&Spring整合MyBatis的兩種方式
Spring整合MyBatis
在整合之前需要保證mybatis、springframework、mybatis-spring、spring-jdbc的包都已經(jīng)導(dǎo)入
并且要根據(jù)官網(wǎng)提示保證mybatis、springframework、mybatis-spring版本相對(duì)應(yīng),否則會(huì)產(chǎn)生沖突報(bào)錯(cuò)

maven依賴如下:
<!-- Spring Web MVC --> <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.23</version> </dependency> <!-- MyBatis 依賴 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!-- spring操作數(shù)據(jù)庫(kù) --> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.23</version> </dependency> <!-- mybatis整合spring --> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency>
整合方式一
利用spring所內(nèi)置的數(shù)據(jù)源覆蓋mybatis的environment環(huán)境下的數(shù)據(jù)源,并且在applicationContext.xml文件中對(duì)sqlSession、sqlSessionFactory進(jìn)行配置。mybatis中的sqlSession轉(zhuǎn)換為Spring中的sqlSessionTemplate??梢栽趍ybatis中僅留下別名配置和設(shè)置(日志實(shí)現(xiàn),駝峰命名映射)
我們可以在開(kāi)發(fā)中將所有的bean映射到一個(gè)Spring的xml配置文件中,再利用import標(biāo)簽將其引入到applicationContext文件,最終在編碼時(shí)仍然通過(guò)解析applicationContext文件來(lái)獲取所有配置和bean
applicationContext
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="classpath:Spring-dao.xml"/>
<bean id="userMapperImpl" class="com.yuqu.dao.UserMapperImpl">
<property name="sqlSession" ref="sqlSession"/>
</bean>
</beans>Spring-dao.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 配置數(shù)據(jù)源 使用spring內(nèi)置的數(shù)據(jù)源替換掉mybatis的datasource -->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url"value="jdbc:mysql://localhost:3306/sqltest?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"/>
<!-- 綁定mybatis配置文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- 映射器 注冊(cè)mapper.xml文件 -->
<property name="mapperLocations" value="classpath:com/yuqu/dao/*.xml"/>
</bean>
<!-- 配置sqlsession -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<!-- 只能選擇構(gòu)造器注入sqlSessionFactory 沒(méi)有SqlSessionTemplate提供set方法 -->
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
</beans>針對(duì)datasource的配置,對(duì)于driverClassName、url、username、password都是內(nèi)置好的,這個(gè)字段名不可更改不可自定義
配置sqlSessionFactory,class屬性使用spring提供的org.mybatis.spring.SqlSessionFactoryBean,然后繼續(xù)綁定mybatis配置文件
最后再將spring提供的sqlSessionTemplate映射為bean,在使用時(shí)可以直接通過(guò)getBean來(lái)獲取SqlSession,根據(jù)官網(wǎng)提示,sqlSessionTemplate可以完全等同于sqlSession,并且它是線程安全的
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- mybatis中留下設(shè)置 -->
<settings>
<!-- 日志實(shí)現(xiàn) -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!-- 駝峰映射 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- 別名管理 -->
<typeAliases>
<package name="com.yuqu.pojo"/>
</typeAliases>
</configuration>總結(jié)方式一步驟:
- 配置數(shù)據(jù)源
- 配置sqlSessionFactory
映射數(shù)據(jù)源到此
綁定mybatis配置文件
映射器 注冊(cè)mapper.xml文件
- 配置sqlSessionTemplate
- 給接口添加實(shí)現(xiàn)類
上述程序中的Spring-dao.xml可以直接給定,每次新建項(xiàng)目都可以這樣配置,只需要改動(dòng)映射器包名路徑,數(shù)據(jù)庫(kù)名即可
整合方式二
使用SqlSessionDaoSupport,創(chuàng)建接口實(shí)現(xiàn)類并繼承SqlSessionDaoSupport。使用該類,可以直接調(diào)用getSqlSession方法可以得到一個(gè)SqlSessionTemplate,再去執(zhí)行sql語(yǔ)句。
該接口實(shí)現(xiàn)類也必須在applicationContext.xml文件中進(jìn)行注冊(cè),注冊(cè)的同時(shí)需要添加屬性SqlSessionFactory或者SqlSessionTemplate,如果添加了SqlSessionTemplate則SqlSessionFactory將會(huì)被忽略
如下所示:
// SqlSessionDaoSupport繼承類
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{
public List<User> getUserList() {
return getSqlSession().getMapper(UserMapper.class).getUserList();
}
}
// 將該類映射到spring容器中
<bean id="UserMapperImpl2" class="com.yuqu.dao.UserMapperImpl2">
<property name="sqlSessionTemplate" ref="sqlSession"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>如上述映射bean所示,sqlSessionTemplate如果配置了就不需要再配置sqlSessionFactory
測(cè)試
@Test
public void test02(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper impl2 = context.getBean("UserMapperImpl2", UserMapper.class);
List<User> userList = impl2.getUserList();
for (User user : userList) {
System.out.println(user);
}
}Spring事務(wù)
mybatis-spring借助了spring的datasourceTransactionManager來(lái)實(shí)現(xiàn)事務(wù)管理,也就是說(shuō)通過(guò)對(duì)spring的配置就可以實(shí)現(xiàn)自動(dòng)管理事務(wù),不再需要手動(dòng)管理
首先要開(kāi)啟spring的事務(wù)管理功能,這包括頭文件、以及DataSourceTransactionManager對(duì)象。配置好事務(wù)后,通過(guò)aop進(jìn)行織入,我們可以選擇哪些方法執(zhí)行時(shí)開(kāi)啟事務(wù)哪些不需要開(kāi)啟,*通配符表示全部開(kāi)啟
<!-- 開(kāi)啟事務(wù)管理功能 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="datasource" />
</bean>
<!-- 結(jié)合aop織入事務(wù) -->
<!-- 需要導(dǎo)入支持事務(wù)的頭文件 <tx:... > -->
<!-- 配置事務(wù)通知advice -->
<tx:advice id="adviceTransaction" transaction-manager="transactionManager">
<!-- 給那些方法配置事務(wù)
事務(wù)傳播特性 propagation 常用下面兩種:
REQUIRED表示 支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù),就以非事務(wù)方式執(zhí)行。
NESTED:支持當(dāng)前事務(wù),如果當(dāng)前事務(wù)存在,則執(zhí)行一個(gè)嵌套事務(wù),如果當(dāng)前沒(méi)有事務(wù),就新建一個(gè)事務(wù)。
-->
<tx:attributes>
<!--
<tx:method name="getUserList" propagation="REQUIRED"/>
<tx:method name="deleteUser" propagation="REQUIRED"/><tx:method name="insertUser" propagation="REQUIRED"/>
-->
<tx:method name="*" propagation="REQUIRED"/>
<!-- <tx:method name="*"/>-->
</tx:attributes>
</tx:advice>
<!-- 配置事務(wù)切入 pointcut -->
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* com.yuqu.dao.*.*(..))"/>
<aop:advisor advice-ref="adviceTransaction" pointcut-ref="pointcut"/>
</aop:config>在此基礎(chǔ)上不再需要對(duì)源碼進(jìn)行任何的改動(dòng)就可以開(kāi)啟事務(wù)管理
總結(jié)一下這段時(shí)間對(duì)mybatis和spring的自學(xué):
? 最近自學(xué)的強(qiáng)度比較之前算是比較大的,自習(xí)之余幾乎都是在不斷的看別人的博客、一些機(jī)制的原理總是模模糊糊。就拿mybatis來(lái)說(shuō),學(xué)完之后只記得它優(yōu)化了jdbc開(kāi)發(fā),不過(guò)它的作用實(shí)際就是這樣的。只不過(guò)在使用mybatis的過(guò)程中很多常用的標(biāo)簽、配置不太熟悉,前天練了一下午的mybatis,之前覺(jué)得有點(diǎn)難以理解的resultMap的輪廓逐漸清晰,使用mybatis可以比較熟練的進(jìn)行xml配置、sql編寫、注解和xml混合使用。今天簡(jiǎn)單跟spring進(jìn)行了整合,大致的運(yùn)行原理是說(shuō)的通的,但是概念不夠熟悉,對(duì)spring還需要再沉淀一下,比如自動(dòng)裝配,雖然我覺(jué)得不難,但是到用的時(shí)候總會(huì)把大量spring提供的注解搞混或者忘記。但是也有收獲,知道IOC和AOP是什么,面試問(wèn)到可以說(shuō)出一些自己的理解。
到此這篇關(guān)于Spring事務(wù)&Spring整合MyBatis的文章就介紹到這了,更多相關(guān)Spring整合MyBatis內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringMVC+MyBatis 事務(wù)管理(實(shí)例)
- mybatis開(kāi)啟spring事務(wù)代碼解析
- MyBatis在Spring環(huán)境下的事務(wù)管理
- springboot使用mybatis開(kāi)啟事務(wù)回滾
- springboot配置mybatis和事務(wù)管理方式
- springboot mybatis手動(dòng)事務(wù)的實(shí)現(xiàn)
- Mybatis事務(wù)如何跟Spring結(jié)合(數(shù)據(jù)庫(kù)事務(wù)特性和Spring事務(wù)管理源碼)
- MyBatisPlus+Spring實(shí)現(xiàn)聲明式事務(wù)的方法實(shí)現(xiàn)
相關(guān)文章
使用java實(shí)現(xiàn)云端資源共享小程序的代碼
這篇文章主要介紹了用java寫一個(gè)云端資源共享小程序,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Java簡(jiǎn)單實(shí)現(xiàn)定時(shí)器
這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)單實(shí)現(xiàn)定時(shí)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
Spring Boot與Redisson實(shí)時(shí)排行榜功能
排行榜功能是常見(jiàn)且重要的需求之一,本文主要介紹了Spring Boot與Redisson實(shí)時(shí)排行榜功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
java 使用簡(jiǎn)單的demo實(shí)例告訴你優(yōu)化算法的強(qiáng)大
本篇文章介紹了,在java中使用簡(jiǎn)單的demo實(shí)例告訴你優(yōu)化算法的強(qiáng)大。需要的朋友參考下2013-05-05
詳解SpringBoot 解決攔截器注入Service為空問(wèn)題
這篇文章主要介紹了詳解SpringBoot 解決攔截器注入Service為空問(wèn)題的解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Mybatis-Plus主鍵插入null值報(bào)錯(cuò)問(wèn)題及解決
這篇文章主要介紹了Mybatis-Plus主鍵插入null值報(bào)錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Java中BigDecimal的加減乘除、比較大小與使用注意事項(xiàng)
對(duì)于不需要任何準(zhǔn)確計(jì)算精度的數(shù)字可以直接使用float或double,但是如果需要精確計(jì)算的結(jié)果,則必須使用BigDecimal類,而且使用BigDecimal類也可以進(jìn)行大數(shù)的操作,下面這篇文章給大家介紹了Java中BigDecimal的加減乘除、比較大小與使用注意事項(xiàng),需要的朋友可以參考下。2017-11-11
JavaWeb中導(dǎo)出excel文件的簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇JavaWeb中導(dǎo)出excel文件的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10
SpringBoot實(shí)現(xiàn)PDF轉(zhuǎn)圖片的代碼示例
在本文中,我們使用SpringBoot演示了如何將PDF文件轉(zhuǎn)換為一張或多張圖片,這些示例演示了如何使用Java編程語(yǔ)言與其他開(kāi)源技術(shù)集成,以實(shí)現(xiàn)各種文件格式之間的轉(zhuǎn)換,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-08-08

