Spring Boot —— 整合 MyBatis-Plus

试试手气發表於2024-05-20

專案基於 Spring Boot 3.2.5

Pom

需要注意的是,引用 Mybatis-Plus 依賴,無需手動引入 Mybatis

<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.4.0</version>
</dependency>

<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>3.5.6</version>
</dependency>

<!-- mybatis-plus-generator -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.6</version>
</dependency>

<!-- mybatis-plus 自動生成時使用的模板-->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>

application.yml

spring:
  profiles:
    active: develop

application-develop.yml

mybatis-plus:
  # mybatis xml 檔案的儲存路徑,classpath 表示 java 或 resources 目錄,因此當前設定表示 resources/mapper/任意子目錄/*Mapper.xml 檔案都會被掃描
  mapper-locations: classpath:mapper/**/*Mapper.xml
  # 表示實體物件所在的名稱空間
  type-aliases-package: com.cash216.mango.*.entity
  # mybatis-plus 配置檔案,可選
  # config-location: classpath: config/MyBatisConfig.xml
  configuration:
    # 日誌輸出方式
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      # 邏輯刪除配置
      logic-delete-value: 1
      logic-not-delete-value: 0
      logic-delete-field: del_flag

自動生成Service、Model(Entity)、Mapper

引入mybatis-plus-generator可用於基於資料庫自動生成各層檔案,基本步驟如下:

  • 引入依賴
  • 配置資料連線
  • 編寫自動生成執行程式碼
  • 完善自動生成檔案業務邏輯

引入依賴

在 pom 節已列舉,不再重複

配置資料連線

application-develop.yml為例

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.driver
	url: jdcb:mysql://127.0.0.1:3306/{database}?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true
	username: root
	password: 123456

實際這一步不影響自動生成,因為在編寫自動生成執行程式碼時還需要設定

編寫自動生成檔案的執行程式碼

新建java檔案如CodeGenerator.java,編寫程式碼如下:

package com.cash216.mangoAdmin.codegenerator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class CodeGenerator {

    private static final String databaseUrl = "jdbc:mysql://127.0.0.1:3306/{database}?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&autoReconnect=true";
    private static final String databaseUser = "root";
    private static final String databasePassword = "123456";

    public static String scanner(String tip){
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("請輸入").append(tip).append(":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (ipt != null && !ipt.isEmpty()) {
                return ipt;
            }
        }
        throw new MybatisPlusException(STR."請輸入正確的\{tip}");
    }

    public static void main(String[] args){
		// 本例使用 Mybatis-plus 互動式生成方式,會詢問作者、包名、表名後自動生成各層目錄及檔案
        FastAutoGenerator.create(databaseUrl, databaseUser, databasePassword)
                .globalConfig((scanner, builder)->
                        builder.author(scanner.apply("請輸入作者名稱"))
                                .commentDate("yyyy-MM-dd")
								// System.getProperty("user.dir") 表示整個專案的根目錄
                                .outputDir(System.getProperty("user.dir") + "/mango-admin/src/main/java"))
                .packageConfig((scanner, builder)-> builder.parent(scanner.apply("請輸入包名")))
                .strategyConfig((scanner, builder)-> builder.addInclude(getTables(scanner.apply("請輸入表名,多個英文逗號分隔,所有輸入 all")))
                        .entityBuilder()
                        .enableLombok()
                        .addTableFills(new Column("create_time", FieldFill.INSERT))
                        .build())
                .execute();
    }

    protected static List<String> getTables(String tables){
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }
}

執行main方法,在控制檯會以互動方式詢問作者、包名、表名後生成檔案,需要注意的是,在本例中,使用outputDir(System.getProperty("user.dir") + "/mango-admin/src/main/java")控制生成檔案的輸出目錄,user.dir返回當前工作目錄在本例執行時就是整個專案的根目錄, 生成後的效果如圖
image
image
image
image

完善業務程式碼

本來*Mapper.xml檔案是生成在mapper/xml目錄下的,在本例中是後移動到resources/mapper/system中,當然也可以不移動,配置檔案中mapper-locations: classpath:mapper/**/*Mapper.xml可以找到。
另外,自動生成的Mapper介面需要增加依賴注入被SpringBoot管理,方法(至少)有兩種,第一種在Mapper介面檔案上增加@Mapper註解,這種方式如果介面檔案很多會不方便容易遺漏,第二種增加一個配置類,使用@MapperScan指定要掃描的包下的Mapper介面,程式碼如下:

@Configuration
@MapperScan("com.cash216.mango.admin.mapper")
public class MyBatisConfig {
}

主要是@MapperScan起作用,MyBatisConfig類中甚至可以是空的

使用

不知道是本來就這樣還是我使用有問題,生成的所有檔案,除了實體物件外,其他檔案裡邊都是空的

Mybatis-plus 自帶一些通用介面方法,可直接呼叫,比如根據Id查詢記錄

public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService {
	@Override
	public SysUser findById(Long id){
		return baseMapper.selectById(id);
	}
}

Mybatis-plus 沒有的方法需自行新增實現,需要新增Mapper.xml、Mapper介面檔案、IService、ServiceImpl、Controller,在這裡只列出ServiceImpl中的程式碼為例

public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService {
	@Override
	public SysUser findById(Long id){
		return baseMapper.selectById(id);
	}
	
	@Override
	public SysUser findByName(String name){
		return baseMapper.selectOne(new QueryWrapper<SysUser>().eq("name", name));
	}
}

相關文章