1. 主键
@TableId(type = IdType.ASSIGN_UUID)
type = IdType.ASSIGN_UUID //uuid
type = IdType.AUTO //数据库id自增
type = IdType.ASSIGN_ID //雪花算法生成id
2. 逻辑删除
@TableLogic
3. 自动填充时间
@TableField(fill = FieldFill.INSERT, select = false)
- 查询不显示,插入数据时自动添加时间
//查询不显示,插入数据时自动添加时间
@TableField(fill = FieldFill.INSERT, select = false)
private LocalDateTime createTime;
//查询不显示,更新数据时自动添加时间
@TableField(fill = FieldFill.UPDATE, select = false)
private LocalDateTime updateTime;
- 对应的添加时间的类
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private final String delFlag = "delFlag";
private final String createTime = "createTime";
private final String updateTime = "updateTime";
@Override
public void insertFill(MetaObject metaObject) {
fillCreateMeta(metaObject);
fillCommonMeta(metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
fillUpdateMeta(metaObject);
}
private void fillCommonMeta(MetaObject metaObject) {
if (metaObject.hasGetter(delFlag)) {
setFieldValByName(delFlag, 0, metaObject);
}
}
private void fillCreateMeta(MetaObject metaObject) {
if (metaObject.hasGetter(createTime)) {
setFieldValByName(createTime, LocalDateTime.now(), metaObject);
}
}
private void fillUpdateMeta(MetaObject metaObject) {
if (metaObject.hasGetter(updateTime)) {
setFieldValByName(updateTime, LocalDateTime.now(), metaObject);
}
}
}
4. 字段类型转换
- 可以使用字符串数组或者JOSNArray
- @TableField(typeHandler = JacksonTypeHandler.class)要配合@TableName(autoResultMap = true)使用,否则查询时没有返回值
- 数据库中对应的字段需要使用varchar类型
@Data
@TableName(autoResultMap = true)
public class User extends Model<User> {
@TableField(typeHandler = JacksonTypeHandler.class)
private String[] interests;
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONArray customInterests;
}
5. 数据库字段脱敏
- 创建脱敏处理类AesEncryptHandler,这里使用aes加密
package com.example.fisher.gradledemo.handler;
import com.baomidou.mybatisplus.core.toolkit.AES;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class AesEncryptHandler extends BaseTypeHandler<String> {
//密钥
private static String key = "1234567890abcdef";
//加密
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, AES.encrypt(parameter, key));
}
//解密
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
String columnValue = rs.getString(columnName);
return AES.decrypt(columnValue, key);
}
//解密
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String columnValue = rs.getString(columnIndex);
return AES.decrypt(columnValue, key);
}
//解密
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String columnValue = cs.getString(columnIndex);
return AES.decrypt(columnValue, key);
}
}
- 属性上添加注解@TableField,配置处理类AesEncryptHandler,这里同时需要类上添加@TableName(autoResultMap = true)注解,否则查询时,不能反向解析加密字段返回给前端
@TableField(typeHandler = AesEncryptHandler.class)
private String interest;
6. 数据库字段不存在
@TableField(exist = false):表示该属性不为数据库表字段,但又是必须使用的。
@TableField(exist = true):表示该属性为数据库表字段。
sql打印配置
mybatis-plus.configuration.log-impl = org.apache.ibatis.logging.stdout.StdOutImpl