Spring Boot使用MyBatis Generator、Swagger

煙花易冷人憔悴發表於2019-07-04

        MyBatis是Java目前主流的ORM框架,在Spring Boot中使用MyBatis可以參考這篇文章:http://www.ityouknow.com/springboot/2016/11/06/spring-boot-mybatis.html

        這篇文章來將介紹MyBatis Generator,(簡稱MBG,下文使用這個簡稱),該外掛可以很方便的生成實體類、Mapper介面程式碼等,提高開發效率,它有點像.NET的EF框架中的DB First。另外,順便介紹Spring Boot如何整合Swagger。


一、新增pom配置

(1)既然是像EF的DB First,那需要先建好資料庫,可以先在MySQL中執行以下SQL指令碼:

create database generatortest default character set utf8mb4 collate utf8mb4_unicode_ci;
use generatortest;
create user 'generatortest'@'localhost' identified by 'generatortest123';
grant all privileges on generatortest.* to 'generatortest'@'localhost';
flush privileges;

CREATE TABLE `user`
(
  id INT NOT NULL AUTO_INCREMENT COMMENT '使用者ID',
  user_name VARCHAR(50) NOT NULL COMMENT '使用者名稱',
  `password` VARCHAR(50) NOT NULL COMMENT '密碼',
  email VARCHAR(50) COMMENT '郵箱',
  avatar VARCHAR(255) COMMENT '頭像',
  create_time DATETIME NOT NULL COMMENT '建立時間',
    update_time DATETIME NOT NULL COMMENT '更新時間',
    deleted TINYINT(1) default 0 COMMENT '邏輯刪除',
  PRIMARY KEY (id)
);
ALTER TABLE `user` COMMENT '使用者表';

CREATE TABLE role
(
  id INT NOT NULL AUTO_INCREMENT COMMENT '角色ID',
  role_name VARCHAR(50) NOT NULL COMMENT '角色名',
  enabled TINYINT(1) default 1 NOT NULL COMMENT '有效標誌',
  create_time DATETIME NOT NULL COMMENT '建立時間',
    update_time DATETIME NOT NULL COMMENT '更新時間',
    deleted TINYINT(1) default 0 NOT NULL COMMENT '邏輯刪除',
  PRIMARY KEY (id)
);
ALTER TABLE role COMMENT '角色表';

CREATE TABLE permission
(
  id INT NOT NULL AUTO_INCREMENT COMMENT '許可權ID',
  permission_name VARCHAR(50) NOT NULL COMMENT '許可權名稱',
  permission_value VARCHAR(200) NOT NULL COMMENT '許可權值',
  PRIMARY KEY (id)
);
ALTER TABLE permission COMMENT '許可權表';

CREATE TABLE user_role
(
  user_id INT NOT NULL COMMENT '使用者ID',
  role_id INT NOT NULL COMMENT '角色ID'
);
ALTER TABLE user_role COMMENT '使用者角色關聯表';

CREATE TABLE role_permission
(
  role_id INT NOT NULL COMMENT '角色ID',
  permission_id INT NOT NULL COMMENT '許可權ID'
);
ALTER TABLE role_permission COMMENT '角色許可權關聯表';
View Code

 

(2)新建Maven專案,還不知道怎麼用VS Code建Maven專案的可以參考這篇文章

 

(3)新增相關Maven檔案:

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>

 

二、新增MyBatis Generator配置檔案 

(1)在application.properties檔案中新增MySQL資料連線配置:

spring.datasource.url=jdbc:mysql://localhost:3306/generatortest?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=generatortest
spring.datasource.password=generatortest123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

 

(2)在src\main\resources目錄下新建generatorConfig.xml配置檔案,新增如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <properties resource="application.properties"/>
    <context id="MySqlContext" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <!-- 當表名或者欄位名為SQL關鍵字的時候,可以設定該屬性為true,MBG會自動給表名或欄位名新增**分隔符**。預設值為false -->
        <property name="autoDelimitKeywords" value="true"/>
        <!--可以使用``包括欄位名,避免欄位名與sql保留字衝突報錯,預設值為雙引號"""-->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <!-- 自動生成toString方法 -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
        <!-- 為模型生成序列化方法-->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!--<property name="suppressAllComments" value="true"/>-->
        </commentGenerator>
               <jdbcConnection driverClass="${spring.datasource.driver-class-name}"
                        connectionURL="${spring.datasource.url}"
                        userId="${spring.datasource.username}"
                        password="${spring.datasource.password}">
            <!--解決mysql驅動升級到8.0後不生成指定資料庫程式碼的問題-->
            <property name="nullCatalogMeansCurrent" value="true" />
        </jdbcConnection>
        <javaTypeResolver>
            <property name="useJSR310Types" value="true"/>
        </javaTypeResolver>
        <javaModelGenerator targetPackage="com.example.demo.model" targetProject="src/main/java"/>
        <javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.demo.mapper" targetProject="src/main/java" />
        <!-- 生成所有表 -->
        <table tableName="%" >
            <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
        </table>
    </context>
</generatorConfiguration>

接下來分析generatorConfig.xml配置:

<properties> 元素

非必選元素,用於指定一個需要在配置中解析使用的外部屬性檔案。這裡引入application.properties配置檔案,下文<jdbcConnection> 元素用到;

 

<context > 元素

必選元素,可以有多個,用必選屬性id區分;

targetRuntime屬性:預設值為MyBatis3;

MyBatis3:MBG將生成與MyBatis 3.0及以上版本相容的物件,以及與JSE 5.0及以上版本相容的物件。同時生成“by example”方法,用於構建動態where字句;

MyBatis3Simple:比MyBatis3少生成“by example”方法;

defaultModelType屬性:值為flat時,每一張表只生成一個實體類,這個實體類包含表中的所有欄位;

 

<property> 元素

非必選元素,以下三個屬性設定是針對MySQL資料庫的:

        <!-- 當表名或者欄位名為SQL關鍵字的時候,可以設定該屬性為true,MBG會自動給表名或欄位名新增**分隔符**。預設值為false -->

        <property name="autoDelimitKeywords" value="true"/>

        <!--可以使用``包括欄位名,避免欄位名與sql保留字衝突報錯,預設值為雙引號"""-->

        <property name="beginningDelimiter" value="`"/>

        <property name="endingDelimiter" value="`"/>

假設在Mysql資料庫中有一個表名為user detail,中間是一個空格,這種情況下如果寫出select * from user detail這樣的語句,是會報錯的;

Mysql中,一般會寫成樣子:select * from `user detail ` 

以上三個配置屬性就是當表名或者欄位名為SQL關鍵字時,自動加 ` 前後分隔符;

 

<plugin> 元素

非必選元素,用來定義一個外掛。外掛用於擴充套件或修改MBG程式碼生成器生成的程式碼;

 

<commentGenerator> 元素

非必選元素,最多配置一個;

suppressAllComments屬性:值為true時,阻止生成註釋,預設為false;

suppressDate屬性:值為true時,阻止生成包含時間戳的註釋,預設為false;

 

<jdbcConnection> 元素

必選元素,且只能有一個,用於指定資料庫連線資訊;

driverClass:必選屬性,訪問資料庫的JDBC驅動程式的完全限定類名;

connectionURL:必選屬性,訪問資料庫的JDBC連線URL;

userId:非必選屬性,訪問資料庫的使用者ID;

Password:非必選屬性,訪問資料庫的密碼;

 

<javaTypeResolver> 元素

非必選元素,最多配置一個,用於指定JDBC型別和Java型別如何轉換;

useJSR310Types:當值為true時,會進行如下轉換,其中java.time.LocalDateTime和.NET中的DateTime最為相似;

JDBC Type

Resolved Java Type

DATE

java.time.LocalDate

TIME

java.time.LocalTime

TIMESTAMP

java.time.LocalDateTime

 

<javaModelGenerator> 元素

必選元素,而且最多一個,用於控制生成的實體類;

targetPackage:必選屬性,生成實體類存放的包名;

targetProject:必選屬性,指定targetPackage路徑,可以是絕對路徑或相對路徑;

 

<javaClientGenerator> 元素

非必選元素,最多配置一個,用於生成Mapper介面程式碼,不配置就不生成;

Type=” ANNOTATEDMAPPER”:生成基於註解的Mapper介面,不會有對應的XML對映檔案;

Type=” XMLMAPPER”:所有的方法都在XML中,介面呼叫依賴XML檔案;

targetPackage:必選屬性,生成Mapper介面程式碼存放的包名;

targetProject:必選屬性,指定targetPackage路徑,可以是絕對路徑或相對路徑;

 

<table> 元素

必選元素,可以有多個,tableName="%"時生成所有表;

子元素<generatedKey>,可選元素,最多一個,用於指定自動生成主鍵的屬性;

Column:必選屬性,生成列的列名;

sqlStatement:必選屬性,使用一個預定義的的值返回新的SQL語句;

Identity:可選屬性,是否為唯一標誌列,預設為false;

 


 

三、執行MBG

(1)在專案中建立Generator類,新增一個main方法,寫上如下程式碼:

public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(
            Generator.class.getResourceAsStream("/generatorConfig.xml"));
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
}

 

(2)點選Run,可以看到生成的實體類和Mapper介面程式碼

 

生成程式碼結構


 

四、使用MBG生成的程式碼

(1)pom.xml中新增如下配置,然後儲存;

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

 

(2)編寫控制器程式碼,呼叫MBG生成的Mapper介面程式碼

@RestController
public class UserController {
    
    @Autowired
    private UserMapper userMapper;
    
    @RequestMapping(value = "/getUsers", method=RequestMethod.GET)
    public List<User> getUsers() {
        List<User> users=userMapper.selectAll();
        return users;
    }
    
    @RequestMapping(value = "/getUser", method=RequestMethod.GET)
    public User getUser(Integer id) {
        User user=userMapper.selectByPrimaryKey(id);
        return user;
    }
    
    @RequestMapping(value = "/add", method=RequestMethod.POST)
    public void save(User user) {
        if(user.getCreateTime()==null)
        user.setCreateTime(LocalDateTime.now(Clock.system(ZoneId.of("Asia/Shanghai"))));
        if(user.getUpdateTime() == null)
        user.setUpdateTime(LocalDateTime.now(Clock.system(ZoneId.of("Asia/Shanghai"))));
        userMapper.insert(user);
    }
    
    @RequestMapping(value = "update", method=RequestMethod.PUT)
    public void update(User user) {
        userMapper.updateByPrimaryKey(user);
    }
    
    @RequestMapping(value = "/delete/{id}", method=RequestMethod.DELETE)
    public void delete(@PathVariable("id") Integer id) {
        userMapper.deleteByPrimaryKey(id);
    }
}

其中UserMapper通過註解@Autowired注入進來。

 

(3)在application.properties配置檔案中加上:

mybatis.type-aliases-package=com.example.demo.model

 

(4)在啟動類中新增對 mapper 包掃描@MapperScan


 

 

五、Spring Boot中整合Swagger,方便介面呼叫

(1)pom.xml中新增支援swagger的模組,然後儲存。

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

 

(2)新增SwaggerConfig配置檔案:

public class SwaggerConfig {
     
    @Bean
    public Docket swaggerSpringMvcPlugin() {
        return new Docket(DocumentationType.SWAGGER_2).select()
        .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)).build();
    }
}

 

(3)為每個介面新增@ApiOperation註解,如下:

@ApiOperation(value = "獲取所有使用者資訊" ,  notes = "返回所有使用者資訊")

最後執行程式,瀏覽器開啟:http://localhost:8080/swagger-ui.html


 

原始碼地址:https://github.com/Bingjian-Zhu/MybatisGeneatorDemo.git

 

相關文章