mybatis有字段存不进去_如何解决mybatis-plus调用update方法时,自动填充字段不生效问题...

本文介绍了在使用MyBatis-Plus时,通过`boolean update(Wrapper updateWrapper)`方法更新记录时自动填充字段失效的原因及解决方案。问题源于更新实体为null时,无法获取到TableInfo,导致填充逻辑不执行。解决方案包括直接使用带实体参数的重载方法或通过重写`update`方法来确保实体不为空。
摘要由CSDN通过智能技术生成

前言

使用过mybatis-plus的朋友可能会知道,通过实现元对象处理器接口com.baomidou.mybatisplus.core.handlers.MetaObjectHandler可以实现字段填充功能。但如果在更新实体,使用boolean update(Wrapper updateWrapper)这个方法进行更新时,则自动填充会失效。今天就来聊聊这个话题,本文例子使用的mybatis-plus版本为3.1.2版本

为何使用boolean update(Wrapper updateWrapper),自动填充会失效?

从mybatis-plus 3.1.2版本跟踪源码,可以得知,自动填充的调用代码实现逻辑是由下面的核心代码块实现

/**

* 自定义元对象填充控制器

*

* @param metaObjectHandler 元数据填充处理器

* @param tableInfo 数据库表反射信息

* @param ms MappedStatement

* @param parameterObject 插入数据库对象

* @return Object

*/

protected static Object populateKeys(MetaObjectHandler metaObjectHandler, TableInfo tableInfo,

MappedStatement ms, Object parameterObject, boolean isInsert) {

if (null == tableInfo) {

/* 不处理 */

return parameterObject;

}

/* 自定义元对象填充控制器 */

MetaObject metaObject = ms.getConfiguration().newMetaObject(parameterObject);

// 填充主键

if (isInsert && !StringUtils.isEmpty(tableInfo.getKeyProperty())

&& null != tableInfo.getIdType() && tableInfo.getIdType().getKey() >= 3) {

Object idValue = metaObject.getValue(tableInfo.getKeyProperty());

/* 自定义 ID */

if (StringUtils.checkValNull(idValue)) {

if (tableInfo.getIdType() == IdType.ID_WORKER) {

metaObject.setValue(tableInfo.getKeyProperty(), IdWorker.getId());

} else if (tableInfo.getIdType() == IdType.ID_WORKER_STR) {

metaObject.setValue(tableInfo.getKeyProperty(), IdWorker.getIdStr());

MyBatis-plus是一个优秀的持久层框架,它在MyBatis的基础上进行了扩展和增强。MetaObjectHandler是MyBatis-plus提供的一个接口,用于自动填充实体类中的字段值。但有候我们可能会遇到MetaObjectHandler不生效问题。 出现MetaObjectHandler不生效问题可能有以下几个原因: 1. 没有正确配置MetaObjectHandler:在使用MyBatis-plus,需要在配置文件中配置MetaObjectHandler的实现类,并将其注入到SqlSessionFactory中。确保配置正确,使得MyBatis-plus能够正确地识别和使用MetaObjectHandler。 2. 实体类没有使用@TableField注解:在需要自动填充字段上,需要使用@TableField注解进行标记。确保实体类中需要自动填充字段都使用了@TableField注,并设置了相应的属性值。 3. 字段名与列名不一致:如果实体类中的字段名与数据库表中的列名不一致,需要使用@TableField注解value属性指定数据库列名。确保字段名与数据库列名一致,以便MyBatis-plus能够正确地进行自动填充。 4. 数据库表没有设置默认值或触发器:如果需要自动填充字段在数据库表中没有设置默认值或触发器,那么在插入或更新数据,MetaObjectHandler也无法生效。确保数据库表中需要自动填充字段设置了默认值或触发器。 如果以上几点都没有问题,但仍然遇到MetaObjectHandler不生效问题,可以尝试检查MyBatis-plus的版本是否与其他依赖库在冲突,或者查看日志文件以获取更多的错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值