MyBatis-Plus 基础教程


在后端 Web 工程中, MyBatis 可谓占据了半壁江山,而 MyBatis Plus 正是在此基础上进行二次开发,提供了更便捷的操作。

往往在一个大型项目中,每一个实体对象所对应的单对象增删改在结构上都是相似的,但每次都认为的手动配置显然过于繁琐。而 MyBatis Plus 则刚好解决了这个难题,其为表对象实体提供了最基本的增删改方法,省去大量重复的工作。

下面就详细介绍如何在 Spring Boot 工程中集成 MyBatis Plus

一、基础服务

1. 依赖引入

万年不变的老规矩,先在工程中引入 MyBatis Plus 相关 Maven 依赖。

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

若在 Spring Boot 3.x 版本中则替换为下述依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>3.5.5</version>
</dependency>

MyBatis Plus 对应的配置也略有不同,配置项为 mybatis-plus,内容如下:

mybatis-plus:
    mapper-locations: classpath:mapper/*.xml
    type-aliases-package: xyz.ibudai.entity
    configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2. 实体类

工程实体类中的属性名称需要和数据库表中名称一致,若表中字段包含下划线则用驼峰代替。

需要注意实体属性必须和表中完全一致,若实体中的某个字段不存在于表中必须通过 @TableField 注解标注,否则项目将无法正常启动。

public class UserInfo extends Model<UserInfo> {

    private Integer id;

    private String name;

    /**
     * 标识表中不存在该字段
     */
    @TableField(exist = false)
    private String gender;

    private String password;
}

二、业务逻辑

1. DAO层

Dao层 通过继承 BaseMapper 泛型类即可继承表对象的基础增删改操作。

public interface UserInfoDao extends BaseMapper<UserInfo> {

}

完成之后你会发现即使 UserInfoDao 接口类中我们并未添加任务接口方法,但仍能使用表对象相关的增删改查方法,这便是 MyBatis Plus 为我们所提供的。

2. Service

(1) Service

Service 接口类通过继承 IService 泛型类即可继承表对象的基础增删改操作。

当然如果你有复杂的业务逻辑处理也可在 UserInfoService 自行添加,操作流程与 MyBatis 一致。

public interface UserInfoService extends IService<UserInfo> {

}

(2) ServiceImpl

同理这里需要继承 ServiceImpl 泛型类。

@Service("userInfoService")
public class UserInfoServiceImpl 
    extends ServiceImpl<UserInfoDao, UserInfo> 
    implements UserInfoService {

}

3. Wapper

通过上面的示例你应该对 MyBatis Plus 有了一个初步的了解。

但你可以发现但我们需要自定义查询或更新等条件时,光上面的配置就不够用了。为此 MyBatis Plus 引入了 Wapper 构造器用于构造多条件等业务场景。

其中 eq() 等价于查询语句中的 where <cloumn> = <value> ,注意方法第一个参数是表字段名而非属性字段名。

public void demo() {
    List<UserInfo> list1 = userInfoService.list(new QueryWrapper<UserInfo>()
            .eq("id", "123"));

    UserInfo userInfo = new UserInfo("123", "Beth", "123456")
    userInfoService.update(userInfo, new UpdateWrapper<UserInfo>()
            .eq("id", "123"));
}

eq() 外其对 SQL 查询条件中的 in or 等关键字等提供了对应的方法,这里不作详细介绍。

三、进阶操作

1. 自动填充

在表结构设计中,常伴随着 create_bycreate_time 等基础属性,而这部分赋值逻辑也往往一致。

因此,在 Mybatis Plus 中提供了 MetaObjectHandler 接口用于实现全局的默认属性自动填充,无需在业务入口编写重复代码。

在定义声明时并不复杂,分别重写 insertFill()updateFill() 方法,故名思意二者作用于新增与更新阶段。

@Component
public class BaseMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("create_by", getLoginUId(), metaObject);
        this.setFieldValByName("create_time", LocalDateTime.now(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("update_by", getLoginUId(), metaObject);
        this.setFieldValByName("update_time", LocalDateTime.now(), metaObject);
    }


    private Long getLoginUId() {
        // 略去
    }
}

而在使用时则通过 @TableField 注解的 fill 属性指定生效范围,取值参考下表:

属性 描述
DEFAULT 默认不生效。
INSERT 作用于插入阶段。
UPDATE 作用于更新阶段。
INSERT_UPDATE 作用于插入与更新阶段。

对应的使用代码示例如下:

public class User {

    @TableField(value = "create_by", fill = FieldFill.INSERT)
    private Long createBy;

    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
    private Long updateBy;

    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录