MyBatis-Plus 是 MyBatis 的增强工具包,提供了许多便捷的数据库操作方法和增强功能,极大地简化了与数据库的交互。以下是一些 MyBatis-Plus 中常用的方法及其使用方法:
常用方法
-
通用 CRUD 方法:
insert(entity)
:插入一条记录updateById(entity)
:根据ID更新一条记录deleteById(id)
:根据ID删除一条记录selectById(id)
:根据ID查询一条记录selectList(wrapper)
:根据条件查询记录列表selectPage(page, wrapper)
:根据条件分页查询记录列表
-
条件构造器 Wrapper:
QueryWrapper
:用于构建查询条件UpdateWrapper
:用于构建更新条件LambdaQueryWrapper
:支持 Lambda 表达式的查询条件构造器
-
分页查询:
Page<T>
:分页查询结果的封装类,包含总数、当前页数据等信息
-
批量操作:
insertBatch(entities)
:批量插入记录updateBatchById(entities)
:根据ID批量更新记录
-
逻辑删除:
deleteById(id)
:物理删除deleteByIdWithFill(entity)
:逻辑删除,填充删除字段(如deleted
)
-
乐观锁:
updateById(entity)
:支持乐观锁的更新方法,需要在实体类中使用@Version
注解标记乐观锁字段
-
自动填充:
@TableField(fill = FieldFill.INSERT)
:自动填充字段,可用于创建时间、更新时间等场景
-
常用条件查询:
eq(column, value)
:等于 (=
),其中column
是字段名,value
是要比较的值。ne(column, value)
:不等于 (<>
或!=
)。gt(column, value)
:大于 (>
).ge(column, value)
:大于等于 (>=
).lt(column, value)
:小于 (<
).le(column, value)
:小于等于 (<=
).like(column, value)
:模糊匹配 (LIKE
),自动添加%
符号。likeLeft(column, value)
:左模糊匹配 (LIKE
),只在值后面添加%
。likeRight(column, value)
:右模糊匹配 (LIKE
),只在值前面添加%
。in(column, Collection<?> values)
:在给定的集合中 (IN
)。notIn(column, Collection<?> values)
:不在给定的集合中 (NOT IN
)。between(column, Object val1, Object val2)
:在两个值之间 (BETWEEN
和AND
)。notBetween(column, Object val1, Object val2)
:不在两个值之间 (NOT BETWEEN
和AND
)。isNull(column)
:检查字段是否为NULL
。isNotNull(column)
:检查字段是否不为NULL
。orderByAsc(column)
:按字段升序排序。orderByDesc(column)
:按字段降序排序。last(String sql)
:执行原生 SQL 片段,如LIMIT
,OFFSET
等。or()
:开始一个新的OR
条件组。and()
:开始一个新的AND
条件组。
使用示例
1. 插入一条记录
User user = new User();
user.setName("John");
user.setAge(25);
user.setEmail("john@example.com");
userMapper.insert(user);
2. 根据ID查询一条记录
User user = userMapper.selectById(1L);
3. 条件查询
// 创建条件构造器
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name","John").between("age", 20, 30).orderByDesc("age");
// 查询符合条件的记录列表
List<User> userList = userMapper.selectList(wrapper);
4. 分页查询
// 创建分页对象
Page<User> page = new Page<>(1, 10);
// 第1页,每页10条记录
// 创建条件构造器
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 20);
// 分页查询
Page<User> userPage = userMapper.selectPage(page, wrapper);
// 获取分页后的数据列表
List<User> records = userPage.getRecords();
5. 更新记录
User user = userMapper.selectById(1L);
user.setAge(26);
userMapper.updateById(user);
6. 删除记录
userMapper.deleteById(1L);
7. 乐观锁更新
User user = userMapper.selectById(1L);
user.setAge(user.getAge() + 1);
userMapper.updateById(user);
8. 逻辑删除
userMapper.deleteByIdWithFill(new User(1L));
// 填充逻辑删除字段
9. LambdaQueryWrapper
假设我们有一个 User
类,它有 id
, name
, age
, gender
等属性。
1import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
2
3// 假设这是我们的 User 映射器接口
4interface UserMapper extends BaseMapper<User> {}
5
6// 使用 LambdaQueryWrapper 查询
7public List<User> findUsers() {
8 // 创建一个 LambdaQueryWrapper 对象
9 LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
10
11 // 添加查询条件,这里查询 name 为 "John Doe" 的用户
12 queryWrapper.eq(User::getName, "John Doe");
13
14 // 执行查询并返回结果列表
15 return userMapper.selectList(queryWrapper);
16}
链式调用
你可以连续添加多个查询条件,利用 LambdaQueryWrapper
的链式调用特性:
1public List<User> findUsersByCriteria() {
2 LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
3
4 // 可以连续添加多个条件
5 queryWrapper
6 .eq(User::getName, "John Doe")
7 .gt(User::getAge, 30)
8 .like(User::getGender, "M");
9
10 return userMapper.selectList(queryWrapper);
11}
动态查询条件
如果查询条件基于运行时变量或逻辑判断,可以使用 ObjectUtils.isNotEmpty()
或者自定义的逻辑来决定是否添加某个条件:
1public List<User> findUsersWithDynamicConditions(User criteria) {
2 LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
3
4 if (ObjectUtils.isNotEmpty(criteria.getName())) {
5 queryWrapper.like(User::getName, criteria.getName());
6 }
7 if (ObjectUtils.isNotEmpty(criteria.getAge())) {
8 queryWrapper.eq(User::getAge, criteria.getAge());
9 }
10
11 return userMapper.selectList(queryWrapper);
12}
排序
你还可以添加排序条件:
1public List<User> findUsersOrderByAge() {
2 LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
3
4 // 添加排序条件
5 queryWrapper.orderByAsc(User::getAge);
6
7 return userMapper.selectList(queryWrapper);
8}