在后端 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_by
与 create_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;
}