目录
一、通用枚举(不常用)
表中的有些字段值是固定的,例如性别(男或女),此时我们可以使用MyBatis-Plus的通用枚举来实现。
1、创建通用枚举类型
创建枚举类如下:
java
package com.qcby.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
public enum SexEnum {
MALE(1, "男"),
FEMALE(2, "女");
@EnumValue
private Integer sex;
private String sexName;
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getSexName() {
return sexName;
}
public void setSexName(String sexName) {
this.sexName = sexName;
}
SexEnum(Integer sex, String sexName) {
this.sex = sex;
this.sexName = sexName;
}
}
2、配置扫描通用枚举

xml
mybatis-plus:
global-config:
db-config:
id-type: auto
type-enums-package: com.qcby.enums
mapper-locations: classpath*:com/qcby/mapper/*.xml
type-aliases-package: com.qcby.entity
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3、测试
测试方法如下:
java
@Test
public void testSexEnum(){
User user = new User();
user.setName("Enum");
user.setAge(20);
//设置性别信息为枚举项,会将@EnumValue注解所标识的属性值存储到数据库
user.setSex(SexEnum.MALE);
//INSERT INTO t_user ( username, age, sex ) VALUES ( ?, ?, ? ) //Parameters: Enum(String), 20(Integer), 1(Integer)
userService.save( user);
}

实体类定义如下:
java
@Data
@AllArgsConstructor
@NoArgsConstructor
//@TableName("t_user")
public class User {
@TableId(value = "id",type = IdType.AUTO)
private Long uid;
private String name;
private Integer age;
private String email;
// @TableLogic
@TableField("isDelete")
private Integer isDelete;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date createTime;
private SexEnum sex;
}
其中sex的属性名是SexEnum,不是泛型的Enum,才可以实现。
二、代码生成器
1、引入依赖
我们需要引入代码生成器的相关依赖如下:
xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
2、快速生成文件类
我们需要定义一个快速生成文件的类,用于实现代码生成器。
代码生成器类定义如下:
java
public class FastAutoGeneratorTest {
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/mybatis_plus? characterEncoding=utf-8&userSSL=false", "root", "12171032Aa")
.globalConfig(builder -> {
builder.author("qcby") // 设置作者
//.enableSwagger() // 开启 swagger 模式 .fileOverride() // 覆盖已生成文件
.outputDir("D://mybatis_plus"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.qcby") // 设置父包名
.moduleName("mybatisplus") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://mybatis_plus"));
// 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude("user"); // 设置需要生成的表名
// .addTablePrefix("t_", "c_"); // 设置过滤表前缀
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker 引擎模板,默认的是Velocity引擎模板
.execute();
}
}
运行结果如下:


生成相对应的三层架构的框架,mapper继承了BaseMapper,service层继承了Iservice等。
三、多数据源配置
适用于多种场景:纯粹多库、读写分离、 一主多从、混合模式等
目前我们就来模拟一个纯粹多库的一个场景,其他场景类似
场景说明:
我们创建两个库,分别为: mybatis_plus(以前的库不动)与mybatis_plus_1 (新建),将mybatis_plus库的product表移动到mybatis_plus_1库,这样每个库一张表,通过一个测试用例 分别获取用户数据与商品数据,如果获取到说明多库模拟成功。
1、创建数据库及表
sql
CREATE DATABASE `mybatis_plus_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use `mybatis_plus_1`;
CREATE TABLE product
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称 ',
price INT(11) DEFAULT 0 COMMENT '价格 ',
version INT(11) DEFAULT 0 COMMENT '乐观锁版本号 ',
PRIMARY KEY (id)
);
并且我们需要引入下面的相关依赖:
xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.0</version>
</dependency>
2、配置多数据源
单一数据源的配置文件如下:
xml
spring:
datasource:
# 配置数据源类型
type: com.zaxxer.hikari.HikariDataSource
# 配置连接数据库信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
username: root
password: 12171032Aa
多数据源的配置文件如下:
xml
spring:
datasource:
dynamic:
# 设置默认的数据源或者数据源组 ,默认值即为master
primary: master
# 严格匹配数据源 ,默认false.true未匹配到指定数据源时抛异常 ,false使用默认数据源
strict: false
datasource:
master:
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 12171032Aa
slave:
url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 12171032Aa
单一数据源需要在spring.datasource下面配置路径、账号、密码之类的。
多数据源需要在spring.datasource.dynamic中配置多个数据源,每个数据源都可以是不同的数据库类型和数据库。
3、测试多数据源实例
创建User和Product的实体类、业务层等文件,如下:
java
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
public interface ProductService extends IService<Product> {
}
public interface UserService extends IService<User> {
}
测试方法定义如下:
java
@SpringBootTest
public class UserProductTest {
@Autowired
private UserService userService;
@Autowired
private ProductService productService;
@Test
public void testGetByIdUser(){
System.out.println(userService.getById(1));
}
@Test
public void testGetByIdProduct(){
System.out.println(productService.getById(1));
}
}
当没有使用@DS注解时,所有数据库源都会指向application.yml中的 primary: master字段。
如果想要改变数据源的来源,需要在service层中使用@DS注解进行修改。


我们修改一下,让User的实体类中的数据从mybatis_plus_1中查找,而不是mybatis_plus中查找。
UserServiceImpl修改如下:
java
@DS("slave")
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
其中添加了@DS("slave")。
我们再一次执行测试方法:

我们可以看到其数据源发生了改变,所以@DS注解时可以改变数据源的位置。