MyBatis-Plus,MetaObjectHandler没生效,完美解决
若依框架集成mybatis-plus,自动填充字段不生效
·
MyBatis-Plus,MetaObjectHandler没生效
基于若依框架集成 mybatis-plus
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.4</version>
</dependenacy>
appication.yml如下(因为若依集成了mybatis,所以一些相关的配置我放在mybatis上了)
# MyBatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.surfilter.**.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted #这个是假删除(非必要配置)
创建对象类
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName("t_project")
public class ProjectEntity {
@TableId(type = IdType.AUTO)
private Integer id;
private String name;
private String description;
@TableField(fill = FieldFill.INSERT)
private String createBy;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateBy;
//这个就是假删除用的
@TableLogic
private Integer deleted;
private Integer isValid;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
按照官方文档配置
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("insert fill");
this.strictInsertFill(metaObject,"createTime", Date.class,new Date());
this.strictInsertFill(metaObject,"createBy", String.class,SecurityUtils.getUsername());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("update fill");
this.strictInsertFill(metaObject,"updateTime", Date.class,new Date());
this.strictInsertFill(metaObject,"updateBy", String.class,SecurityUtils.getUsername());
}
}
到了这一步,一般情况下就好了,结果就踩坑了!
然后我就上网找呀,大概几种原因(建议先debug一下进没进去这个handler,俺就是没进去):
- 日期类不一致导致 创建日期、更新日期 为 null
- @Component 没有被扫到,可以看下启动类的位置,启动类扫描的包是在其所在包以下的包
- 还有就是填充的属性字段不一致
**emmm,几种原因都跟咱没关系 **
不想看我踩坑直接跳过来
我看了一下,ruoyi框架存在一个MybatisConfig,里面有这么一个东西,这个东西,已经配好了SqlSessionFactory的bean了,所以你这handler加@Component好像也没注入进去,然后我就加了这两句。
@Autowired
private MyMetaObjectHandler myMetaObjectHandler;
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
{
String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
String mapperLocations = env.getProperty("mybatis.mapperLocations");
String configLocation = env.getProperty("mybatis.configLocation");
typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
VFS.addImplClass(SpringBootVFS.class);
final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
//下面三句,把刚刚写的handler,放在sessionFactory中
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(myMetaObjectHandler);
sessionFactory.setGlobalConfig(globalConfig);
return sessionFactory.getObject();
}
这一步之前其实还踩了个坑,只不过很明显,idea直接报错了哈哈
如果你是从0开始集成mybatis-plus,可以通过按照下面配置。
就是,我按照网上,配了个Config,然后配置了上面那个bean,idea报错说有两个这种玩意儿。
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisSqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws IOException {
MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
//全局配置
GlobalConfig globalConfig = new GlobalConfig();
//配置填充器 MyMetaObjectHandler 可以直接 @Autowired 先注入,就不用new了
sessionFactory.setMetaObjectHandler(new MyMetaObjectHandler());
mybatisPlus.setGlobalConfig(globalConfig);
return sessionFactory;
}
}
收工~
感谢国家感谢党。
更多推荐
已为社区贡献1条内容
所有评论(0)