MyBatis-Plus 入门与使用

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处理器