惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
WordPress大学
WordPress大学
U
Unit 42
I
InfoQ
A
About on SuperTechFans
宝玉的分享
宝玉的分享
J
Java Code Geeks
博客园 - 司徒正美
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
G
Google Developers Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
Microsoft Security Blog
Microsoft Security Blog
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
腾讯CDC
Recent Announcements
Recent Announcements

博客园 - 试试手气

Web Worker 入门 若依Ruoyi分离版替换 MyBatis-Plus 若依前端菜单管理中路由地址、组件路径、权限字符的使用 Idea clone 项目推送到自有仓库 Spring Boot —— Spring Security Spring Boot —— 集成文档工具 Spring Boot —— Filter 过滤器 Spring Boot —— Cors 跨域 Spring Boot —— 集成 Druid Spring Boot —— 集成 Springdoc Navicat 使用笔记 Datagrip连接SQLServer失败 Asp.net mvc 笔记 Asp.net Core 笔记 mybatis 笔记 SQLServer 笔记 Asp.net Core 全局异常处理 SqlSugar 实践笔记 Asp.net Core 基于Cookie的身份认证
Spring Boot —— 集成 MyBatis-Plus
试试手气 · 2024-05-20 · via 博客园 - 试试手气

项目基于 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));
	}
}