1. 自定义SQL
MyBatisPlus擅长where条件构建,对于复杂的sql语句,我们可以用MyBatisPlus来构建复杂的where条件,然后自己定义sql语句中剩下的部分。
1.1 基于Wrapper构建where条件
@Test
void testCustomUpdate(){
//1.更新条件
List<Long> ids = List.of(1L,2L,4L);
int amount = 200;
//2.定义条件
QueryWrapper<User> wrapper = new QueryWrapper<User>().in("id",ids);
//3.调用自定义sql方法
userMapper.updateBalanceByIds(wrapper,amount);
}
1.2 自定义sql
mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
自定义sql,并使用wrapper
public interface UserMapper extends BaseMapper<User> {
@Select("UPDATE user SET balance = balance - #{money} ${ew.customSqlSegment}")
void deductBalanceByIds(@Param("money") int money, @Param("ew") QueryWrapper<User> wrapper);
}
sql语句可以在Mapper方法中写,也可以在xml文件中写,写法如下:
@Mapper
public interface UserMapper extends BaseMapper<User> {
void updateBalanceByIds(@Param("ew") QueryWrapper<User> wrapper,@Param("amount") int amount);
}
<update id="updateBalanceByIds">
UPDATE user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>
2. service接口
2.1 IService接口
MybatisPlus不仅提供了BaseMapper,还提供了通用的Service接口及默认实现,封装了一些常用的service模板方法。通用接口为IService,默认实现为
ServiceImpl,其中封装的方法可以分为以下几类:
- save:新增
- remove:删除
- update:更新
- get:查询单个结果
- list:查询集合结果
- count:计数
- page:分页查询
2.2 CRUD
我们先俩看下基本的CRUD接口。
新增:
-
save是新增单个元素
-
saveBatch是批量新增
-
saveOrUpdate是根据id判断,如果数据存在就更新,不存在则新增
-
saveOrUpdateBatch是批量的新增或修改
删除:
-
removeById:根据id删除
-
removeByIds:根据id批量删除
-
removeByMap:根据Map中的键值对为条件删除
-
remove(Wrapper):根据Wrapper条件删除
-
removeBatchByIds:暂不支持
修改:
-
updateById:根据id修改
-
update(Wrapper):根据UpdateWrapper修改,Wrapper中包含set和where部分
-
update(T,Wrapper):按照T内的数据修改与Wrapper匹配到的数据
-
updateBatchById:根据id批量修改
Get:
-
getById:根据id查询1条数据
-
getOne(Wrapper):根据Wrapper查询1条数据
-
getBaseMapper:获取Service内的BaseMapper实现,某些时候需要直接调用Mapper内的自定义SQL时可以用这个方法获取到Mapper
List:
-
listByIds:根据id批量查询
-
list(Wrapper):根据Wrapper条件查询多条数据
-
list():查询所有
Count:
-
count():统计所有数量
-
count(Wrapper):统计符合Wrapper条件的数据数量
getBaseMapper:当我们在service中要调用Mapper中自定义SQL时,就必须获取service对应的Mapper,就可以通过这个方法:
2.3 基本用法
使用流程:
1.自定义Service接口继承Iservice接口
public interface IUserService extends IService<User> {
}
2.自定义Service实现类,实现自定义接口并继承ServiceImpl类
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService{
}
3.调用Service实现类
@SpringBootTest
class IUserServiceTest {
@Autowired
private IUserService userService;
@Test
void testSaveUser(){
User user = new User();
user.setId(5L);
user.setUsername("LiLei2");
user.setPassword("123");
user.setPhone("18688990011");
user.setBalance(200);
user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}"); user.setCreateTime(LocalDateTime.now());
user.setUpdateTime(LocalDateTime.now());
userService.save(user);
}
@Test
void testQuery() {
List<User> users = userService.listByIds(List.of(1L, 2L, 4L));
users.forEach(System.out::println);
}
}