公共字段自动填充
Posted m0_50601240
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了公共字段自动填充相关的知识,希望对你有一定的参考价值。
使用mybatis Plus提供的公共字段填充
处理在多个业务方法中的相同字段
实现步骤:1.在实体类属性上家@TableField注解,指定自动填充的策略
2.按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler 接口
1)在实体类中
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
FieldFill.INSERT: 插入时填充该属性值
FieldFill.INSERT_UPDATE: 插入/更新时填充该属性值
2)
/**
* 自定义元数据对象处理器
*/
@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler
/**
* 插入操作,自动填充
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject)
log.info("公共字段自动填充[insert]...");
log.info(metaObject.toString());
metaObject.setValue("createTime", LocalDateTime.now()); //
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("createUser",new Long(1));
metaObject.setValue("updateUser",new Long(1));
/**
* 更新操作,自动填充
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject)
log.info("公共字段自动填充[update]...");
log.info(metaObject.toString());
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("updateUser",new Long(1));
这时候自动填充的createUser和updateUser设置的是固定值
更新业务的流程
使用jdk提供的ThreadLocal来获取动态的用户id自动填充
ThreadLocal
ThreadLocal是Thread的局部变量,当使用这个ThreadLocal时,ThreadLocal为每个使用该变量的线程提供独立的线程副本,所以每个线程都可以独立改变自己的副本,不会影响其他的线程对应的副本。ThreadLocal为每个线程提供单独一个存储空间,具有线程隔离的肖哥,只有在当前线程内才可以获取对应的值。
实现获取动态用户id的步骤
1.编写BaseContext 工具类,基于ThreadLocal封装的工具类
/**
* 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
*/
public class BaseContext
private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
/**
* 设置值
* @param id
*/
public static void setCurrentId(Long id)
threadLocal.set(id);
/**
* 获取值
* @return
*/
public static Long getCurrentId()
return threadLocal.get();
2.从拦截器LoginCheckFilter 中存放当前登录用户到ThreadLocal
3.将MyMetaObjectHandler 中的createUser和updateUser赋值改变
浅谈MyBatis-Plus学习之公共字段自动填充
一、公共字段自动填充简介
顾名思义:就是在更新或插入数据时,如果数据项没有设置,则会填充默认的值
在这里就会涉及到元数据处理接口以及它的两个方法:
com.baomidou.mybatisplus.mapper.MetaObjectHandler
insertFill(MetaObject metaObject) 这个方法是插入数据时自动填充的逻辑方法
updateFill(MetaObject metaObject) 这个方法是更新数据时自动填充的逻辑方法
而MetaObject这个是MyBatis提供的一个封装对象的类,用于更好的获取对象的相关信息。
二、公共字段自动填充的配置如下
2.1、为需要自动填充的实体属性添加注解
public class User { @TableId(type=IdType.AUTO) private Integer id; @TableField(fill=FieldFill.INSERT_UPDATE) //当插入和更新都会进行字段的填充 private String name; @TableLogic //标志是一个逻辑标识符号 private Integer deleteFlag; // set methods // get methods }
@TableFiled这个注解的fill属性提供三种自动填充设置
2.2、创建一个类继承MetaObjectHandler
实现相应的方法,在插入和更新数据时如何自动填充的逻辑
public class MyMetaObjectHandler extends MetaObjectHandler{ //插入时自动填充的逻辑方法 @Override public void insertFill(MetaObject metaObject) { // TODO Auto-generated method stub System.out.println("###调用insertFill方法###"); Object obj = getFieldValByName("name", metaObject); if (obj == null) { setFieldValByName("name", "插入填充test", metaObject); } } //更新时自动填充的逻辑方法 @Override public void updateFill(MetaObject metaObject) { // TODO Auto-generated method stub System.out.println("###调用updateFill方法###"); Object obj = getFieldValByName("name", metaObject); if (obj == null) { setFieldValByName("name", "更新填充test", metaObject); } } }
2.3、在applicationContext.xml配置文件中进行配置
<!-- mybatis-plus全局配置策略 ,这样避免重复在每一个实体中使用注解进行配置--> <bean id="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <property name="dbColumnUnderline" value="true"></property> <!-- 2.3版本后默认配置数据库下划线--> <!-- 指定数据库ID生成策略 0:数据库自增--> <property name="idType" value="0"></property> <!-- 指定数据库表前缀 --> <property name="tablePrefix" value="tbl_"></property> <!-- 注入处理器方法 --> <property name="metaObjectHandler" ref="myMetaObjectHandler"></property> </bean> <!-- 注入处理器的bean --> <bean id="myMetaObjectHandler" class="cn.hjj.mp.handler.MyMetaObjectHandler"></bean>
2.4、测试代码如下
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath:applicationContext.xml"}) public class TestMetaObjectHandler { @Autowired private UserMapper userMapper; @Test public void testInsert() { User user = new User(); user.setDeleteFlag(1); userMapper.insert(user); } @Test public void testUpdate() { User user = new User(); user.setId(4); user.setDeleteFlag(1); userMapper.updateById(user); } }
以上是关于公共字段自动填充的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot-Mybatis_Plus学习记录之公共字段自动填充