MybatisPlus 核心功能
文章目录
- MybatisPlus 核心功能
- 1. 条件构造器
- 1.1 QueryWrapper
- 1.2 LambdaQueryWrapper(推荐)
- 1.3 UpdateWrapper
- 1.4 LambdaUpdateWrapper
- 2. 自定义SQL
- 3. Service接口
1. 条件构造器
当涉及到查询或修改语句时,MybatisPlus
需要使用条件构造器来进行条件判断,它提供了以下条件构造器:
QueryWrapper
和LambdaQueryWrapper:用来构建select、delete、update的where条件部分UpdateWrapper
和LambdaUpdateWrapper
:通常只有在set语句比较特殊的时候才使用
1.1 QueryWrapper
QueryWrapper下有许多方法可以使用,用来充当指定where条件部分:
select
:指定需要查询的字段eq
:和指定内容相等的数据like
:进行模糊查询ge
:比指定数大的数据le
:比指定数小的数据
代码示例
①查询出名字中带o的,存款小于等于1000元的人的id、username、info、balance字段:
@Test
void testQueryWrapper() {
// 1. 构建查询条件
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.select("id", "username", "info", "balance")
.like("username", "o")
.le("balance", 1000);
// 2. 查询
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
②更新用户名为jack的用户的余额为2500:
@Test
void testUpdateByQueryWrapper1() {
// 1. 要更新的数据
User user = new User();
user.setBalance(2500);
// 2. 更新的条件
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.eq("username", "jack");
// 3. 更新数据
userMapper.update(user, wrapper);
}
③删除名为Thomas的数据:
@Test
void testDeleteByQueryWrapper() {
// 1. 删除的条件
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.eq("username", "Thomas");
// 2. 删除数据
userMapper.delete(wrapper);
}
1.2 LambdaQueryWrapper(推荐)
LambdaQueryWrapper
的具体作用与QueryWrapper
一样,用来构建select、delete、update的where条件部分,但它与QueryWrapper
的不同在于,LambdaQueryWrapper
更能防止硬编码,因此更推荐使用LambdaQueryWrapper。
LambdaQueryWrapper在操作上和的不同点便是使用了类名::方法的方式来填充数据,而不是将查询条件“写死”。
代码示例
①查询出名字中带o的,存款小于等于1000元的人的id、username、info、balance字段:
@Test
void testLambdaQueryWrapper() {
// 1.构建查询条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
.select(User::getId, User::getUsername, User::getInfo, User::getBalance)
.like(User::getUsername, "o")
.le(User::getBalance, 1000);
// 2.查询
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
②更新用户名为jack的用户的余额为5000:
@Test
void testUpdateByLambdaQueryWrapper() {
// 1. 要更新的数据
User user = new User();
user.setBalance(5000);
// 2. 更新的条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
.eq(User::getUsername, "XiaoMi");
// 3.更新数据
userMapper.update(user, wrapper);
}
相较于QueryWrapper
更推荐使用LambdaQueryWrapper
来作为条件构造器!!
1.3 UpdateWrapper
当set语句
比较特殊时可以使用UpdateWrapper
来进行条件构造,如加减数据:
代码示例
更新id为1,2,4的用户的余额,扣200:
@Test
void testUpdateWrapper1() {
List<Long> ids = List.of(1L, 2L,4L);
UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
.setSql("balance = balance - 200")
.in("id", ids);
userMapper.update(null, wrapper);
}
1.4 LambdaUpdateWrapper
使用方式与UpdateWrapper
基本相同,只是将指定字段修改为可变字段:
代码示例
更新id为1,2,4的用户的余额,扣200:
@Test
void testLambdaUpdateWrapper() {
List<Long> ids = List.of(1L, 2L,4L);
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<User>()
.setSql("balance = balance - 200")
.in(User::getId, ids); // 这里与`UpdateWrapper`不同
userMapper.update(null, wrapper);
}
2. 自定义SQL
在MyBatisPlus中,当我们需要使用复杂的sql语句进行操作时,往往是通过自定义SQL+条件构造器的方式来解决问题的!即通过条件构造器来构建复杂的Where的条件,剩余部分则通过自定义sql解决:
代码示例
更新id为1,2,3的用户的余额,扣指定金额:
-
基于Wrapper构建Where条件
@Test void testCustomSqlUpdate1() { // 1. 更新条件 List<Long> ids = List.of(1L, 2L, 3L); int amount = 200; // 2. 定义条件 LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>() .in(User::getId, ids); // 3. 调用自定义SQL方法 userMapper.updateBalanceByLBIds(wrapper, amount); }
-
在Mapper方法参数中通过Param注解声明wrapper变量名称, 必须写ew
public interface UserMapper extends BaseMapper<User> { void updateBalanceByLBIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount); }
-
编写自定义sql,并使用Wrapper充当条件
<update id="updateBalanceByLBIds"> update tb_user set balance = balance - #{amount} ${ew.customSqlSegment} </update>
3. Service接口
MybatisPlus除了给我们提供快速实现CURD的功能外,也为我们提供了可直接使用的Service接口:
IService接口
为我们提供了一系列可以封装好的接口,而我们需要做的就是继承然后使用它:
使用流程:
-
自定义Service接口并继承IService接口
public interface MUserService extends IService<User> { // 注意需要给上述泛型提供实体类 }
-
自定义Service实现类,实现自定义接口并继承ServiceImpl接口
@Service public class MUserServiceImpl extends ServiceImpl<UserMapper, User> implements MUserService { // 注意需要给上述泛型提供Mapper接口和实体类 }
测试一下:
@SpringBootTest
class MUserServiceImplTest {
@Autowired
private MUserService mUserService;
@Test
void testQuery() {
List<User> users = mUserService.listByIds(List.of(1L,2L,3L));
users.forEach(System.out::println);
}
@Test
void testInsert() {
User user = new User();
user.setUsername("XiaoTian");
user.setPassword("11111");
user.setPhone("10085");
user.setBalance(200);
user.setInfo(UserInfo.of(25, "体育老师", "man"));
user.setCreateTime(LocalDateTime.now());
user.setUpdateTime(LocalDateTime.now());
mUserService.save(user);
}
}
以上便是MybatisPlus
提供的一些核心功能了!!