文章目录
mybatisPlus 常见用法
一、自动填充
1.1 处理类
@Slf4j
@Component // 不使用@Component,也可在 config 中,将该类注册为 Bean
public class AutoFillHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("created log");
String username = "测试";
// createBy 为 当前用户名
this.setFieldValByName("createdBy", username, metaObject);
// createTime 为 当前时间
this.strictInsertFill(metaObject, "createdTime", LocalDateTime::now, LocalDateTime.class); // 起始版本 3.3.3(推荐)
// updateBy 为 当前用户名
this.setFieldValByName("updatedBy", username, metaObject);
// updateTime 为 当前时间
this.strictInsertFill(metaObject, "updatedTime", LocalDateTime::now, LocalDateTime.class); // 起始版本 3.3.3(推荐)
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("updated log");
String username = "测试";
// updateBy 为 当前用户名
this.setFieldValByName("updatedBy", username, metaObject);
// updateTime 为 当前时间
this.strictUpdateFill(metaObject, "updatedTime", LocalDateTime::now, LocalDateTime.class); // 起始版本 3.3.3(推荐)
}
}
1.2 自动填充抽象类
@Data
public abstract class BaseEntity implements Serializable {
// 创建人
@TableField(fill = FieldFill.INSERT)
private String createdBy;
// 创建时间
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createdTime;
// 更新人
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updatedBy;
// 更新时间
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedTime;
}
二、枚举
1.1 注解方式
枚举类
@Getter @AllArgsConstructor public enum GradeEnum{ UNKNOWN(0, "未知"), SECONDARY(2, "中学"), PRIMARY(1, "小学"), HIGH(3, "高中"); @EnumValue private final Integer code; @JsonValue private final String name; }
使用
@Data @EqualsAndHashCode(callSuper = false) @TableName("t_product") public class Product extends BaseEntity { @TableId(type = IdType.AUTO) private Integer id; private GradeEnum grade; }
1.2 实现接口方式
枚举类
@AllArgsConstructor public enum SexEnum implements IEnum<Integer> { MALE(0,"男"), FEMALE(1,"女"); private final int value; @JsonValue private final String label; @Override public Integer getValue() { return this.value; } }
使用
@Data @TableName("t_student") public class Student { @TableId(type = IdType.AUTO) private Integer id; private SexEnum sex; }
三、分页
3.1 配置 config
@Configuration
public class PageConfig {
/**
* 分页插件
* @return
*/
@Bean
@Primary
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
3.2 定义统一分页接口
public interface AppPage<T> {
/**
* 当前页页码
*/
long getPageNum();
/**
* 每页条数
*/
long getPageSize();
/**
* 总条数
*/
long getTotal();
/**
* 总页数
*/
long getTotalPages();
/**
* 分页对象记录
*/
List<T> getItems();
}
3.3 实现分页接口
@AllArgsConstructor
public class MybatisPageImpl<T> implements AppPage<T> {
private IPage<T> iPage;
@Override
public long getPageNum() {
return iPage.getCurrent();
}
@Override
public long getPageSize() {
return iPage.getSize();
}
@Override
public long getTotal() {
return iPage.getTotal();
}
@Override
public long getTotalPages() {
return iPage.getPages();
}
@Override
public List<T> getItems() {
return iPage.getRecords();
}
}
3.4 使用
- 直接使用 Mapper
@RestController
public class ProductController {
@Autowired
private ProductMapper productMapper;
@Autowired
private ProductService productService;
@GetMapping("page")
public MybatisPageImpl<Product> page() {
Page<Product> productPage = new Page<>(1, 2);
IPage<Product> page = productMapper.selectPage(productPage, null);
// Service 实现 ServiceImpl 接口
// IPage<Product> page = productService.page(productPage, null);
return new MybatisPageImpl<>(page);
}
}
四、读写分离
4.1 方式一
MyBatis-Plus 开发参与者,依赖如下:
dynamic-datasource-spring-boot3-starter
4.1.1 application.yml
server:
port: 8888
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master: # 数据库 master-0, 包含连接池、驱动、地址、用户名、密码
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3336/test?serverTimezone=UTC
username: root
password: 123456
slave-0: # 数据库 slave-0, 包含连接池、驱动、地址、用户名、密码
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3337/test?serverTimezone=UTC
username: root
password: 123456
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
4.1.2 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
<!-- mybatisPlus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.2</version>
</dependency>
<!-- mybatisPlus 分表分库-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
</dependencies>
</project>
4.2 方式二
sharding-jdbc 4
4.2.1 application.yml
server:
port: 8889
spring:
sharding-sphere:
props:
sql:
show: true
datasource:
names: master-0,slave-0
master-0: # 数据库 master-0, 包含连接池、驱动、地址、用户名、密码
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3336/test?serverTimezone=UTC
username: root
password: 123456
slave-0: # 数据库 slave-0, 包含连接池、驱动、地址、用户名、密码
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3337/test?serverTimezone=UTC
username: root
password: 123456
# 指定数据库分布情况,数据库里面表分布情况
sharding:
master-slave-rules:
ds0: # 主从关系, 读写分离
master-data-source-name: master-0
slave-data-source-names:
- slave-0
tables: # 分表规则
dict:
actual-data-nodes: ds0.dict # 这里使用主从关系
key-generator: # 表中主键生成策略
column: id # 分库依赖的列
type: UUID
table-strategy: # 分片策略
inline: # 不支持范围查询
sharding-column: id
algorithm-expression: dict
4.2.2 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- shardingJDBC-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
<!-- 阿里数据连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.13-SNSAPSHOT</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- mybatisPlus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.2</version>
</dependency>
</dependencies>
</project>
4.3 方式三
shardingsphere 5
4.3.1 application.yml
server:
port: 8888
spring:
sharding-sphere:
props:
sql:
show: true
datasource:
names: master,slave-0
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3336/test?serverTimezone=UTC
username: root
password: 123456
slave-0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3337/test?serverTimezone=UTC
username: root
password: 123456
rules:
readwrite-splitting:
data-sources:
ds:
load-balancer-name: round-robin
static-strategy:
# 注意,如果接口有事务,读写分离不生效,默认全部使用主库,为了保证数据一致性
write-data-source-name: master
read-data-source-names:
- slave0
load-balancers:
round-robin:
type: RANDOM #一共三种一种是 RANDOM(随机),一种是 ROUND_ROBIN(轮询),一种是 WEIGHT(权重)
sharding:
tables:
user: # 拥有几个分片表0-3
actual-data-nodes: ds.user_$->{
0..1}
table-strategy:
standard:
sharding-column: id
sharding-algorithm-name: table-inline # 配置算法
default-database-strategy:
standard:
sharding-column: id
sharding-algorithm-name: database-inline
sharding-algorithms:
table-inline:
type: HASH_MOD
props:
sharding-count: 2
database-inline:
type: HASH_MOD
props:
sharding-count: 3
4.3.2 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.2</version>
</dependency>
<!-- 阿里数据连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.13-SNSAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.2.1</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.32</version>
</dependency>
</dependencies>
</project>
4.4 方式四
mybatis-plus 原生开发,商用 mybatis-mate-starter
4.4.1 application.yml
server:
port: 8888
spring:
main:
allow-bean-definition-overriding: true
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-mate:
cert:
grant: 授予单位
license: 证书
sharding:
health: true # 健康检查
primary: mysql # 默认数据源
datasource:
mysql:
- key: master0
cluster: master
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3336/test?serverTimezone=UTC
username: root
password: 123456
- key: slave01
cluster: slave
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3337/test?serverTimezone=UTC
username: root
password: 123456
4.4.2 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-mate-starter</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
</project>