MyBatis-Plus,MetaObjectHandler没生效,完美解决

这篇具有很好参考价值的文章主要介绍了MyBatis-Plus,MetaObjectHandler没生效,完美解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mybatisplus自动填充功能失效

通过SpringBoot框架集成 mybatis-plus
首先导入需要的依赖

		<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.2</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.2</version>
        </dependency>

在appication.yml添加相关配置


mybatis-plus  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl//打印sql语句
  mapper-locations: com/example/mapper/xml/*.xml // 配置mapper的扫描,找到所有的mapper.xml映射文件

创建实体类对象


@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderMaster implements Serializable {
    @TableId(type = IdType.ASSIGN_UUID)//自动生成
    private String orderId;
    private String Name;
    private String Phone;
    private String Address;
    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

按照官方文档进行配置
要记得添加@Component注解

@Component
//自动填充配置
public class FillHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("开始填充时间");

        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
    }
}

正常来说到了这一步,一般情况下就好了
常见的错误有这几种

  • 日期类不一致导致 创建日期、更新日期 为 null
  • @Component 没有被扫到,可以看下启动类的位置,启动类扫描的包是在其所在包以下的包
  • 还有就是填充的字段属性不一致,比如Date和LocalDateTime
  • 检查MetaObjectHandler实现类是否使用@Component
  • 实体类字段使用注解 @TableField(fill = FieldFill.INSERT)

可惜我的问题不是以上几种,于是我打了断点,发现根本没有执行到 MetaObjectHandler的实现类=>FillHandler
于是我输出了所有的bean,发现MetaObjectHandler并没有注入进去。
这里的原因在于mybatis有自己默认的配置文件,所以我们自定义的没有生效,自定义Bean sqlSessionFactory 影响到了 globalConfig ,导致配置失效。
添加这样一个配置类即可


import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.example.handler.FillHandler;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

public class sqlSessionFactory {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        //获取mybatis-plus全局配置
        GlobalConfig globalConfig = GlobalConfigUtils.defaults();
        //mybatis-plus全局配置设置元数据对象处理器为自己实现的那个
        globalConfig.setMetaObjectHandler(new FillHandler());
        mybatisSqlSessionFactoryBean.setDataSource(dataSource);
        //mybatisSqlSessionFactoryBean关联设置全局配置
        mybatisSqlSessionFactoryBean.setGlobalConfig(globalConfig);
        return mybatisSqlSessionFactoryBean.getObject();
    }

}

到这里就终于好了,这个问题困扰了我一整天,终于解决了!文章来源地址https://www.toymoban.com/news/detail-427735.html

到了这里,关于MyBatis-Plus,MetaObjectHandler没生效,完美解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis-Plus条件查询问题解决

    问题描述 系统中有用户注册的功能,但是会出现重复注册的现象,代码中有做过重复校验,但是没有生效。 问题解决 首先排查数据生成时间点不同,相差时间有长有短,不是用户同时多次点击的原因,应该是用户这边不同时间重复多次注册导致的,但是程序中防止重复校验

    2024年02月16日
    浏览(32)
  • mybatis-plus 查询数据为null问题解决

    首先数据库能查询到数据, 不过查询到的字段都是 null 值, 因为业务上就用到这3个字段 代码中使用 mybatis-plus 精确字段查询, select方法可以精确查询字段 之后debug看到 orderMain 对象为 null, 因为 这 3 个字段在数据库表中都是 null 解决方式是把 select方法需要查询一个数据库中不为

    2024年02月11日
    浏览(43)
  • Mybatis-Plus分页插件查询慢解决方案

    需求反馈前端界面查询速度很慢。 f12查看接口响应时间达到了5.47s。 查看后端代码逻辑,就是传了些参数,分页查询了一个列表的数据。分页插件使用的是mybatis-plus的分页插件,PaginationInterceptor。 把后端调用的sql单独拿出来在navicat中进行执行,才0.54s左右,其实很快了,数

    2024年02月11日
    浏览(44)
  • Mybatis-Plus不能更新对象字段为空值问题解决

    问题描述: 在使用Mybatis-Plus调用updateById方法进行数据更新默认情况下是不能更新空值字段的,而在实际开发过程中,往往会遇到需要将字段值更新为空值的情况,该如何解决呢? 原因分析: Mybatis-Plus中字段的更新策略是通过FieldStrategy属性控制的。在实体字段上,如果不通

    2024年02月12日
    浏览(38)
  • SpringBoot+MyBatis-Plus多数据源@DS注解失效的解决方法

    引入 dynamic-datasource: application.yml 数据源配置: 详细使用请看 MyBatis-Plus官网 这种场景还是比较常见,比如在一个为master数据源的调用slave数据源就会失效 slave数据源Service方法 mater数据源Service方法调用slave数据源Service方法 这里会出现没有走slave_1,依然还是master数据源 需要在

    2024年01月18日
    浏览(43)
  • MyBatis-Plus一级缓存和二级缓存-redis解决缓存的脏数据

    什么是缓存? 1.存在内存中的临时数据 2.将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库 数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。 为什么使用缓存 减少和数据库的交互次数,减少系统开

    2024年02月09日
    浏览(32)
  • 【Mybatis-plus】updateById()方法不能更新字段为null的原因及解决办法

    一、问题描述 ​ 在日常项目开发过程中,经常会使用Mybatis-plus的updateById()方法,快速将接收道德参数或者查询结果中原本不为null的字段更新为null,并且该字段在数据库中可为null,这个时候使用updateById()并不能实现这个操作,不会报错,但是对应的字段并没有更新为null。

    2024年02月02日
    浏览(39)
  • 解决 MyBatis-plus : Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required的问题

    在将MyBatis-plus整合进Springboot项目时,启动后发生 MyBatis-plus : Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required 错误。 这种一般是版本问题,一开始想去官网上查,但发现官网登不上去,之后在gitee上的MyBatis-plus主页查找到了最新的版本,将依赖的版本改一下就行:

    2024年02月10日
    浏览(26)
  • 针对mockito框架在单元测试中出现Mybatis-Plus链式调用的解决方案

    1、 调用其他service层方法 2、 调用本service层方法 3、其他问题

    2024年01月24日
    浏览(33)
  • 【Mybatis-Plus】mybatisplus更新时,实体字段为空,数据库不更新的解决方案

    项目技术栈:jdk (1.8) + spring boot (2.1.0) + mybatis-plus (3.5.1) 数据库: MySQL 字段类型:varchar 和 Integer 从前端传过来的数据实体字段, convertType 和 step 设为null时,使用mybatis-plus 的 updateById方法往数据库中更新时,这两个字段不更新,数据不为空可以插入。 mybatis-plus在更新的时候做

    2024年01月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包