SpringBoot集成怎么使用MyBatis配置XML文件

本篇內(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

一、ORM框架

對(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介紹

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的工作流如下:

SpringBoot集成怎么使用MyBatis配置XML文件

  • 首先加載 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

  1. 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。

四、MyBatis單數(shù)據(jù)源操作

  1. 初始化腳本

  • 為了方便項(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;
  1. 關(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>
  1. 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 即可。

  1. 啟動(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è)注解也挺麻煩的。

  1. 示例演示

  • 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。

  1. 測(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 即可。 SpringBoot集成怎么使用MyBatis配置XML文件

  • 接下來直接使用 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();
}
  1. 分頁查詢

多條件分頁查詢是實(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ù),這樣分頁功能就完成了。

五、MyBatis多數(shù)據(jù)源操作

  1. 配置文件

  • 首先我們需要配置兩個(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。

  1. 數(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。

  1. 第二個(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ù)源的配置即可。

  1. 測(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è)試成功。

六、總結(jié)

介紹了 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是什么

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)

綿陽服務(wù)器托管