天天看點

Spring Boot 整合 MyBatis 通用 Mapper(TkMybatis)

文章目錄

    • 1 概述
    • 2 基本使用
    • 3 自定義 XXXMapper.xml(非必須)
    • 4 代碼生成器

學習在 Spring Boot 中整合 MyBatis 通用 Mapper(TkMybatis)。通用 Mapper 是一個可以實作任意 MyBatis 通用方法的架構,項目提供了正常的增删改查操作以及 Example 相關的單表操作。通用 Mapper 是為了解決 MyBatis 使用中 90% 的基本操作,使用它可以很友善的進行開發,可以節省開發人員大量的時間。

1 概述

通用 Mapper 都可以極大的友善開發人員。可以随意的按照自己的需要選擇通用方法,還可以很友善的開發自己的通用方法。

極其友善的使用 MyBatis 單表的增删改查。

支援單表操作,不支援通用的多表聯合查詢。

使用通用 Mapper 可以無 xml 檔案實作資料庫操作,隻需要繼承 TkMybatis 中相關的 Mapper 接口即可。但如果有特殊需求,可以自定義 XXXMapper.xml 檔案,實作複雜 sql 語句的操作。

為什麼需要通用 Mapper ?

我個人最早用 MyBatis 時,先是完全手寫,然後用上了 MyBatis 代碼生成器(簡稱為 MBG),在使用 MBG 過程中,發現一個很麻煩的問題,如果資料庫字段變化很頻繁,就需要反複重新生成代碼,并且由于 MBG 覆寫生成代碼和追加方式生成 XML,導緻每次重新生成都需要大量的比對修改。除了這個問題外,還有一個問題,僅僅基礎的增删改查等方法,就已經産生了大量的 XML 内容,還沒有添加一個自己手寫的方法,代碼可能就已經幾百行了,内容多,看着比較礙事。

因為很多人都在使用 MBG,MBG 中定義了很多常用的單表方法,為了解決前面提到的問題,也為了相容 MBG 的方法避免項目重構太多,在 MBG 的基礎上結合了部分 JPA 注解産生了通用 Mapper。通用 Mapper 可以很簡單的讓你擷取基礎的單表方法,也很友善擴充通用方法。使用通用 Mapper 可以極大的提高你的工作效率。

說明:我們也可以改造 MBG ,比如自動生成一套基本的 model/mapper/service 等,與表對應,不去做修改,自定義的都寫在對應的另一個子類上,這樣,當表字段修改後,隻需全部重新生成上述基本的那些檔案,再手動修改自定義的檔案(如果有需要)即可。

2 基本使用

  1. 建立項目,引入依賴

建立 Spring Boot 項目

spring-boot-mybatis-tkmybatis

,添加

Web/MySQL Driver

依賴,如下:

Spring Boot 整合 MyBatis 通用 Mapper(TkMybatis)

之後手動在 pom 檔案中添加

Druid/Mapper

依賴(Spring Boot 版本),最終的依賴如下:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.10</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
        <version>5.1.27</version>
    </dependency>
    <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-spring-boot-starter</artifactId>
        <version>2.1.5</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>
           

接着在

application.properties

配置檔案中添加資料庫相關資訊的配置,如下:

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=000000
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/cxy35?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&autoReconnectForPools=true

logging.level.com.cxy35.sample.springboot.mybatis.tkmybatis.mapper=debug

# [Mybatis 通用 Mapper 代碼生成器](https://github.com/cxy35/generators/tree/master/generator-mapper)
           
  1. 建立實體類

手動建立或用代碼生成器生成

User

實體類,并增加相關注解,如下:

@Table(name = "t_user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "JDBC")
    private Integer id;
    private String username;
    private String password;
    private Boolean enabled;
    private Boolean locked;
    // @Column(name = "c_address")
    private String address;
    private String nickName;
    private Date createTime;
    private Date updateTime;

    // getter/setter
}
           

注解說明:

  • @Table

    :指定該實體類對應的表名,如果表名為 t_user ,類名為 TUser ,則可以不需要此注解(預設駝峰命名規則)。
  • @Column

    :指定該屬性對應的列名,如果列名為 create_time ,屬性名為 createTime ,則可以不需要此注解(預設駝峰命名規則)。
  • @Id

    :辨別該字段對應資料庫表的主鍵 id 。
  • @GeneratedValue

    :指定主鍵 id 生成規則,其中 strategy 表示使用資料庫自帶的主鍵生成政策, generator 配置為"JDBC",在資料插入完畢之後,會自動将主鍵id填充到實體類中,類似普通 mapper.xml 中配置的 selectKey 标簽。
  1. 建立 Mapper 接口
public interface UserMapper extends Mapper<User> {
}
           

這裡繼承 TkMybatis 中最基本的一個通用 Mapper 接口,這樣就自動擁有了這個 Mapper 中的一些接口,不用寫 XXXMapper.xml 檔案。

相關接口如下:

Spring Boot 整合 MyBatis 通用 Mapper(TkMybatis)

除了 Mapper 接口,官方還提供了一些幾個好用的通用 Mapper 接口,都可以用來繼承使用,彙總如下:

  • Mapper 接口:
Spring Boot 整合 MyBatis 通用 Mapper(TkMybatis)

IdsMapper 接口:

Spring Boot 整合 MyBatis 通用 Mapper(TkMybatis)

ConditionMapper 接口:

Spring Boot 整合 MyBatis 通用 Mapper(TkMybatis)
  • MySqlMapper 接口:
Spring Boot 整合 MyBatis 通用 Mapper(TkMybatis)
  • SqlServerMapper 接口:
Spring Boot 整合 MyBatis 通用 Mapper(TkMybatis)
當然,我們也可以根據自己的實際業務需求,抽取通用業務邏輯,自定義通用 Mapper 接口,參考:通用 Mapper 進階執行個體:為什麼好久都沒更新了? 。
  1. 配置 Mapper 接口的掃描

可以在啟動類上或自定義 MyBatis 的配置類上,通過

@MapperScan

注解配置。

@SpringBootApplication
@tk.mybatis.spring.annotation.MapperScan(basePackages = "com.cxy35.sample.springboot.mybatis.tkmybatis.mapper")
public class SpringBootMybatisTkmybatisApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootMybatisTkmybatisApplication.class, args);
    }

}
           
  1. 測試

在測試類中注入

UserMapper

完成測試,如下:

@SpringBootTest
class SpringBootMybatisTkmybatisApplicationTests {

    @Autowired
    UserMapper userMapper;

    @Test
    public void insertSelective() {
        User user = new User();
        user.setUsername("zhangsan");
        user.setPassword("123456");
        user.setAddress("杭州");
        user.setNickName("zs");
        user.setCreateTime(new Date());
        user.setUpdateTime(new Date());
        userMapper.insertSelective(user);
    }

    @Test
    public void deleteByPrimaryKey() {
        userMapper.deleteByPrimaryKey(2);
    }

    @Test
    public void updateByPrimaryKeySelective() {
        User user = new User();
        user.setId(2);
        user.setUsername("zhangsan2");
        user.setPassword("654321");
        user.setNickName("zs2");
        user.setAddress("上海");
        userMapper.updateByPrimaryKeySelective(user);
    }

    @Test
    public void selectByPrimaryKey() {
        User user = userMapper.selectByPrimaryKey(4);
        System.out.println(user);
    }

    @Test
    public void selectAll() {
        List<User> users = userMapper.selectAll();
        System.out.println(users);
    }

    @Test
    public void selectByExample() {
        Example example = new Example(User.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andLike("username", "zhangsan%");
        criteria.andEqualTo("address", "杭州");
        List<User> users = userMapper.selectByExample(example);
        System.out.println(users);
    }
}
           

3 自定義 XXXMapper.xml(非必須)

雖然大多數複雜的需求,都能通過 TkMyBatis 的組合完成操作。但如果有特殊需求,可以自定義 XXXMapper.xml 檔案,實作複雜 sql 語句的操作,這裡以聯表查詢為例。

UserMapper.java

所在包下建立

UserMapper.xml

,增加如下内容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 測試用,非必須 -->
<mapper namespace="com.cxy35.sample.springboot.mybatis.tkmybatis.mapper.UserMapper">
    <select id="selectByRoleId" parameterType="java.lang.Integer" resultType="com.cxy35.sample.springboot.mybatis.tkmybatis.pojo.User">
        SELECT
            u.*
        FROM
            t_user u
        INNER JOIN t_user_role ur ON u.id = ur.user_id
        WHERE
            ur.role_id = #{roleId, jdbcType=INTEGER};
    </select>
</mapper>
           

上述 xml 檔案與普通 xml 檔案的不同之處在于:這裡不需要使用 resultMap 進行字段的映射。當然,如果想在傳回的 Map 中新增傳回字段映射,直接添加新的字段即可。

注意:不要在 xml 檔案中寫 TkMyBatis 中已經有的一些基礎方法,否則會報錯,提示方法重複。

接着,修改 UserMapper.java ,增加對應的接口:

public interface UserMapper extends Mapper<User> {
    // 測試用,非必須
    List<User> selectByRoleId(Integer roleId);
}
           

上述 UserMapper.xml 放在 UserMapper.java 所在的包下面,會被自動掃描到。但在項目打包時會被忽略掉,是以需要在 pom.xml 中配置 Maven 建構時的資源路徑。

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
</build>
           

關于 XXXMapper.xml 檔案位置,還有其他方案,這裡不再贅述,具體可參考 Spring Boot 整合 MyBatis 。

最後在測試類中增加方法,完成測試:

@Test
public void selectByRoleId() {
    List<User> users = userMapper.selectByRoleId(2);
    System.out.println(users);
}
           

4 代碼生成器

  • Mybatis 通用 Mapper 代碼生成器
  • Spring Boot 教程合集(微信左下方閱讀全文可直達)。
  • Spring Boot 教程合集示例代碼:https://github.com/cxy35/spring-boot-samples
  • 本文示例代碼:https://github.com/cxy35/spring-boot-samples/tree/master/spring-boot-dao/spring-boot-mybatis-tkmybatis

掃碼關注微信公衆号 程式員35 ,擷取最新技術幹貨,暢聊 #程式員的35,35的程式員# 。獨立站點:https://cxy35.com

Spring Boot 整合 MyBatis 通用 Mapper(TkMybatis)

繼續閱讀