zhe今天针对SpringBoot整合MyBatisPlus的其他功能展开了学习:
1.自动填充功能:
实现步骤:
1.1完成实体类中对应属性配置:
我这里以createTime和updateTime为例,给大家演示:
java
package com.djw.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.djw.enums.Status;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* @author djw
*/
@Data
@TableName("user")
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class User extends Model<User> {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
@TableField(select = false)
private String password;
@EnumValue
private Status status;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
我在这里指明了自动填充的类型
fill = FieldFill.INSERT --->输入操作时完成填充;
fill = FieldFill.INSERT_UPDATE--->输入操作和更新操作时完成填充;
1.2完成对应配置类的编写:
java
package com.djw.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
// java example
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("开始插入填充...");
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("开始更新填充...");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
来实现MetaObjectHandlerjie接口重写insertFill和updateFill方法以我写的形式为例,指明对应的属性名,属性类型,填充规则;
到这里我们自动填充相关的内容就配置完毕了;
2.通用枚举类
我们想对表中的某些属性如性别,激活未激活等属性进行关联的时候必然会想到使用枚举类,那怎么在SpringBoot中使用枚举类完成相应的业务需求呢:
2.1编写枚举类:
java
package com.djw.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Data;
/**
* @author djw
*/
public enum Status {
active(1,"yes"),
inactive(0,"no");
Status(int code,String desc){
this.code = code;
this.desc = desc;
}
@EnumValue
Integer code;
String desc;
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
}
2.2在对应值的位置表名@EnumValue
2.3加上全局配置,给出枚举类的位置
java
mybatis-plus:
type-enums-package: com.djw.enums
2.4在属性上直接使用枚举类型就好了
3.通用Service的接口与实现类
首先直接编写对应实体类的Mapper并继承BaseMapper:
java
package com.djw.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.djw.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Repository
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
接着编写对应的Service和ServiceImpl:
java
package com.djw.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.djw.entity.User;
public interface UserService extends IService<User> {
}
java
package com.djw.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.djw.entity.User;
import com.djw.mapper.UserMapper;
import com.djw.service.UserService;
import org.springframework.stereotype.Service;
@Service
@DS("master")
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
}
这里可以看到我的Service继承了IService<实体类>,ServiceImpl继承了ServiceImpl<实体类的mapper,实体类>,这一系列操作下来我们就可以实现绝大多数的Service操作了;
这里注意在多个数据源的业务场景可以自己编写新的方法同时调用IService提供的方法同时使用@DS来指明不同的数据源;
4.多数据源处理:
首先添加配置文件pom
java
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
我们只需要在全文配置文件中配置好不同的数据源的相关配置然后使用@DS进行选择就好了:
java
spring:
datasource:
dynamic:
primary: master
strict: false
datasource:
master:
url: jdbc:mysql://localhost:3306/db1?serverTimezone=GMT%2B8
username: root
password: MIMA
driver-class-name: com.mysql.jdbc.Driver
slave_1:
url: jdbc:mysql://localhost:3306/db2?serverTimezone=GMT%2B8
username: root
password: MIMA
driver-class-name: com.mysql.jdbc.Driver
5.乐观锁插件
乐观锁的流程:
- 不加锁读取:在读取数据时,不加任何锁,直接获取数据。
- 提交时校验:在更新数据时,检查在此期间是否有其他线程或用户修改过该数据。
- 冲突处理 :
- 如果数据未被修改,则更新成功。
- 如果数据已被修改,则放弃本次更新,或者让程序自动重试。
5.1先写一下乐观锁的配置类
java
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加乐观锁拦截器
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
5.2实体类需要使用@Version来指明
java
package com.djw.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@TableName("user")
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class User1 {
@TableId(type = IdType.ASSIGN_ID)
Long id;
String name;
Integer balance;
@Version
Integer version;
}
6.ActiveRecord操作
Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的
CRUD 操作
只需要让实体类继承Model类就好了
java
package com.djw.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.djw.enums.Status;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* @author djw
*/
@Data
@TableName("user")
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class User extends Model<User> {
@TableId(type = IdType.ASSIGN_ID)
private Long id;
private String name;
@TableField(select = false)
private String password;
@EnumValue
private Status status;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
就可以直接通过实体类来实现CRUD操作了;