MyBatis-Plus 入门与使用
- 先
Mapper中定义了很多方法 Service中定义了很多方法
Mapper方法
mybatisplus使得单表查询很方便

BaseMapper内置了很多方法- 继承时要指定 泛型的类型
常见注解
约定

自定义配置
- 不符合约定就要自定义配置


- 更多注解
https://baomidou.com/reference/annotation/
常见配置

核心功能
条件构造器
wrapper就是条件构造器
demo
@Test
void testQueryWrapper() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id", "username", "info", "balance")
.like("username", "o")
.ge("balance", 1000);
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
@Test
void testUpdateQueryWrapper() {
// user 是数据
User user = new User();
user.setBalance(2000);
// wrapper 是条件
QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username", "jack");
userMapper.update(user, wrapper);
}
@Test
void testUpdateWrapper() {
List<Long> ids = List.of(1l, 2l, 3l, 4l);
UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
.setSql("balance = balance-200")
.in("id", ids);
userMapper.update(null, wrapper);
}
// 推荐使用 lambda 模式
@Test
void lambdaQueryWrapper() {
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.select(User::getId, User::getUsername, User::getInfo, User::getBalance)
.like(User::getUsername, "o")
.ge(User::getBalance, 1000);
List<User> users = userMapper.selectList(wrapper);
System.out.println(users);
}
自定义sql
where使用wrapper生成, 其他使用自定义- 下面的
setSql在业务层操作sql语句, 这是不推荐的
select要在业务层进行拼接, 这也是不推荐的
- 下面的

demo
@Test
void testCustomUpdateWrapper() {
List<Long> ids = List.of(1l, 2l, 3l, 4l);
int amount = 200;
// 只写 where条件
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.in("id",ids);
//调用自定义方法
userMapper.updateBalance(wrapper, amount);
}
void updateBalance(@Param("ew") QueryWrapper<User> wrapper,@Param("amount") int amount);
<update id="updateBalance">
update user set balance = balance- #{amount} ${ew.customSqlSegment}</update>
//${ew.customSqlSegment} 拼接前面定义的where条件
service 接口


- userServiceImpl 继承ServiceImpl<UserMapper, User>, 实现 UserService
- 自定义
Service继承IService, 自定义实现类实现自定义接口, 继承默认实现类 Service中有baseMapper这里是父类, 实际获取的是子类 : 上面使用UserMapper extends BaseMapper;因此这里获得的是UserMapper
批量新增
rewriteBatchStatements=true

demo
public interface IUserService extends IService<User> {
}
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService {
}
@Test
void testQuery() {
List<User> list = iUserService.listByIds(List.of(1l,2l,3l,4l));
list.forEach(System.out::println);
}
lambdaQuery
- 条件查询
@Override
public List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {
List<User> list = lambdaQuery()
.like(name != null, User::getUsername, name)
.eq(status != null, User::getStatus, status)
.ge(minBalance != null, User::getBalance, minBalance)
.le(maxBalance != null, User::getBalance, maxBalance)
.list();
return list;
}
- 选择性更新
lambdaUpdate()
.set(User::getBalance, remain)
.set(remain == 0, User::getStatus, 2)
.eq(User::getId, id)
.eq(User::getBalance,user.getBalance())
.update();
总结
- 简单业务如: 根据
id查用户可以直接在controller操作
@RequiredArgsConstructor
public class UserController {
private final IUserService iUserService;
@GetMapping("/{id}")
public UserVO queryById(@PathVariable Long id){
User byId = iUserService.getById(id);
UserVO userVO = new UserVO();
BeanUtils.copyProperties(byId,userVO);
return userVO;
}
}
- 复杂业务 使用
Service, 如果Sql不复杂可以 不用Mapper
@Override
public void deductMoney(Long id, int money) {
// 查询id
User user = getById(id);
// 校验用户状态
if(user==null ||user.getStatus()==2){
throw new RuntimeException("用户状态异常");
}
// 校验余额
if(user.getBalance()<money){
throw new RuntimeException("用户余额不足!");
}
// 扣除余额,
baseMapper.deduct(id,money);
}
- 复杂业务且复杂
Sql可以使用Mapper
@Update("update user set balance = balance-#{money} where id = #{id}")
void deduct(@Param("id") Long id,@Param("money") int money);
- 业务层中简单条件直接调用函数, 复杂的条件可以使用
lambda
@Override
public List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {
List<User> list = lambdaQuery()
.like(name != null, User::getUsername, name)
.eq(status != null, User::getStatus, status)
.ge(minBalance != null, User::getBalance, minBalance)
.le(maxBalance != null, User::getBalance, maxBalance)
.list();
return list;
}
静态工具

- 和
iservice不同在于需要传入class字节码文件
使用场景

AService 中注入 BService, BService 中注入AService导致循环注入, 使用静态方法可以避免.
逻辑删除


枚举处理器

- 加注解

- 添加配置

json处理器

