背景:实际开发中,我们经常会为表设计创建人、创建时间、更信人、更新时间等通用字段,每个接口都需要增加or修改这些字段,1是代码冗余,2则容易出错。mybatis-plus提供了一种统一处理的方案,解决了这一痛点。
如果需要理解mybatis-plus的基础用法,可以查看作者的另外两篇文章
Mybatis-Plus的使用_m0_37298602的博客-优快云博客https://blog.youkuaiyun.com/m0_37298602/article/details/117788047Mybatis-plus分页查询_m0_37298602的博客-优快云博客如果对mybatis-plus基本使用不清楚的可以查看作者文章简单了解下mybatis-plus:https://blog.youkuaiyun.com/m0_37298602/article/details/117788047
https://blog.youkuaiyun.com/m0_37298602/article/details/117808674代码仓贴出:
study: 工具学习,如zookeeper、mybatisplushttps://gitee.com/kwins/study
mybatis-plus提供了MetaObjectHandler接口,我们可以通过实现这个接口,将insert or update前的数据进行改变。
实现如下:
package com.kwin.test.config;
import java.lang.reflect.Field;
import org.apache.ibatis.reflection.MetaObject;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
/**
* 通用参数统一处理
*/
@Slf4j
public class CustomMetaObjectHandler implements MetaObjectHandler {
public static final String NAME = "name";
@Override
public void insertFill(MetaObject metaObject) {
log.info("{}", metaObject.getOriginalObject());
if(validField(metaObject, NAME)) {
Object value = getFieldValByName(NAME, metaObject);
Class<?> clzz = metaObject.getGetterType(NAME);
if(String.class.isAssignableFrom(clzz)) {
setFieldValByName(NAME, "test", metaObject);
}
}
}
@Override
public void updateFill(MetaObject metaObject) {
if(validField(metaObject, NAME)) {
Object value = getFieldValByName(NAME, metaObject);
Class<?> clzz = metaObject.getGetterType(NAME);
if(String.class.isAssignableFrom(clzz)) {
setFieldValByName(NAME, "test", metaObject);
}
}
}
private boolean validField(MetaObject metaObject, String fieldName) {
Object obj = metaObject.getOriginalObject();
if(obj == null) {
return false;
}
Field[] fields = obj.getClass().getDeclaredFields();
if(fields.length == 0) {
return false;
}
for(Field field : fields) {
if(field.getName().equals(fieldName)) {
return true;
}
}
return false;
}
}
上述实现通过对name字段进行修改进行验证功能。
实体:
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author : wangkai
* @version V1.0
* @Package com.kwin.test.entity
* @Description:
* @date 2021年06月10日 17:37
**/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("user")
public class User extends Model<User> {
@TableId
private Long id;
@TableField(fill = FieldFill.INSERT)
private String name;
private int age;
private String email;
@Override
protected Serializable pkVal() {
return id;
}
}
其中,针对需要insert修改的字段指定 @TableField(fill = FieldFill.INSERT) ,同理,需要更新的字段指定@TableField(fill = FieldFill.UPDATE)。
配置注入该bean
package com.kwin.test.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
/**
* @author : Kwin
* @version V1.0
* @Package com.kwin.test.config
* @Description:
* @date 2021年06月11日 10:33
**/
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
public class MybatisPlusConfig {
@Bean
public MetaObjectHandler metaObjectHandler() { return new CustomMetaObjectHandler(); }
}
测试用例:
package com.kwin.test;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.kwin.test.entity.User;
import com.kwin.test.service.UserService;
@SpringBootTest
class TestApplicationTests {
@Autowired
private UserService userService;
@Test
void test4() {
User user = new User();
user.setId(8L);
user.setName("test7");
user.setAge(55);
user.setEmail("1107@qq.com");
boolean result = user.insert();
System.out.println("result is " + result);
List<User> userList = userService.list();
for(User user1:userList) {
System.out.println(user1);
}
}
}
结果:
可见,name从test7被修改为test了。