1、字段类型处理器
在某些场景下,我们在实体类中是使用 Map 集合作为属性接收前端传递过来的数据的,但是这些数据存储在数据库时,我们使用的是 json 格式的数据进行存储,json本质是一个字符串,就是 varchar 类型。那怎么做到实体类的 Map 类型和数据库的varchar类型的互相转换,这里就需要使用到字段类型处理器来完成。
示例:
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName(autoResultMap = true) //查询时将json字符串封装为Map集合
public class User extends Model<User> {
private Long id;
private String name;
private Integer age;
private String email;
private GenderEnum gender;
private Integer status;
@TableField(typeHandler = FastjsonTypeHandler.class) //指定字段类型处理器
private Map<String,String> contact; // 添加map类型的参数
}
以上就可以实现 map 转 json 字符串和 json 字符串转 map。
2、字段自动填充
这个功能在设置时间日期的时候特别实用。
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(autoResultMap = true)
public class User extends Model<User> {
@TableId
private Long id;
private String name;
private Integer age;
private String email;
private Integer status;
private GenderEnum gender;
@TableField(typeHandler = FastjsonTypeHandler.class)
private Map<String,String> contact;
@TableField(fill = FieldFill.INSERT) // 指定填充时机
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE) // 指定填充时机
private Date updateTime;
}
编写自动填充处理器,自定义填充策略 。
@Component
public class MyMetaHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
setFieldValByName("createTime",new Date(),metaObject);
setFieldValByName("updateTime",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
setFieldValByName("updateTime",new Date(),metaObject);
}
}
3、乐观锁
实现步骤:
1、在数据库中添加version字段(int 类型,默认值为1)
2、实体类添加对应的属性,并使用@Version标注为这是一个乐观锁字段信息。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
@Version // 标注此字段是乐观锁字段
private Integer version;
}
3、通过拦截器的配置,让每条修改的sql语句在执行的时候,都加上版本控制的功能。
乐观锁的效果是,一个请求在修改的过程中,是允许另一个请求查询的,但是修改时会通过版本号是否改变来决定是否修改,如果版本号变了,证明已经有请求修改过数据了,那这次修改不生效,如果版本号没有发生变化,那就完成修改。
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); // 添加乐观锁拦截器
return interceptor;
}
}
4、多数据源配置
4.1、引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
4.2、配置文件(application.yml)
spring:
datasource:
dynamic:
primary: master
strict: false
datasource:
master:
username: root
password: root
url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
slave_1:
username: root
password: root
url: jdbc:mysql://localhost:3306/mybatisplus2?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
driver-class-name: com.mysql.cj.jdbc.Driver
4.3、创建多个Service,分别使用@DS注解描述不同的数据源信息
@Service
@DS("master")
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
}
//===========================================================================
@Service
@DS("slave_1")
public class UserServiceImpl2 extends ServiceImpl<UserMapper, User> implements UserService{
}
TODO:是否支持单个方法配置指定的数据源
5、逆向工程
使用mybatisX插件进行逆向工程操作:(直接在idea设置-> Plugins中查询安装即可)
1、使用idea连接数据库。
2、选中表右键,选择MybatisX-Generator,填写相应信息即可生成。
总结:本文介绍 mybatis-plus 中字段类型处理器、字段自动填充、乐观锁实现、多数据源配置使用、逆向工程操作等内容。
本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)