MyBatis-Plus中常用的无SQL父类方法(Lambda)

MyBatis-Plus是一个基于MyBatis的增强脚手架,使用其封装好的各类接口可能在实际开发过程无需手写SQL快速完成业务开发,尤其在JDK1.8后的Lambda语法下使用更为方便

MyBatis-Plus中常用的无SQL父类方法(Lambda)

所属分类: JAVA
专题标签: MyBatis-Plus Lambda 泛型

实现说明

为什么通过MyBatis-Plus能够实现快速开发?
深入查看其结构你会发现,MyBatis-Plus某种意义上来说就是一个已经搭建好的开发脚手架。
通过Spring泛型能力,实际业务Service类继承IService类便可调用父类已经封装好的方法。
此外,业务Mapper类继承BaseMapper同理。
MyBatis-Plus核心类:IService、ServiceImpl、BaseMapper(泛型入参)。
关于泛型本文不再过多赘述,很多SSM和SSH整合教程中均有大量描述。

IService常用方法

本文不会全部列举所有方法,仅对常用的方法举例。
调用方法this.

更新数据

  1. // 插入一条新数据
  2. boolean save(T entity)
  3. // 插入或更新一条数据
  4. // 这里的实现是先查后插(务必注意实体类需要有@TableId主键)
  5. boolean saveOrUpdate(T entity)
  6. // @TableId(value = "id", type = IdType.AUTO) 主键可以是自增也可以是INPUT
  7. // 批量插入
  8. boolean saveBatch(Collection<T> entityList)
  9. // 批量插入或更新(实际应用为了数据可控不经常直接掉这个方法)
  10. boolean saveOrUpdateBatch(Collection<T> entityList)
  11. // 更新数据,实体类需要有@TableId主键
  12. boolean updateById(T entity)
  13. // 通过自定Lambda实现更新
  14. boolean update(Wrapper<T> updateWrapper)

Lambda更新语法

  1. // 直接写在方法内(简单条件)
  2. // 拼接出来的SQL:UPDATE `user` u SET u.`user_name` = 'UPDATE' WHERE u.`id` = 1
  3. this.update(Wrappers.<User>lambdaUpdate().set(User::getUserName,"UPDATE").eq(User::getId,1));
  4. // 条件拼接(复杂拼接)
  5. // 此处简单举例,理解其中的意思即可
  6. LambdaUpdateWrapper<User> updateWrapper = Wrappers.lambdaUpdate();
  7. if(StringUtils.isNotBlank(user.getUserName())){
  8. updateWrapper.set(User::getUserName,user.getUserName());
  9. }
  10. if(user.getId() !=null) {
  11. updateWrapper.eq(User::getId,user.getId());
  12. }
  13. this.update(updateWrapper);

查询数据

  1. // 根据主键查询对象
  2. T getById(Serializable id)
  3. // 根据自定义Lambda查询对象
  4. // 务必注意如果返回结果为多条getOne会报错
  5. T getOne(Wrapper<T> queryWrapper)
  6. // 根据自定义Lambda数目
  7. int count(Wrapper<T> queryWrapper)
  8. // 查询全表数据
  9. List<T> list()
  10. // 根据自定义Lambda查询列表
  11. List<T> list(Wrapper<T> queryWrapper)
  12. // 查询全表分页
  13. // 返回可以是IPage接口也可以是任意的IPage实现类
  14. <E extends IPage<T>> E page(E page)
  15. // 根据自定义Lambda查询分页
  16. <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper)
  17. // 根据自定义Lambda查询一个Map类型的列表
  18. // Map类型的返回比较适用于自行封装的方法
  19. // 比如有很多类似的业务表想进行统一封装查询就可以用Map返回
  20. List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper)

Lambda查询语法

  1. // 如上方的更新一样,查询也可以直接入参到方法也可以单独写
  2. // 以分页举例
  3. LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery();
  4. if(StringUtils.isNotBlank(user.getUserName())){
  5. queryWrapper.like(User::getUserName,user.getUserName());
  6. }
  7. if(user.getId() !=null) {
  8. queryWrapper.eq(User::getId,user.getId());
  9. }
  10. this.page(page,queryWrapper);

删除方法

  1. // 现阶段绝大多数系统都会采用软删除模式
  2. // 修改如status字段进行数据隐藏,因此删除的方法几乎不怎么用
  3. // 基于主键删除
  4. boolean removeById(Serializable id)
  5. // 基于自定义Lambda删除
  6. boolean remove(Wrapper<T> queryWrapper)

BaseMapper常用方法

实际上IService中有很多方法都是直接或间接调用BaseMapper完成数据库操作的。
在业务Service想要使用Mapper无需注入,直接this.baseMapper.即可。

常用方法

  1. // 插入数据(等同于save())
  2. int insert(T entity)
  3. // 根据自定义Lambda查询对象(等同于getOne())
  4. int insert(T entity)T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)

BaseMapper使用说明

一般我们如果需要调用MyBatis-Plus提供的方法时,不怎么获取用this.baseMapper操作。
this.baseMapper主要作用是调用自己在业务Mapper中定义的方法。

  1. public interface UserMapper extends BaseMapper<User> {
  2. /**
  3. * 根据页面定制对象查询用户
  4. * @param page
  5. * @param status
  6. * @return
  7. */
  8. IPage<UserVo> pageForVo(Page page, Integer status);
  9. }
  10. // UserServiceImpl可以直接调用
  11. this.baseMapper.pageForVo(page,null);

相关文章