可能由于你装了上述IDEA插件导致的
解决方案
改成Bean对象入参
BaseDB.java
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class BaseDB<T extends BaseDB<?>> extends Model<T> {
private static final long serialVersionUID = 3253505422347170166L;
/** 主键 - 记录插入自动填充主键处理{@path application.yml} */
@TableId
private String id;
@TableField(fill = FieldFill.INSERT)
private String createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateTime;
/** 记录是否被逻辑删除:0未删除 1逻辑删除 - 逻辑处理值定义{@path application.yml}*/
@TableField
@TableLogic
private Integer isDel;
/**
* 乐观锁(记录的被修改数)
*
* 很鸡肋,需要通过代码查出记录然后手动取此对象的version给准备update的对象,或者直接在查出记录上进行update
*/
@TableField
@Version
private Integer version;
}
SysUser.java
@Data
@ToString(callSuper=true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@TableName("sys_user")
public class SysUser extends BaseDB<SysUser> implements Serializable {
private static final long serialVersionUID = 2095940921263481761L;
/**
* 用户昵称 - 如果没有设置昵称直接使用账户名显示
*/
private String nickName;
/**
* 头像图片地址
*/
private String headUrl;
/**
* 账户名
*/
private String loginName;
/**
* 手机号
*/
private String phoneNumber;
/**
* 邮箱
*/
private String email;
/**
* 性别
*/
private Integer gender;
/**
* 个性签名
*/
private String personalMotto;
//@ApiModelProperty("我的分类专栏,逗号分隔 - article_category表的id")
//private String myArticleCategory;
/**
* 最近登录时间 - 格式 - yyyyMMddHHmmss
*/
private String lastLoginTime;
/**
* 登录状态:0未登录 1单设备登陆 2多设备登陆
*/
private Integer loginStatus;
/** 账户禁用状态:0账户可使用 1账户不可使用(封号) */
private Integer disabledStatus;
/**
* 密码
*/
private String password;
}
MyMetaObjectHandler.java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", String.class, DatePattern.NORM_DATETIME_FORMATTER.format(LocalDateTime.now()));
this.strictInsertFill(metaObject, "updateTime", String.class, DatePattern.NORM_DATETIME_FORMATTER.format(LocalDateTime.now()));
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", String.class, DatePattern.NORM_DATETIME_FORMATTER.format(LocalDateTime.now()));
}
}
test5.java
/**
* Active Record模式
*/
@Test
public void test5() {
//把wrapper中的upateTime去掉就会使用实体的,如果实体中也没有设置updatetime则使用MyMetaObjectHandler的设置值
boolean updateFlag = new SysUser().setUpdateTime(DatePattern.NORM_DATETIME_FORMAT.format(DateUtil.endOfMonth(new Date())))
.update(Wrappers.<SysUser>lambdaUpdate()
.set(SysUser::getEmail, "2329073340@qq.com")
//到时数据库使用的是这里
.set(SysUser::getUpdateTime, DatePattern.NORM_DATETIME_FORMAT.format(DateUtil.beginOfMonth(new Date())))
.eq(SysUser::getId, "6d72c93aa292cf2ca2e789919a5e7bdc"));
Console.log("更新状态:{}", updateFlag);
}
//实体传过去version的字段值,然后mybatisplus就会生成更新sql
update 表 set version = version + 1 where version = version实体字段值
//wrapper必须设置 eq、set 对应的version字段值,否则不生效
否则只会生成一个where或者set版本值
//如果同时设置实体version 以及 wraper的get、set
会有两个set version版本值 以及两个 where 版本值
如果实体以及wrapper都设置了对应的字段值,则会同时两个都会生成,而不会去重优先选一个
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_39651356/article/details/125328387
内容来源于网络,如有侵权,请联系作者删除!