Mybatis Plus 空字符串插入问题引起的思考

作者:微信小助手

发布时间:2024-11-25T05:58:35

在这篇文章中,结合笔者在工作中使用到 Mybatis Plus 的过程中遇到的空字符串丢失的问题,谈一谈对 Mybatis Plus 的一些看法。由于项目历史问题,使用到的 Mybatis Plus 的版本如下:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0-beta</version>
</dependency>

一、问题背景

我们存在如下数据库表:

create table ad_person_send_rule
(
    id                  bigint unsigned auto_increment
        primary key,
    status              tinyint(3)                default 1                 not null comment '状态',
    operator_user       varchar(128charset utf8 default ''                not null comment '更新人',
    account_type        varchar(10charset utf8  default ''                not null comment '账户类型',
    account_kinds       varchar(10charset utf8  default ''                not null comment '账户性质',
    include_account_ids text charset utf8                                   null comment '允许的账户id',
    exclude_account_ids text charset utf8                                   null comment '排除账户id',
    create_time         timestamp                 default CURRENT_TIMESTAMP not null comment '创建时间',
    update_time         timestamp                 default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间'
)

对于 text 类型的 exclude_account_ids 字段,是不能设置默认值的,这是由于 MySQL 5.7 的严格模式导致的,什么都不写的话只能为空。对于业务来说,exclude_account_ids 空字符串是有意义的,所以在某些情况下,我们需要直接插入空字符串。

二、Mybatis Plus 执行插入过程丢失空字符串

构建对应的数据库实体类:

public class AdPersonSendRule implements Serializable {
    @TableField(exist = false)
    private static final long serialVersionUID = -3646240230891328158L;
    @TableId(type = IdType.AUTO)
    private Long id;
    private Integer status;
    private String operatorUser;
    private String accountType;
    private String accountKinds;
    private String includeAccountIds;
    private String excludeAccountIds;
    private Date createTime;
    private Date updateTime;
}

执行插入操作:

public void createPersonAuditRuleTest() {
    PersonAuditRuleRequest personAuditRuleRequest = new PersonAuditRuleRequest();
    personAuditRuleRequest.setIncludeAccountIDs("129,240,9123,100");
    // 设置为空字符串
    personAuditRuleRequest.setExcludeAccountIDs("");
    personAuditRuleRequest.setAccountKinds(new HashSet<>());
    personAuditRuleRequest.setAccountTypes(new HashSet<>());
    Result robotAuditRule = personAuditController.createPersonAuditRule(personAuditRuleRequest);
    log.info("插入结果结果为:{}", JSONUtil.toJsonStr(robotAuditRule));
}

其中我们的 excludeAccountIds 字段的值为空字符串,数据库的插入结果为:

若把 excludeAccountIds 字段上标注 @TableField 注解后,数据库中插入结果为:

可见,没有带 @TableField 注解时,插入空字符串对应的值为 null,而带了 @TableField 注解时,插入空字符串对应的值为空字符串,这才是我想要的结果,但是,为什么会造成�