MyBatis-Plus:问题解决

x33g5p2x  于2022-06-27 转载在 其他  
字(3.0k)|赞(0)|评价(0)|浏览(579)

1. Mapper.xml别名爆红,程序运行没问题

可能由于你装了上述IDEA插件导致的

解决方案

2. xml重写selectPage模板方法,导致QueryWrapper.lambda后面的查询条件失效

改成Bean对象入参

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都设置了对应的字段值,则会同时两个都会生成,而不会去重优先选一个

相关文章