11.MybatisPlus 自动填充
2020-03-27 本文已影响0人
神奇作手
1.简介
有的表中有新增时间、最后一次操作时间、创建人,最后一次操作人等问题,每次操作时都需要去添加对应的数据,每一块的操作都要添加此操作,比较麻烦。这时候可以使用mybatis-plus的自动填充。
2.自动填充实现
2.1.在实体类中对字段添加注解,标明要进行自动填充
@TableField(fill = FieldFill.INSERT)//创建时填充
private LocalDateTime createTime;//创建时间
@TableField(fill = FieldFill.UPDATE)//修改时填充
private LocalDateTime updateTime;//修改时间
2.2.自定义自动填充实现类MyMetaObjectHandler实现MetaObjectHandler
package com.mp.component;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* @Description 自动填充类
* @Author LL
* @Date 2020-03-27 09:58
*/
@Component
public class MyMetqObjectHandle implements MetaObjectHandler {
//添加时填充
@Override
public void insertFill(MetaObject metaObject) {
setInsertFieldValByName("createTime", LocalDateTime.now(), metaObject);
// setFieldValByName("createTime", LocalDateTime.now(), metaObject);//通用方法
}
//更新时填充
@Override
public void updateFill(MetaObject metaObject) {
setUpdateFieldValByName("updateTime", LocalDateTime.now(), metaObject);
// setFieldValByName("updateTime", LocalDateTime.now(), metaObject);//通用方法
}
}
2.3.编写测试类测试
package com.mp.fill;
import com.mp.dao.UserMapper;
import com.mp.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @Description 自动填充测试
* @Author LL
* @Date 2020-03-27 10:04
*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class FillTest {
@Autowired
private UserMapper userMapper;
/**
* 测试添加时自动填充
*/
@Test
public void insert(){
User user = new User();
user.setName("关羽")
.setAge(32)
.setEmail("gy@baomidou.com")
.setManagerId(1088248166370832385L);
int row = userMapper.insert(user);
System.out.println("影响行数:"+row);
User res = userMapper.selectById(user.getId());
System.out.println(res);
}
/**
* 测试更新时自动填充
*/
@Test
public void update(){
User user = new User();
user.setId(1243360631283564545L)
.setAge(33);
int row = userMapper.updateById(user);
System.out.println("影响行数:"+row);
User res = userMapper.selectById(1243360631283564545L);
System.out.println(res);
}
}
3.自动填充优化
在自动填充前可以做一系列的代码逻辑处理,处理后在填充
package com.mp.component;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* @Description 自动填充类
* @Author LL
* @Date 2020-03-27 09:58
*/
@Component
public class MyMetqObjectHandle implements MetaObjectHandler {
//添加时填充
@Override
public void insertFill(MetaObject metaObject) {
boolean hasSetter = metaObject.hasSetter("createTime");//判断是否有此字段
boolean hasGetter = metaObject.hasGetter("createTime");
System.out.println(hasSetter);
System.out.println(hasGetter);
if (hasSetter){//有此字段了,在自动填充
System.out.println("填充添加处理~~~");
setInsertFieldValByName("createTime", LocalDateTime.now(), metaObject);
}
// setFieldValByName("createTime", LocalDateTime.now(), metaObject);//通用方法
}
//更新时填充
@Override
public void updateFill(MetaObject metaObject) {
Object val = getFieldValByName("updateTime", metaObject);
if (val==null){//是否自己设置了此字段的值
System.out.println("填充更新处理~~~");
setUpdateFieldValByName("updateTime", LocalDateTime.now(), metaObject);
}
// setFieldValByName("updateTime", LocalDateTime.now(), metaObject);//通用方法
}
}