MyBatis-Plus自动填充功能失效导致的原因及解决

1:先检查 字段有没有加上注解 @tablefield(fill = fieldfill.insert_update)

?

1

2

@tablefield(fill = fieldfill.insert_update)

 private date updatedtime;

2:有没有实现 metaobjecthandler 接口 ,并且加入到 spring 容器中

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

@component

public class mymetaobjecthandler implements metaobjecthandler {

 

 @override

 public void insertfill(metaobject metaobject) {

this.strictinsertfill(metaobject, "createdtime", date.classnew date());

this.strictinsertfill(metaobject, "updatedtime", date.classnew date());

 }

 

 @override

 public void updatefill(metaobject metaobject) {

this.strictupdatefill(metaobject, "updatedtime", date.classnew date());

 }

}

3: @component 是否扫码注入进去

4: basemapper.update(null,wrappers.<users>lambdaupdate()) 这样的写法是没有拦截到的,所以无效

xml 写的也无效

@update 注解也无效

?

1

2

3

basemapper.update(null, wrappers.<users>lambdaupdate()

.set(users::getconcerntype,2)

.eq(users::getid,userid));

应该改为

?

1

2

basemapper.update(users, wrappers.<users>lambdaupdate()

.set(users::getconcerntype,2));

或者

?

1

2

3

4

users users = new users();

users.setid(userid);

users.setconcerntype(1);

basemapper.updatebyid(users);

这样可以拿到表相关信息,会执行我们的 metaobjecthandler 实现接口

补充:springboot+mybatisplus 公共字段自动填充 mybatisplusconfig配置不生效解决

springboot+mybatisplus mybatisplusconfig配置不生效问题

先说下工程目录

典型的maven工程,在common中配置mybatisplus配置信息,在base中进行crud操作。

遇到的问题:

在mybatisplus中配置了公共字段(create_time,upate_time),想在插入数据时,自动插入这两条字段。

配置如下:

abstractentity 代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

/**

 * 实体父类

 */

@data

public abstract class abstractentity extends model implements serializable {

 private static final long serialversionuid = 1l;

 /**

  * id

  */

 @tableid

 private string id;

 /**

  * 创建时间

  */

 @datetimeformat(pattern = "yyyy-mm-dd hh:mm:ss")

 @jsonformat(timezone = "gmt+8", pattern = "yyyy-mm-dd hh:mm:ss")

 @tablefield(value = "create_time", fill = fieldfill.insert)

 public date createtime;

 /**

  * 修改时间

  */

 @datetimeformat(pattern = "yyyy-mm-dd hh:mm:ss")

 @jsonformat(timezone = "gmt+8", pattern = "yyyy-mm-dd hh:mm:ss")

 @tablefield(value = "update_time", fill = fieldfill.update)

 public date updatetime;

}

metahandler代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

@slf4j

@component

public class metahandler implements metaobjecthandler {

 /**

  * 新增数据执行

  * @param metaobject

  */

 @override

 public void insertfill(metaobject metaobject) {

  this.setfieldvalbyname("createtime"new date(), metaobject);

  this.setfieldvalbyname("updatetime"new date(), metaobject);

 }

 /**

  * 更新数据执行

  * @param metaobject

  */

 @override

 public void updatefill(metaobject metaobject) {

  this.setfieldvalbyname("updatetime"new date(), metaobject);

 }

}

mybatisplusconfig 代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

@configuration

@mapperscan("com.lyf.account.**.mapper")

public class mybatisplusconfig {

 /*

  * 分页插件,自动识别数据库类型

  * 多租户,请参考官网【插件扩展】

  */

 @bean

 public paginationinterceptor paginationinterceptor() {

  return new paginationinterceptor();

 }

 @bean

 public globalconfig globalconfig() {

  globalconfig globalconfig = new globalconfig();

  globalconfig.setmetaobjecthandler(new metahandler());

  return globalconfig;

 }

}

配置后,启动baseapplication,使用postman 进行测试,发现数据成功插入,但是创建时间并没有插入

在mybatisplusconfig 的 globalconfig.setmetaobjecthandler(new metahandler());处打断点进行调试,发现代码并没有执行到这个类 (╯▔皿▔)╯ 检查 baseapplication 才发现,没有在启动类中扫描该配置文件@。@

以下是修改过的baseapplication类:

?

1

2

3

4

5

6

7

8

9

10

11

@springbootapplication

@componentscan({"com.lyf.account.mybatis.config","com.lyf.account.base"})

public class baseapplication {

 public static void main(string[] args) {

  springapplication.run(baseapplication.class, args);

 }

 @bean

 public idworker idworker (){

  return new idworker(1,1);

 }

}

加入扫描装配后,再次进行测试,插入数据完美将创建时间加入o(∩_∩)o

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,关于mybatis-plus自动填充失效的问题,可能有以下几种原因: 1. 没有正确配置自动填充插件。需要在MybatisPlusConfig类中添加自动填充插件的配置,例如: ```java @Configuration public class MybatisPlusConfig { @Bean public GlobalConfig globalConfig() { GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setMetaObjectHandler(new MyMetaObjectHandler()); return globalConfig; } } ``` 其中MyMetaObjectHandler是自定义的实现了MetaObjectHandler接口的类,用于填充实体类中的字段。 2. 实体类中没有使用注解标记需要自动填充的字段。需要在实体类中使用注解标记需要自动填充的字段,例如: ```java public class User { @TableId(type = IdType.AUTO) private Long id; private String name; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; // 省略getter和setter方法 } ``` 其中createTime字段使用了@TableField(fill = FieldFill.INSERT)注解,表示在插入数据时自动填充该字段;updateTime字段使用了@TableField(fill = FieldFill.INSERT_UPDATE)注解,表示在插入和更新数据时自动填充该字段。 3. 数据库中的字段类型与实体类中的字段类型不匹配。需要确保数据库中的字段类型与实体类中的字段类型一致,否则自动填充可能会失效。 希望以上信息能够帮助您解决mybatis-plus自动填充失效的问题。 ### 回答2: Mybatis-Plus 是 Mybatis 的增强工具包,在 Mybatis 的基础上增加了许多实用的功能,其中自动填充是其非常常用的一个功能。 如果 Mybatis-Plus自动填充失效了,可能是以下原因导致的: 1. Entity 类中的字段名称和表中的列名不一致。 自动填充是依赖于 Entity 类中的字段来完成的,如果 Entity 类中的字段名称与表中的列名不一致,就会导致自动填充无法生效。 解决方法:真实名称与 Entity 类中的字段名称保持一致。 2. 自动填充字段未在表中设置默认值。 自动填充需要在表中设置默认值才能生效,如果没有设置默认值,自动填充就会失效解决方法:在表中设置自动填充字段的默认值。 3. 自动填充时机不对。 Mybatis-Plus自动填充有三种时机:插入时填充、更新时填充和插入或更新时填充。如果设置的时机不对,就会使自动填充无法生效。 解决方法:检查自动填充时机是否正确。 4. 自动填充类没有实现 MetaObjectHandler 接口。 自动填充是通过 MetaObjectHandler 接口来实现的,如果自动填充类没有实现该接口,就会导致自动填充失效解决方法:实现 MetaObjectHandler 接口,并在配置文件中配置自动填充类。 以上是 Mybatis-Plus 自动填充失效的可能原因解决方法,根据具体情况进行排查和修复即可。 ### 回答3: mybatis-plus自动填充失效可能会有以下几个原因: 1. 没有在实体类中定义自动填充字段和注解 在使用mybatis-plus自动填充功能时,需要在实体类中定义自动填充字段,并使用注解@TableField(fill = FieldFill.INSERT_UPDATE)或@TableField(fill = FieldFill.INSERT)或@TableField(fill = FieldFill.UPDATE)注解,指定自动填充的类型。 2. mybatis-plus版本问题 如果使用的mybatis-plus版本过低,可能会导致自动填充失效。建议升级mybatis-plus的版本至最新版或者高于3.0.6版本。 3. 没有配置mybatis-plus自动填充器 在使用mybatis-plus自动填充功能时,还需要配置自动填充器。可以继承MetaObjectHandler类,并实现其中的方法,如insertFill()、updateFill()等,在这些方法中完成自动填充的逻辑。然后在Mybatis-plus的配置文件中配置自动填充器。 4. 实体类属性名和数据库字段名不一致 在mybatis-plus自动填充时,会根据实体类的定义自动填充对应的字段值。如果实体类属性名和数据库字段名不一致,可能会导致自动填充失败。可以使用@TableField(value = "数据库字段名")注解解决这个问题。 5. 数据库类型问题 mybatis-plus自动填充功能依赖于Mybatis的TypeHandler机制和JDBC驱动等技术,如果数据库类型不受支持,可能会导致自动填充失效。 总之,如果发现mybatis-plus自动填充失效,需要仔细检查以上几个问题。如果无法自行解决,可以向mybatis-plus官方社区提出问题,或者寻求专业的技术支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值