背景
在项目中经常遇到一些数据需要自动填充,填充方法都是同一种规则,例如创建时间等。
1 自动填充方法配置
1.1 实体类添加注解
1.2 在handler包下实现元对象处理器接口
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Date;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);@Overridepublic void insertFill(MetaObject metaObject) {LOGGER.info("start insert fill ....");this.setFieldValByName("createTime", new Date(), metaObject);this.setFieldValByName("updateTime", new Date(), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {LOGGER.info("start update fill ....");this.setFieldValByName("updateTime", new Date(), metaObject);}
}
1.3 在测试文件中进行测试
问题
在进行测试时发现配置的MyMetaObjectHandler并没有生效,即没有对数据库中的create_time和update_time进行自动填充。
原因及解决措施
1 Date对象使用(import)的包不一致
如图2所示,MyMetaObjectHandler.java中Date使用的包是import java.util.Date;,而实体类User.java中Date使用的包是import java.sql.Date,从而导致无法自动填充,解决方法: 修改实体类User.java中的包为import java.util.Date;
2 没有添加@Component注解
如图2所示,没有在MyMetaObjectHandler类上添加 @Component 注解。
3 启动类的位置不正确
如图所示,启动类DemoApplication.java的位置应该和entity、handler、mapper包在同一路径下,如果将启动类放在entity等包的下一级目录下就会出现无法自动填充问题。