文章目录
1. Mapper.xml别名爆红,程序运行没问题
可能由于你装了上述IDEA插件导致的
2. xml重写selectPage模板方法,导致QueryWrapper.lambda后面的查询条件失效
3. Model继承问题 – 多加一个BaseModel(用于标识公共字段)
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;
}
4. Wrapper的优先级高于实体
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);
}
5. @Version – 仅以实体生效
//实体传过去version的字段值,然后mybatisplus就会生成更新sql
update 表 set version = version + 1 where version = version实体字段值
//wrapper必须设置 eq、set 对应的version字段值,否则不生效
否则只会生成一个where或者set版本值
//如果同时设置实体version 以及 wraper的get、set
会有两个set version版本值 以及两个 where 版本值
6. 构建条件
如果实体以及wrapper都设置了对应的字段值,则会同时两个都会生成,而不会去重优先选一个
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/46398.html