概述
MybatisPlus的宗旨是只做增强,不做修改
它的目的是简化sql编写流程
核心能力
BaseMapper
MybatisPlus在原始Mapper的基础上封装了一层BaseMapper,其中提供了简单的默认方法实现:
public interface BaseMapper<T> extends Mapper<T> {
……
default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) {
List<T> list = this.selectList(queryWrapper);
// 抄自 DefaultSqlSession#selectOne
if (list.size() == 1) {
return list.get(0);
} else if (list.size() > 1) {
throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
} else {
return null;
}
}
default boolean exists(Wrapper<T> queryWrapper) {
Long count = this.selectCount(queryWrapper);
return null != count && count > 0;
}
……
}
MybatisPlus提供的增删改查(CRUD)操作:
插入(Insert):通过 save 方法自动生成插入语句。
删除(Delete):通过 remove 方法自动生成删除语句,支持通过实体删除和通过条件构造器删除。
更新(Update):通过 update 方法自动生成更新语句,支持通过实体更新和通过条件构造器更新。
查询(Select):通过 selectById、selectByMap、selectList、selectOne 等方法自动生成查询语句。
即使用最简单的CRUD方法时,可以不需要编写Mapper的xml映射,直接调用接口即可,那么如果只需要用这几个简单方法的Mapper,甚至只需要一个空实现即可
Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo>{
}Wrapper - 包装器
MybatisPlus的强大之处在于它的一个包装器机制
可以让开发者不需要编写sql就能实现一些条件语句开发
包装器有:
AbstractWrapper:这是⼀个抽象基类, 提供了所有 Wrapper 类共有的方法和属性。详细参考官网介绍: 条件构造器
QueryWrapper:用于构造查询条件, 在AbstractWrapper的基础上拓展了⼀个select方法, 允许指定查询字段。
UpdateWrapper: 用于构造更新条件, 可以在更新数据时指定条件。
LambdaQueryWrapper:基于 Lambda 表达式的查询条件构造器, 它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。
LambdaUpdateWrapper: 基于 Lambda 表达式的更新条件构造器, 它允许你使⽤ Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。
其中常用的方法包括:
lt : "less than" 的缩写,表示小于.
le : "less than or equal to"的缩写,表示小于等于
ge : "greater than or equal to" 的缩写,表示大于等于.
gt : "greater than" 的缩写,表示大于.
eq : "equals" 的缩写,表示等于.
ne : "not equals" 的缩写,表示不等于.
in:用于设置单个字段的 IN 条件,即字段的值在给定的集合中。
not in:用于设置单个字段的 NOT IN 条件,即字段的值不在给定的集合中。
like:用于设置单个字段的 LIKE 条件。
notlike:用于设置单个字段的 NOT LIKE 条件。
likeLeft:用于设置单个字段的右模糊匹配条件。
likeRight:用于设置单个字段的左模糊匹配条件。
notLikeLeft:用于设置单个字段的非右模糊匹配条件。
notLikeRight:用于设置单个字段的非左模糊匹配条件。
orderBy:可以生成 SQL 语句中的 ORDER BY 子句。
having:用于设置 HAVING 子句,通常与 GROUP BY 一起使用,用于对分组后的数据进行条件筛选。
QueryWrapper
QueryWrapper并不只用于查询语句,无论是修改、删除、查询,都可以使用QueryWrapper来构建查询条件
@Test
void testQueryWrapper(){
QueryWrapper<Userinfo> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "username", "password", "age")
.eq("age", 18)
.like("username", "min");
userInfoMapper.selectList(queryWrapper).forEach(System.out::println);
}
@Test
void testQueryWrapper2(){
QueryWrapper<Userinfo> queryWrapper = new QueryWrapper<>();
queryWrapper.lt("age", 20);
Userinfo userinfo = new Userinfo();
userinfo.setDeleteflag(1);
userInfoMapper.update(userinfo, queryWrapper);
}
@Test
void testUpdateWrapper(){
UpdateWrapper<Userinfo> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("delete_flag", 2)
.lt("age", 20);
userInfoMapper.update(updateWrapper);
}UpdateWrapper
用于sql更新
@Test
void testUpdateWrapper2(){
UpdateWrapper<Userinfo> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("delete_flag", 0).set("age", 6)
.in("id", List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}LambdaQueryWrapper/LambdaUpdateWrapper
QueryWrapper 和 UpdateWrapper存在⼀个问题,就是需要写死字段名,如果字段名发生变更,可能会因为测试不到位酿成事故。
MyBatis-Plus 提供了⼀种基于Lambda表达式的条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名,也提高了代码的可读性和可维护性
@Test
void testLambdaQueryWrapper(){
QueryWrapper<Userinfo> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.select(Userinfo::getId, Userinfo::getUsername, Userinfo::getPassword)
.eq(Userinfo::getAge, 18)
.like(Userinfo::getUsername, "min");
userInfoMapper.selectList(queryWrapper).forEach(System.out::println);
}
@Test
void testLambdaUpdateWrapper(){
UpdateWrapper<Userinfo> updateWrapper = new UpdateWrapper<>();
// updateWrapper.set("delete_flag", 0).set("age", 6).in("id", List.of(1,2,3));
updateWrapper.lambda()
.set(Userinfo::getDeleteflag, 0)
.set(Userinfo::getAge, 6)
.in(Userinfo::getId, List.of(1,2,3));
userInfoMapper.update(updateWrapper);
}注解和映射
可以通过表映射来把表具象化到代码中:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@TableName("test_customer")
public class Customer {
@TableId(value = "customer_id", type = IdType.AUTO)
private String customerId;
private String customerName;
private String customerAddress;
}常用的注解包括:
@TableId注解用于制定主键,value属性用于映射主键字段名,type表示主键生成方式
AUTO自增
NONE雪花算法
INPUT开发者必须主动赋值
ASSIGN_ID:MP分配
ASSIGN_UUID:分配UUID
@TableName用于处理非小驼峰转下划线形式的表名
@TableField用于指定表属性
updateStrategy:更新策略,NEVER代表从不更新;IGNORED代表不判断;NOT_NULL代表非空则更新
insertStrategy:插入策略
exist:表示是否是数据库字段
select:表示是否查询该字段
fill:是否自动填充
MyBatisPlus没有直接的联合主键的定义方式,只能选取一个属性作为逻辑主键
评论区