springboot配置mybatis和事務(wù)管理方式
一、spring boot與mybatis的配置
1.首先,spring boot 配置mybatis需要的全部依賴如下:
<!-- Spring Boot 啟動(dòng)父依賴 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <!--以上內(nèi)容放在dependencies標(biāo)簽外,如果你有已經(jīng)有父標(biāo)簽,那將以上部分粘貼到父項(xiàng)目中--> <!-- spring boot 項(xiàng)目啟動(dòng)必須引入的web依賴,以下內(nèi)容放在dependency即可 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.5.1.RELEASE</version> </dependency> <!-- Spring Boot Mybatis 依賴 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency> <!-- oracle的數(shù)據(jù)庫(kù)驅(qū)動(dòng)包 --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.4.0-atlassian-hosted</version> </dependency>
這里主要說(shuō)一下上邊的數(shù)據(jù)庫(kù)驅(qū)動(dòng)包,oracle和mysql引入不同的依賴,千萬(wàn)不要忘記。如果忘記引入,會(huì)報(bào)找不到驅(qū)動(dòng)類異常。
2.然后,在application.properties
配置文件里添加如下內(nèi)容:
##數(shù)據(jù)庫(kù)連接信息 spring.datasource.url=jdbc:oracle:thin:@//192.168.1.171:1521/orcl spring.datasource.username=znxd spring.datasource.password=znxd spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver ##指向mapper的xml文件位置 mybatis.mapper-locations=classpath:mapper/*Mapper.xml ##指向?qū)嶓w類的位置 mybatis.type-aliases-package=cloud.user.models.*
上邊以spring.datasource
開(kāi)頭的內(nèi)容其實(shí)有很多,具體,在application.properties
文件里輸入后看看能點(diǎn)出的內(nèi)容就知道了。
springboot默認(rèn)會(huì)把spring.datasource開(kāi)頭的信息收納,進(jìn)行DataSource對(duì)象的配置,進(jìn)而進(jìn)行sqlSessionFactory的配置等相關(guān)數(shù)據(jù)庫(kù)連接的配置,所以其他很多人會(huì)說(shuō)寫(xiě)什么配置類,那些我感覺(jué)沒(méi)有必要的。(配置druid需要配一個(gè)@Bean)
當(dāng)然如果是特別詳細(xì)的,而在application.properties文件里又通過(guò)spring.datasource
點(diǎn)不出相關(guān)的配置,那可能需要配置類什么的。
mybatis.mapper-locations
所指向的位置是從src/main/resource開(kāi)始的,前邊需要加上classpath,它指向的是你的mapper.xml文件放置的位置。
3.我是mybatis通過(guò)數(shù)據(jù)庫(kù)表逆向工程生成的實(shí)體類、mapper等,先把項(xiàng)目具體的放置結(jié)構(gòu)貼出來(lái)如下:
對(duì)于上圖的解釋如下:
啟動(dòng)類必須放在項(xiàng)目中相對(duì)其他類的最高處,前邊文章說(shuō)過(guò),spring boot沒(méi)有傳統(tǒng)的spring 項(xiàng)目配置的<bean> 標(biāo)簽,它掃描bean的方式就是從啟動(dòng)類依次向下掃描進(jìn)默認(rèn)的內(nèi)置tomcat容器的。
上圖service放置的位置比其實(shí)現(xiàn)類放置的位置高,如果有兩個(gè)service A和B,實(shí)現(xiàn)類里有Aimpl和Bimpl,如果有Aimpl調(diào)用B的情況,有可能會(huì)在啟動(dòng)容器報(bào)“a field named ‘B’ not found”貌似這種錯(cuò)誤,說(shuō)明容器掃描順序有誤。
這種情況的最好的解決辦法,就應(yīng)該像我將service放在高處,容器啟動(dòng)先掃描進(jìn)service,然后再掃描impl,這樣在實(shí)現(xiàn)類掃描的時(shí)候就肯定能找到service,也就不會(huì)出現(xiàn)這種錯(cuò)誤了。另一種解決辦法是在引入service時(shí)多添加一個(gè)注解:@Lazy
@Autowired @Lazy //這樣就會(huì)延遲加載,上圖不需要,這里只是解釋這注解 LogsUserActiveMapper logsUserActiveMapper;
總之,如果出現(xiàn)調(diào)用與被調(diào)用關(guān)系,一定要記得,被調(diào)用者要首先被掃描進(jìn)spring boot內(nèi)置容器,也就是被調(diào)用者的包位置要放的較高一些(位置至少也待相平)。
4.service實(shí)現(xiàn)類上需要加一個(gè)@Service 注解。這個(gè)可能不需要,我一直沒(méi)有試試。
5.spring boot+mybatis除了這些要求,還需要在啟動(dòng)類處添加一個(gè)注解@MapperScan,如下:
package cloud.kafka; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.transaction.annotation.EnableTransactionManagement; @SpringBootApplication @EnableTransactionManagement //如果mybatis中service實(shí)現(xiàn)類中加入事務(wù)注解,需要此處添加該注解 @MapperScan("cloud.kafka.mapper") //掃描的是mapper.xml中namespace指向值的包位置 public class KafkaLogApplication { public static void main(String[] args){ SpringApplication.run(KafkaLogApplication.class, args); } }
如下是我的mapper.xml里namespace的值
<mapper namespace="cloud.kafka.mapper.LogsUserActiveMapper" >
**這樣就完成mybatis的配置了。
二、事務(wù)的配置
就是在mybatis的基礎(chǔ)上加上兩個(gè)注解
1、需要的注解為@EnableTransactionManagement
和@Transactional
兩個(gè),它們來(lái)自于下邊這個(gè)包:
spring-tx.jar
該包其實(shí)在前邊配置mybatis引入依賴時(shí),已自動(dòng)引入,就是下邊這個(gè):
<!-- Spring Boot Mybatis 依賴 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.0</version> </dependency>
所以只要上邊的依賴引入進(jìn)來(lái),那事務(wù)就不需要再引入包了,
2.首先,找到你的service實(shí)現(xiàn)類,加上@Transactional
注解,如果你加在類上,那該類所有的方法都會(huì)被事務(wù)管理,如果你加在方法上,那僅僅該方法符合具體的事務(wù)。當(dāng)然我們一般都是加在方法上。因?yàn)橹挥性?、刪、改才會(huì)需要事務(wù)。
比如下邊的一個(gè)插入數(shù)據(jù)的方法添加事務(wù):
@Override @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,timeout=36000,rollbackFor=Exception.class) public Integer add(Cbf_jtcy t) { return cbf_jtcyMapper.insert(t); }
如果不知道里邊都是什么東西,可以查看這篇文章,spring,mybatis事務(wù)管理配置與@Transactional注解使用
3.配置完后,spring boot啟動(dòng)類必須要開(kāi)啟事務(wù),而開(kāi)啟事務(wù)用的注解就是@EnableTransactionManagement
,如下:
@SpringBootApplication @EnableTransactionManagement @MapperScan("microservice.qssj.mapper")//必須加這個(gè),不加報(bào)錯(cuò),如果不加,也可以在每個(gè)mapper上添加@Mapper注釋,并且這里還要多填一個(gè)注釋,那個(gè)我忘了,我一直用這個(gè)注解 public class QssjServiceApplication { public static void main(String[] args) { SpringApplication.run(QssjServiceApplication.class, args); } }
這樣就完成了事務(wù)的配置。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文詳解各種ElasticSearch查詢?cè)贘ava中的實(shí)現(xiàn)
Elasticsearch是用Java開(kāi)發(fā)的,并作為Apache許可條款下的開(kāi)放源碼發(fā)布,是當(dāng)前流行的企業(yè)級(jí)搜索引擎,下面這篇文章主要給大家介紹了關(guān)于各種ElasticSearch查詢?cè)贘ava中實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-11-11Spring Boot實(shí)現(xiàn)接口簽名驗(yàn)證的過(guò)程
在Spring Boot中實(shí)現(xiàn)接口校驗(yàn)簽名通常是為了保證接口請(qǐng)求的安全性和數(shù)據(jù)的完整性,這篇文章主要介紹了Spring Boot實(shí)現(xiàn)接口簽名驗(yàn)證,需要的朋友可以參考下2024-04-04Java編程用兩個(gè)棧實(shí)現(xiàn)隊(duì)列代碼分享
這篇文章主要介紹了Java編程用兩個(gè)棧實(shí)現(xiàn)隊(duì)列代碼分享,具有一定參考價(jià)值,這里給大家分享下,供需要的朋友了解。2017-10-10Java實(shí)現(xiàn)畫(huà)圖 給圖片底部添加文字標(biāo)題
這篇文章主要介紹了Java實(shí)現(xiàn)畫(huà)圖 給圖片底部添加文字標(biāo)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11java實(shí)現(xiàn)簡(jiǎn)單猜拳小游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單猜拳小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11