本篇內(nèi)容主要講解“SpringBoot集成怎么使用MyBatis配置XML文件”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“SpringBoot集成怎么使用MyBatis配置XML文件”吧!
網(wǎng)站制作、建網(wǎng)站找專業(yè)網(wǎng)絡(luò)公司成都創(chuàng)新互聯(lián)公司:定制網(wǎng)站、模板網(wǎng)站、仿站、微信平臺(tái)小程序開發(fā)、軟件開發(fā)、app軟件定制開發(fā)等。做網(wǎng)站價(jià)格咨詢成都創(chuàng)新互聯(lián)公司:服務(wù)完善、十載建站、值得信賴!網(wǎng)站制作電話:18982081108
對(duì)象關(guān)系映射(Object Relational Mapping,ORM)模式是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù)。簡單的說,ORM 是通過使用描述對(duì)象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫中。
為什么需要ORM?
當(dāng)你開發(fā)一個(gè)應(yīng)用程序的時(shí)候(不使用 O/R Mapping),可能會(huì)寫不少數(shù)據(jù)訪問層代碼,用來從數(shù)據(jù)庫保存、刪除、讀取對(duì)象信息等;在 DAL 中寫了很多的方法來讀取對(duì)象數(shù)據(jù)、改變狀態(tài)對(duì)象等任務(wù),而這些代碼寫起來總是重復(fù)的。針對(duì)這些問題 ORM 提供了解決方案,簡化了將程序中的對(duì)象持久化到關(guān)系數(shù)據(jù)庫中的操作。
ORM 框架的本質(zhì)是簡化編程中操作數(shù)據(jù)庫的編碼,在 Java 領(lǐng)域發(fā)展到現(xiàn)在基本上就剩兩家最為流行,一個(gè)是宣稱可以不用寫一句 SQL 的 Hibernate,一個(gè)是以動(dòng)態(tài) SQL 見長的 MyBatis,兩者各有特點(diǎn)。在企業(yè)級(jí)系統(tǒng)開發(fā)中可以根據(jù)需求靈活使用,會(huì)發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象:傳統(tǒng)企業(yè)大都喜歡使用 Hibernate,而互聯(lián)網(wǎng)行業(yè)通常使用 MyBatis。
MyBatis 是一款標(biāo)準(zhǔn)的 ORM 框架,被廣泛的應(yīng)用于各企業(yè)開發(fā)中。MyBatis 最早是 Apache 的一個(gè)開源項(xiàng)目 iBatis,2010 年這個(gè)項(xiàng)目由 Apache Software Foundation 遷移到了 Google Code,并且改名為 MyBatis,2013 年 11 月又遷移到 Github。從 MyBatis 的遷移史,也可以看出源碼托管平臺(tái)的發(fā)展史,GitHub 目前已經(jīng)成為世界上最大的開源軟件托管平臺(tái),建議大家多多關(guān)注這個(gè)全球最大的同性社交網(wǎng)站。
MyBatis 支持普通的 SQL 查詢,存儲(chǔ)過程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的 JDBC 代碼和參數(shù)的手工設(shè)置以及對(duì)結(jié)果集的檢索封裝。MaBatis 可以使用簡單的 XML 或注解用于配置和原始映射,將接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 對(duì)象)映射成數(shù)據(jù)庫中的記錄。
1. MyBatis的優(yōu)點(diǎn)
SQL 被統(tǒng)一提取出來,便于統(tǒng)一管理和優(yōu)化
SQL 和代碼解耦,將業(yè)務(wù)邏輯和數(shù)據(jù)訪問邏輯分離,使系統(tǒng)的設(shè)計(jì)更清晰、更易維護(hù)、更易單元測(cè)試
提供映射標(biāo)簽,支持對(duì)象與數(shù)據(jù)庫的 ORM 字段關(guān)系映射
提供對(duì)象關(guān)系映射標(biāo)簽,支持對(duì)象關(guān)系組件維護(hù)
靈活書寫動(dòng)態(tài) SQL,支持各種條件來動(dòng)態(tài)生成不同的 SQL
2. MyBatis的缺點(diǎn)
編寫 SQL 語句時(shí)工作量很大,尤其是字段多、關(guān)聯(lián)表多時(shí),更是如此
SQL 語句依賴于數(shù)據(jù)庫,導(dǎo)致數(shù)據(jù)庫移植性差
3. MyBatis幾個(gè)重要的概念
Mapper 配置可以使用基于 XML 的 Mapper 配置文件來實(shí)現(xiàn),也可以使用基于 Java 注解的 MyBatis 注解來實(shí)現(xiàn),甚至可以直接使用 MyBatis 提供的 API 來實(shí)現(xiàn)。
Mapper 接口是指自行定義的一個(gè)數(shù)據(jù)操作接口,類似于通常所說的 DAO 接口。早期的 Mapper 接口需要自定義去實(shí)現(xiàn),現(xiàn)在 MyBatis 會(huì)自動(dòng)為 Mapper 接口創(chuàng)建動(dòng)態(tài)代理對(duì)象。Mapper 接口的方法通常與 Mapper 配置文件中的 select、insert、update、delete 等 XML 結(jié)點(diǎn)存在一一對(duì)應(yīng)關(guān)系。
Executor,MyBatis 中所有的 Mapper 語句的執(zhí)行都是通過 Executor 進(jìn)行的,Executor 是 MyBatis 的一個(gè)核心接口。
SqlSession,是 MyBatis 的關(guān)鍵對(duì)象,是執(zhí)行持久化操作的獨(dú)享,類似于 JDBC 中的 Connection,SqlSession 對(duì)象完全包含以數(shù)據(jù)庫為背景的所有執(zhí)行 SQL 操作的方法,它的底層封裝了 JDBC 連接,可以用 SqlSession 實(shí)例來直接執(zhí)行被映射的 SQL 語句。
SqlSessionFactory,是 MyBatis 的關(guān)鍵對(duì)象,它是單個(gè)數(shù)據(jù)庫映射關(guān)系經(jīng)過編譯后的內(nèi)存鏡像。SqlSessionFactory 對(duì)象的實(shí)例可以通過 SqlSessionFactoryBuilder 對(duì)象類獲得,而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個(gè)預(yù)先定制的 Configuration 的實(shí)例構(gòu)建出。
4. MyBatis的工作流如下:
首先加載 Mapper 配置的 SQL 映射文件,或者是注解的相關(guān) SQL 內(nèi)容。
創(chuàng)建會(huì)話工廠,MyBatis 通過讀取配置文件的信息來構(gòu)造出會(huì)話工廠(SqlSessionFactory)。
創(chuàng)建會(huì)話。根據(jù)會(huì)話工廠,MyBatis 就可以通過它來創(chuàng)建會(huì)話對(duì)象(SqlSession),會(huì)話對(duì)象是一個(gè)接口,該接口中包含了對(duì)數(shù)據(jù)庫操作的增、刪、改、查方法。
創(chuàng)建執(zhí)行器。因?yàn)闀?huì)話對(duì)象本身不能直接操作數(shù)據(jù)庫,所以它使用了一個(gè)叫做數(shù)據(jù)庫執(zhí)行器(Executor)的接口來幫它執(zhí)行操作。
封裝 SQL 對(duì)象。在這一步,執(zhí)行器將待處理的 SQL 信息封裝到一個(gè)對(duì)象中(MappedStatement),該對(duì)象包括 SQL 語句、輸入?yún)?shù)映射信息(Java 簡單類型、HashMap 或 POJO)和輸出結(jié)果映射信息(Java 簡單類型、HashMap 或 POJO)。
操作數(shù)據(jù)庫。擁有了執(zhí)行器和 SQL 信息封裝對(duì)象就使用它們?cè)L問數(shù)據(jù)庫了,最后再返回操作結(jié)果,結(jié)束流程。
mybatis-spring-boot-starter 是 MyBatis 幫助我們快速集成 Spring Boot 提供的一個(gè)組件包,使用這個(gè)組件可以做到以下幾點(diǎn):
構(gòu)建獨(dú)立的應(yīng)用
幾乎可以零配置
需要很少的 XML 配置
mybatis-spring-boot-starter 依賴于 MyBatis-Spring 和 Spring Boot,最新版 1.3.2 需要 MyBatis-Spring 1.3 以上,Spring Boot 版本 1.5 以上。
注意 mybatis-spring-boot-starter 是 MyBatis 官方開發(fā)的 Starter,而不是 Spring Boot 官方開發(fā)的啟動(dòng)包,其實(shí)是 MyBatis 看 Spring Boot 市場(chǎng)使用度非常高,因此主動(dòng)開發(fā)出 Starter 包進(jìn)行集成,但這一集成確實(shí)解決了很多問題,使用起來比以前簡單很多。mybatis-spring-boot-starter 主要提供了兩種解決方案,一種是簡化后的 XML 配置版,一種是使用注解解決一切問題。
MyBatis 以前只有 XML 配置這種使用的形式,到了后來注解使用特別廣泛,MyBatis 也順應(yīng)潮流提供了注解的支持,從這里可以看出 MyBatis 一直都跟隨著主流技術(shù)的變化來完善自己。接下來給大家介紹一下如何使用 XML 版本。
XML 版本保持映射文件的方式,最新版的使用主要體現(xiàn)在不需要實(shí)現(xiàn) Dao 的實(shí)現(xiàn)層,系統(tǒng)會(huì)自動(dòng)根據(jù)方法名在映射文件中找到對(duì)應(yīng)的 SQL。
初始化腳本
為了方便項(xiàng)目演示,需要在 test 倉庫創(chuàng)建 users 表,腳本如下:
DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵id', `userName` varchar(32) DEFAULT NULL COMMENT '用戶名', `passWord` varchar(32) DEFAULT NULL COMMENT '密碼', `user_sex` varchar(32) DEFAULT NULL, `nick_name` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
關(guān)鍵依賴包
當(dāng)然任何模式都需要首先引入 mybatis-spring-boot-starter 的 pom 文件,現(xiàn)在最新版本是 1.3.2。
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
application配置
application.properties 添加相關(guān)配置
mybatis.config-location=classpath:mybatis/mybatis-config.xml mybatis.mapper-locations=classpath:mybatis/mapper/*.xml mybatis.type-aliases-package=com.neo.model spring.datasource.url=jdbc:MySQL://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.config-location,配置 mybatis-config.xml 路徑,mybatis-config.xml 中配置 MyBatis 基礎(chǔ)屬性;
mybatis.mapper-locations,配置 Mapper 對(duì)應(yīng)的 XML 文件路徑;
mybatis.type-aliases-package,配置項(xiàng)目中實(shí)體類包路徑;
spring.datasource.*,數(shù)據(jù)源配置。
Spring Boot 啟動(dòng)時(shí)數(shù)據(jù)源會(huì)自動(dòng)注入到 SqlSessionFactory 中,使用 SqlSessionFactory 構(gòu)建 SqlSessionFactory,再自動(dòng)注入到 Mapper 中,最后我們直接使用 Mapper 即可。
啟動(dòng)類
在啟動(dòng)類中添加對(duì) Mapper 包掃描 @MapperScan,Spring Boot 啟動(dòng)的時(shí)候會(huì)自動(dòng)加載包路徑下的 Mapper。
@Spring BootApplication @MapperScan("com.neo.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
或者直接在 Mapper 類上面添加注解 @Mapper,建議使用上面那種,不然每個(gè) mapper 加個(gè)注解也挺麻煩的。
示例演示
MyBatis 公共屬性
mybatis-config.xml 主要配置常用的 typeAliases,設(shè)置類型別名,為 Java 類型設(shè)置一個(gè)短的名字。它只和 XML 配置有關(guān),存在的意義僅在于用來減少類完全限定名的冗余。
<configuration> <typeAliases> <typeAlias alias="Integer" type="java.lang.Integer" /> <typeAlias alias="Long" type="java.lang.Long" /> <typeAlias alias="HashMap" type="java.util.HashMap" /> <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" /> <typeAlias alias="ArrayList" type="java.util.ArrayList" /> <typeAlias alias="LinkedList" type="java.util.LinkedList" /> </typeAliases> </configuration>
resultType="Integer" //或者 parameterType="Long"
添加 User 的映射文件
<mapper namespace="com.neo.mapper.UserMapper" >
<resultMap id="BaseResultMap" type="com.neo.model.User" > <id column="id" property="id" jdbcType="BIGINT" /> <result column="userName" property="userName" jdbcType="VARCHAR" /> <result column="passWord" property="passWord" jdbcType="VARCHAR" /> <result column="user_sex" property="userSex" javaType="com.neo.enums.UserSexEnum"/> <result column="nick_name" property="nickName" jdbcType="VARCHAR" /></resultMap>
這里為了更好的貼近工作情況,將類的兩個(gè)字段和數(shù)據(jù)庫字段設(shè)置為不一致,其中一個(gè)使用了枚舉。使用枚舉有一個(gè)非常大的優(yōu)點(diǎn),插入此屬性的數(shù)據(jù)會(huì)自動(dòng)進(jìn)行校驗(yàn),如果不是枚舉的內(nèi)容會(huì)報(bào)錯(cuò)。
<select id="getAll" resultMap="BaseResultMap" > SELECT * FROM users </select>
第三步,寫具體的 SQL 語句,比如這樣:
第二步,配置表結(jié)構(gòu)和類的對(duì)應(yīng)關(guān)系:
第一步,指明對(duì)應(yīng)文件的 Mapper 類地址:
MyBatis XML 有一個(gè)特點(diǎn)是可以復(fù)用 XML,比如我們公用的一些 XML 片段可以提取出來,在其他 SQL 中去引用。例如:
<sql id="Base_Column_List" > id, userName, passWord, user_sex, nick_name </sql> <select id="getAll" resultMap="BaseResultMap" > SELECT <include refid="Base_Column_List" /> FROM users </select>
這個(gè)例子就是,上面定義了需要查詢的表字段,下面 SQL 使用 include 引入,避免了寫太多重復(fù)的配置內(nèi)容。
下面是常用的增、刪、改、查的例子:
<select id="getOne" parameterType="Long" resultMap="BaseResultMap" > SELECT <include refid="Base_Column_List" /> FROM users WHERE id = #{id} </select> <insert id="insert" parameterType="com.neo.model.User" > INSERT INTO users (userName,passWord,user_sex) VALUES (#{userName}, #{passWord}, #{userSex}) </insert> <update id="update" parameterType="com.neo.model.User" > UPDATE users SET <if test="userName != null">userName = #{userName},</if> <if test="passWord != null">passWord = #{passWord},</if> nick_name = #{nickName} WHERE id = #{id} </update> <delete id="delete" parameterType="Long" > DELETE FROM users WHERE id =#{id} </delete>
上面 update 的 SQL 使用了 if 標(biāo)簽,可以根據(jù)不同的條件生產(chǎn)動(dòng)態(tài) SQL,這就是 MyBatis 最大的特點(diǎn)。
編寫 Dao 層的代碼
public interface UserMapper { List<UserEntity> getAll(); UserEntity getOne(Long id); void insert(UserEntity user); void update(UserEntity user); void delete(Long id); }
注意:這里的方法名需要和 XML 配置中的 id 屬性一致,不然會(huì)找不到方法去對(duì)應(yīng)執(zhí)行的 SQL。
測(cè)試使用
按照 Spring 一貫使用形式,直接將對(duì)應(yīng)的 Mapper 注入即可。
@Resource private UserMapper userMapper;
如果使用的是 Idea,這塊的注解經(jīng)常會(huì)報(bào)“could not autowire”,Eclipse 卻沒有問題,其實(shí)代碼是正確的,這是 Idea 的誤報(bào)。可以選擇降低 Autowired 檢測(cè)的級(jí)別,不要提示就好。在 File | Settings | Editor | Inspections 選項(xiàng)中使用搜索功能找到 Autowiring for Bean Class,將 Severity 的級(jí)別由之前的 error 改成 warning 即可。
接下來直接使用 userMapper 進(jìn)行數(shù)據(jù)庫操作即可。
@Test public void testUser() { //增加 userMapper.insert(new User("aa", "a123456", UserSexEnum.MAN)); //刪除 int count=userMapper.delete(2l); User user = userMapper.getOne(1l); user.setNickName("smile"); //修改 userMapper.update(user); //查詢 List<User> users = userMapper.getAll(); }
分頁查詢
多條件分頁查詢是實(shí)際工作中最常使用的功能之一,MyBatis 特別擅長處理這類的問題。在實(shí)際工作中,會(huì)對(duì)分頁進(jìn)行簡單的封裝,方便前端使用。另外在 Web 開發(fā)規(guī)范使用中,Web 層的參數(shù)會(huì)以 param 為后綴的對(duì)象進(jìn)行傳參,以 result 結(jié)尾的實(shí)體類封裝返回的數(shù)據(jù)。
先定義一個(gè)分頁的基礎(chǔ)類(默認(rèn)每頁 3 條記錄,可以根據(jù)前端傳參進(jìn)行修改):
public class PageParam { private int beginLine; //起始行 private Integer pageSize = 3; private Integer currentPage=0; // 當(dāng)前頁 //getter setter省略 public int getBeginLine() { return pageSize*currentPage;//自動(dòng)計(jì)算起始行 } }
user 的查詢條件參數(shù)類繼承分頁基礎(chǔ)類:
public class UserParam extends PageParam{ private String userName; private String userSex; //getter setter省略 }
接下來配置具體的 SQL,先將查詢條件提取出來。
<sql id="Base_Where_List"> <if test="userName != null and userName != ''"> and userName = #{userName} </if> <if test="userSex != null and userSex != ''"> and user_sex = #{userSex} </if> </sql>
從對(duì)象 UserParam 中獲取分頁信息和查詢條件,最后進(jìn)行組合。
<select id="getList" resultMap="BaseResultMap" parameterType="com.neo.param.UserParam"> select <include refid="Base_Column_List" /> from users where 1=1 <include refid="Base_Where_List" /> order by id desc limit #{beginLine} , #{pageSize} </select>
前端需要展示總共的頁碼,因此需要統(tǒng)計(jì)出查詢結(jié)果的總數(shù)。
<select id="getCount" resultType="Integer" parameterType="com.neo.param.UserParam"> select count(1) from users where 1=1 <include refid="Base_Where_List" /> </select>
Mapper 中定義的兩個(gè)方法和配置文件相互對(duì)應(yīng)。
public interface UserMapper { List<UserEntity> getList(UserParam userParam); int getCount(UserParam userParam); }
具體使用:
@Test public void testPage() { UserParam userParam=new UserParam(); userParam.setUserSex("WOMAN"); userParam.setCurrentPage(1); List<UserEntity> users=userMapper.getList(userParam); long count=userMapper.getCount(userParam); Page page = new Page(userParam,count,users); System.out.println(page); }
在實(shí)際使用中,只需要傳入 CurrentPage 參數(shù)即可,默認(rèn) 0 就是第一頁,傳 1 就是第二頁的內(nèi)容,最后將結(jié)果封裝為 Page 返回給前端。
public class Page<E> implements Serializable { private int currentPage = 0; //當(dāng)前頁數(shù) private long totalPage; //總頁數(shù) private long totalNumber; //總記錄數(shù) private List<E> list; //數(shù)據(jù)集 }
Page 將分頁信息和數(shù)據(jù)信息進(jìn)行封裝,方便前端顯示第幾頁、總條數(shù)和數(shù)據(jù),這樣分頁功能就完成了。
配置文件
首先我們需要配置兩個(gè)不同的數(shù)據(jù)源,注意,需要提前在 test1 和 test2 庫中創(chuàng)建好 User 表結(jié)構(gòu)
mybatis.config-location=classpath:mybatis/mybatis-config.xml spring.datasource.one.jdbc-url=jdbc:mysql://localhost:3306/test1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.one.username=root spring.datasource.one.password=root spring.datasource.one.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.two.jdbc-url=jdbc:mysql://localhost:3306/test2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.two.username=root spring.datasource.two.password=root spring.datasource.two.driver-class-name=com.mysql.cj.jdbc.Driver
第一個(gè)數(shù)據(jù)源以 spring.datasource.one.* 為前綴連接數(shù)據(jù)庫 test1,第二個(gè)數(shù)據(jù)源以 spring.datasource.two.* 為前綴連接數(shù)據(jù)庫 test2。 第一個(gè)數(shù)據(jù)源以 spring.datasource.one.* 為前綴連接數(shù)據(jù)庫 test1,第二個(gè)數(shù)據(jù)源以 spring.datasource.two.* 為前綴連接數(shù)據(jù)庫 test2。
數(shù)據(jù)源配置
為兩個(gè)數(shù)據(jù)源創(chuàng)建不同的 Mapper 包路徑,將以前的 UserMapper 復(fù)制到包 com.neo.mapper.one 和 com.neo.mapper.two 路徑下,并且分別重命名為:User1Mapper、User2Mapper。
配置第一個(gè)數(shù)據(jù)源,新建 DataSource1Config,首先加載配置的數(shù)據(jù)源
@Bean(name = "oneDataSource") @ConfigurationProperties(prefix = "spring.datasource.one") @Primary public DataSource testDataSource() { return DataSourceBuilder.create().build(); }
根據(jù)創(chuàng)建的數(shù)據(jù)源,構(gòu)建對(duì)應(yīng)的 SqlSessionFactory。
@Bean(name = "oneSqlSessionFactory") @Primary public SqlSessionFactory testSqlSessionFactory(@Qualifier("oneDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/one/*.xml")); return bean.getObject(); }
代碼中需要指明加載的 Mapper xml 文件。
同時(shí)將數(shù)據(jù)源添加到事務(wù)中。
@Bean(name = "oneTransactionManager") @Primary public DataSourceTransactionManager testTransactionManager(@Qualifier("oneDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); }
接下來將上面創(chuàng)建的 SqlSessionFactory 注入,創(chuàng)建我們?cè)?Mapper 中需要使用的 SqlSessionTemplate。
@Bean(name = "oneSqlSessionTemplate") @Primary public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("oneSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); }
最后將上面創(chuàng)建的 SqlSessionTemplate 注入到對(duì)應(yīng)的 Mapper 包路徑下,這樣這個(gè)包下面的 Mapper 都會(huì)使用第一個(gè)數(shù)據(jù)源來進(jìn)行數(shù)據(jù)庫操作。
@Configuration @MapperScan(basePackages = "com.neo.mapper.one", sqlSessionTemplateRef = "oneSqlSessionTemplate") public class OneDataSourceConfig { ... }
basePackages 指明 Mapper 地址。
sqlSessionTemplateRef 指定 Mapper 路徑下注入的 sqlSessionTemplate。
第二個(gè)數(shù)據(jù)源配置
DataSource2Config 的配置和上面類似,方法上需要去掉 @Primary 注解,替換對(duì)應(yīng)的數(shù)據(jù)源和 Mapper 路徑即可。下面是 DataSource2Config 完整示例:
@Configuration @MapperScan(basePackages = "com.neo.mapper.two", sqlSessionTemplateRef = "twoSqlSessionTemplate") public class DataSource2Config { @Bean(name = "twoDataSource") @ConfigurationProperties(prefix = "spring.datasource.two") public DataSource testDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "twoSqlSessionFactory") public SqlSessionFactory testSqlSessionFactory(@Qualifier("twoDataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/two/*.xml")); return bean.getObject(); } @Bean(name = "twoTransactionManager") public DataSourceTransactionManager testTransactionManager(@Qualifier("twoDataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "twoSqlSessionTemplate") public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("twoSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
從上面的步驟我們可以總結(jié)出來,創(chuàng)建多數(shù)據(jù)源的過程就是:首先創(chuàng)建 DataSource,注入到 SqlSessionFactory 中,再創(chuàng)建事務(wù),將 SqlSessionFactory 注入到創(chuàng)建的 SqlSessionTemplate 中,最后將 SqlSessionTemplate 注入到對(duì)應(yīng)的 Mapper 包路徑下。其中需要指定分庫的 Mapper 包路徑。
注意,在多數(shù)據(jù)源的情況下,我們不需要在啟動(dòng)類添加 @MapperScan("com.xxx.mapper") 的注解。
這樣 MyBatis 多數(shù)據(jù)源的配置就完成了,如果有更多的數(shù)據(jù)源請(qǐng)參考第二個(gè)數(shù)據(jù)源的配置即可。
測(cè)試
配置好多數(shù)據(jù)源之后,在項(xiàng)目中想使用哪個(gè)數(shù)據(jù)源就把對(duì)應(yīng)數(shù)據(jù)源Mapper注入到類中使用即可。
@RunWith(SpringRunner.class) @SpringBootTest public class UserMapperTest { @Autowired private User1Mapper user1Mapper; @Autowired private User2Mapper user2Mapper; @Test public void testInsert() throws Exception { user1Mapper.insert(new User("aa111", "a123456", UserSexEnum.MAN)); user1Mapper.insert(new User("bb111", "b123456", UserSexEnum.WOMAN)); user2Mapper.insert(new User("cc222", "b123456", UserSexEnum.MAN)); } }
上面的測(cè)試類中注入了兩個(gè)不同的 Mapper,對(duì)應(yīng)了不同的數(shù)據(jù)源。在第一個(gè)數(shù)據(jù)源中插入了兩條數(shù)據(jù),第二個(gè)數(shù)據(jù)源中插入了一條信息,運(yùn)行測(cè)試方法后查看數(shù)據(jù)庫1有兩條數(shù)據(jù),數(shù)據(jù)庫2有一條數(shù)據(jù),證明多數(shù)據(jù)源測(cè)試成功。
介紹了 ORM 框架 和 MyBatis 框架相關(guān)概念介紹,以用戶數(shù)據(jù)為例演示了 MyBatis 的增、刪、改、查,以及分頁查詢、多數(shù)據(jù)源處理等常見場(chǎng)景。通過上面的示例可以發(fā)現(xiàn) MyBatis 將執(zhí)行 SQL 和代碼做了隔離,保證代碼處理和 SQL 的相對(duì)獨(dú)立,層級(jí)劃分比較清晰,MyBatis 對(duì)動(dòng)態(tài) SQL 支持非常友好,可以在 XML 文件中復(fù)用代碼高效編寫動(dòng)態(tài) SQL。
springboot一種全新的編程規(guī)范,其設(shè)計(jì)目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程,SpringBoot也是一個(gè)服務(wù)于框架的框架,服務(wù)范圍是簡化配置文件。
到此,相信大家對(duì)“SpringBoot集成怎么使用MyBatis配置XML文件”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
當(dāng)前文章:SpringBoot集成怎么使用MyBatis配置XML文件
鏈接URL:http://www.muchs.cn/article44/ihejhe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、、云服務(wù)器、虛擬主機(jī)、做網(wǎng)站、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)