说明

  • 若依单体版本,默认Mybatis,升级为 Mybatis-plus
  • 代码生成器模板中改为 Mybatis-plus 代码
  • 添加 mybatis-plus 库
  • 添加 dynamic-datasource 库
  • 添加 hutool 库
  • 添加 lombok 库

步骤

1. 项目根目录 pom.xml 添加依赖

  • properties 添加版本信息

    1
    2
    3
    4
    5
    6
    7
    <!--新增-开始-->
    <mybatis-plus.version>3.5.4</mybatis-plus.version>
    <dynamic-datasource.version>3.5.2</dynamic-datasource.version>
    <hutool.version>5.8.23</hutool.version>
    <lombok.version>1.18.16</lombok.version>
    <knife4j-spring-boot-starter.version>3.0.3</knife4j-spring-boot-starter.version>
    <!--新增-结束-->
  • dependencyManagement 添加依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <!-- mybatis-plus -->
    <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${mybatis-plus.version}</version>
    </dependency>

    <!-- 动态数据源 -->
    <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>${dynamic-datasource.version}</version>
    </dependency>

    <dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>${hutool.version}</version>
    </dependency>

    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
    </dependency>

    <!-- knife4j -->
    <dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>${knife4j-spring-boot-starter.version}</version>
    </dependency>

2. ruoyi-common 模块 pom.xml 添加依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>

<!-- 动态数据源 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

<!-- knife4j -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
</dependency>

3. application.yml 配置文件中Mybatis 配置改为 Mybatis-plus

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# MyBatis-plus配置
mybatis-plus:
# 指定 MyBatis 别名包扫描路径,用于给包中的类注册别名。注册后,在 Mapper 对应的 XML 文件中可以直接使用类名,无需使用全限定类名
typeAliasesPackage: com.ruoyi.**.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
global-config:
db-config:
# IdType.ASSIGN_ID:自动分配 ID,适用于 Long、Integer、String 类型的主键。默认使用雪花算法通过 IdentifierGenerator 的 nextId 实现。@since 3.3.0
id-type: ASSIGN_ID
# 逻辑已删除值,仅在逻辑删除功能打开时有效
logic-delete-value: 1
# 逻辑未删除值,仅在逻辑删除功能打开时有效
logic-not-delete-value: 0
# 全局参数
configuration:
# 使用驼峰命名法转换字段。如果您的数据库命名符合规则,无需使用 @TableField 注解指定数据库字段名
map-underscore-to-camel-case: true
# Mapper接口的方法与 SQL 映射语句的对应规则。
#partial表示支持部分映射,即只处理名字完全相同的方法和SQL。
auto-mapping-behavior: partial
# 是否开启 MyBatis 二级缓存
cache-enabled: true
# 配置默认的执行器(SIMPLE、REUSE、BATCH)
executor-type: SIMPLE
# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4. 模板修改

5. MybatisPlusConfig.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.ruoyi.framework.config;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* @author yanfei
* @description MybatisPlus
* @date 2023/12/21
*/
@Configuration
@MapperScan(value = {"com.ruoyi.**.mapper"})
public class MybatisPlusConfig {
@Bean("metaObjectHandler")
public MybatisPlusMetaObjectHandler metaObjectHandler() {
return new MybatisPlusMetaObjectHandler();
}
}

6. MybatisPlusMetaObjectHandler.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.ruoyi.framework.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import org.apache.ibatis.reflection.MetaObject;

import java.util.Date;

public class MybatisPlusMetaObjectHandler implements MetaObjectHandler {

/**
* 获取当前操作人的用户名
*
* @return
*/
private static String getUserName() {
String username = null;
try {
username = SecurityUtils.getUsername();
} catch (Exception e) {
//获取用户信息异常!
}
return username;
}

@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
String userName = getUserName();
if (StringUtils.isNotEmpty(userName)) {
this.strictInsertFill(metaObject, "createBy", String.class, userName);
}
}

@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
String userName = getUserName();
if (StringUtils.isNotEmpty(userName)) {
this.strictUpdateFill(metaObject, "updateBy", String.class, userName);
}
}
}

7. ResourcesConfig.java 新增

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
/** 本地文件上传路径 */
registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**")
.addResourceLocations("file:" + RuoYiConfig.getProfile() + "/");

// 新增
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}

/** 新增
* 方案一: 默认访问根路径跳转 doc.html页面 (swagger文档页面)
* 方案二: 访问根路径改成跳转 index.html页面 (简化部署方案: 可以把前端打包直接放到项目的 webapp,上面的配置)
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("doc.html");
}

/** 新增
* 将Long类型的id字段转换为String类型
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
/**
* 序列换成json时,将所有的long变成string
* 因为js中得数字类型不能包含所有的java long值
*/
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
jackson2HttpMessageConverter.setObjectMapper(objectMapper);
converters.add(0, jackson2HttpMessageConverter);
}