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 {@Autowiredprivate MUserService mUserService;@Testvoid testQuery() {List<User> users = mUserService.listByIds(List.of(1L,2L,3L));users.forEach(System.out::println);}@Testvoid 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
提供的一些核心功能了!!