MybatisPlus基本查询

通用Mapper

MybatisPlus基本查询_第1张图片

BaseMapper 位于 com.baomidou.mybatisplus.core.mapper 包下,封装了 MybatisPlus 的通用的 CRUD 接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器。

其中:

  • 泛型 T 为任意实体对象
  • 参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键
  • 对象 Wrapper 为条件构造器

MyBatis-Plus 中的基本 CRUD 在内置的 BaseMapper 中都已得到了实现,因此我们继承该接口以后可以直接使用。

本次演示的 CRUD 操作不包含参数带有条件构造器的方法,关于条件构造器将单独在一个章节进行演示。

BaseMapper中提供的CRUD方法:

  • 增加:Insert

    // 插入一条记录
    int insert(T entity);
    

    参数说明

    类型 参数名 描述
    T entity 实体对象
  • 删除:Delete

    // 根据 entity 条件,删除记录
    int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
    // 删除(根据ID 批量删除)
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
    // 根据 ID 删除
    int deleteById(Serializable id);
    // 根据 columnMap 条件,删除记录
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
    

    参数说明

    类型 参数名 描述
    Wrapper wrapper 实体对象封装操作类(可以为 null)
    Collection idList 主键 ID 列表(不能为 null 以及 empty)
    Serializable id 主键 ID
    Map columnMap 表字段 map 对象
  • 修改:Update

    // 根据 whereWrapper 条件,更新记录
    int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper whereWrapper);
    // 根据 ID 修改
    int updateById(@Param(Constants.ENTITY) T entity);
    

    参数说明

    类型 参数名 描述
    T entity 实体对象 (set 条件值,可为 null)
    Wrapper updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
  • 查询:Selete

    // 根据 ID 查询
    T selectById(Serializable id);
    // 根据 entity 条件,查询一条记录
    T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper);
    
    // 查询(根据ID 批量查询)
    List selectBatchIds(@Param(Constants.COLLECTION) Collection idList);
    // 根据 entity 条件,查询全部记录
    List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);
    // 查询(根据 columnMap 条件)
    List selectByMap(@Param(Constants.COLUMN_MAP) Map columnMap);
    // 根据 Wrapper 条件,查询全部记录
    List> selectMaps(@Param(Constants.WRAPPER) Wrapper queryWrapper);
    // 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
    List selectObjs(@Param(Constants.WRAPPER) Wrapper queryWrapper);
    
    // 根据 entity 条件,查询全部记录(并翻页)
    IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
    // 根据 Wrapper 条件,查询全部记录(并翻页)
    IPage> selectMapsPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);
    // 根据 Wrapper 条件,查询总记录数
    Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper);
     

    参数说明

    类型 参数名 描述
    Serializable id 主键 ID
    Wrapper queryWrapper 实体对象封装操作类(可以为 null)
    Collection idList 主键 ID 列表(不能为 null 以及 empty)
    Map columnMap 表字段 map 对象
    IPage page 分页查询条件(可以为 RowBounds.DEFAULT)

    调用Mapper层实现CRUD

    插入

    /**
      * 测试插入一条数据
      * MyBatis-Plus在实现插入数据时,会默认基于雪花算法的策略生成id
      */
    @Test
    public void testInsert(){
        User user = new User();
        user.setAge(22);
        user.setName("zhangsan");
        user.setEmail("[email protected]");
        int result = userMapper.insert(user);
        System.out.println("受影响行数:" + result);
        System.out.println("id自动获取:" + user.getId());
    }
    

    控制台打印查询结果

    MybatisPlus基本查询_第2张图片

    最终执行的结果,所获取的 id 为 1551606573012439042

    这是因为 MyBatis-Plus 在实现插入数据时,会默认基于雪花算法的策略生成 id

    删除

    根据ID删除数据

    调用方法:int deleteById(Serializable id);

    @Test
    public void testDeleteById(){
        int result = userMapper.deleteById(1551606573012439042L);
        System.out.println(result > 0 ? "删除成功!" : "删除失败!");
        System.out.println("受影响的行数为:" + result);
    }
    

    控制台打印查询结果

    MybatisPlus基本查询_第3张图片

    通过ID批量删除数据

    调用方法:int deleteBatchIds(@Param(Constants.COLLECTION) Collection idList);

    @Test
    public void testDeleteBatchIds(){
        List ids = Arrays.asList(1L,2L,3L);
        int result = userMapper.deleteBatchIds(ids);
        System.out.println(result > 0 ? "删除成功!" : "删除失败!");
        System.out.println("受影响的行数为:" + result);
    }
    

    控制台打印查询结果

    MybatisPlus基本查询_第4张图片

    通过Map条件删除数据

    调用方法:int deleteByMap(@Param(Constants.COLUMN_MAP) Map columnMap);

    @Test
    public void testDelteByMap(){
        Map map = new HashMap<>();
        map.put("name", "Billie");
        map.put("age", 24);
        int result = userMapper.deleteByMap(map);
        System.out.println(result > 0 ? "删除成功!" : "删除失败!");
        System.out.println("受影响的行数为:" + result);
    }
    

    控制台打印查询结果

    MybatisPlus基本查询_第5张图片

    修改

    调用方法:int updateById(@Param(Constants.ENTITY) T entity);

    @Test
    public void testUpdateById(){
        User user = new User();
        user.setId(4L);
        user.setName("Sandy");
        user.setAge(27);
        user.setEmail("[email protected]");
        int result = userMapper.updateById(user);
        System.out.println(result > 0 ? "修改成功!" : "修改失败!");
        System.out.println("受影响的行数为:" + result);
    }
    

    控制台打印查询结果

    MybatisPlus基本查询_第6张图片

    查询

    通过ID查询用户信息

    调用方法:T selectById(Serializable id);

    @Test
    public void testSelectById(){
        User user = userMapper.selectById(1L);
        System.out.println(user);
    }
    

    控制台打印查询结果

    MybatisPlus基本查询_第7张图片

    根据多个ID查询多个用户信息

    调用方法:List selectBatchIds(@Param(Constants.COLLECTION) Collection idList);

    @Test
    public void testSelectBatchIds(){
        List ids = Arrays.asList(1L, 2L, 3L);
        List users = userMapper.selectBatchIds(ids);
        users.forEach(System.out::println);
    }
    

    控制台打印查询结果

    MybatisPlus基本查询_第8张图片

    根据Map条件查询用户信息

    调用方法:List selectByMap(@Param(Constants.COLUMN_MAP) Map columnMap);

    @Test
    public void testSelectByMap(){
        Map map = new HashMap<>();
        map.put("age", 20);
        List users = userMapper.selectByMap(map);
        users.forEach(System.out::println);
    }
    

    控制台打印查询结果

    MybatisPlus基本查询_第9张图片

    查询所有用户信息

    调用方法:List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);

    @Test
    public void testSelectList(){
        List users = userMapper.selectList(null);
        users.forEach(System.out::println);
    }
    

    控制台打印查询结果

    MybatisPlus基本查询_第10张图片

    通用Service

    官网地址:https://baomidou.com/pages/49cc81/#service-crud-%E6%8E%A5%E5%8F%A3

    通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆,

    • 泛型 T 为任意实体对象
    • 建议如果存在自定义通用 Service 方法的可能,请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类
    • 对象 Wrapper 为 条件构造器

    MyBatis-Plus 中有一个接口 **IService**和其实现类 ServiceImpl,封装了常见的业务层逻辑,详情查看源码 IService 和 ServiceImpl。

    因此我们在使用的时候仅需在自己定义的**Service接口中继承IService接口,在自己的实现类中实现自己的 Service 并继承ServiceImpl**即可。

    IService中的CRUD方法

    • 增加:Save、SaveOrUpdate

      // 插入一条记录(选择字段,策略插入)
      boolean save(T entity);
      // 插入(批量)
      boolean saveBatch(Collection entityList);
      // 插入(批量)
      boolean saveBatch(Collection entityList, int batchSize);
      
      // TableId 注解存在更新记录,否插入一条记录
      boolean saveOrUpdate(T entity);
      // 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
      boolean saveOrUpdate(T entity, Wrapper updateWrapper);
      // 批量修改插入
      boolean saveOrUpdateBatch(Collection entityList);
      // 批量修改插入
      boolean saveOrUpdateBatch(Collection entityList, int batchSize);
      

      参数说明

      类型 参数名 描述
      T entity 实体对象
      Wrapper updateWrapper 实体对象封装操作类 UpdateWrapper
      Collection entityList 实体对象集合
      int batchSize 插入批次数量
    • 删除:Remove

      // 根据 entity 条件,删除记录
      boolean remove(Wrapper queryWrapper);
      // 根据 ID 删除
      boolean removeById(Serializable id);
      // 根据 columnMap 条件,删除记录
      boolean removeByMap(Map columnMap);
      // 删除(根据ID 批量删除)
      boolean removeByIds(Collection idList);
      

      参数说明

      类型 参数名 描述
      Wrapper queryWrapper 实体包装类 QueryWrapper
      Serializable id 主键 ID
      Map columnMap 表字段 map 对象
      Collection idList 主键 ID 列表
    • 修改:Update

      // 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
      boolean update(Wrapper updateWrapper);
      // 根据 whereWrapper 条件,更新记录
      boolean update(T updateEntity, Wrapper whereWrapper);
      // 根据 ID 选择修改
      boolean updateById(T entity);
      // 根据ID 批量更新
      boolean updateBatchById(Collection entityList);
      // 根据ID 批量更新
      boolean updateBatchById(Collection entityList, int batchSize);
      

      参数说明

      类型 参数名 描述
      Wrapper updateWrapper 实体对象封装操作类 UpdateWrapper
      T entity 实体对象
      Collection entityList 实体对象集合
      int batchSize 更新批次数量
    • 查询:Get、List、Count

      // 根据 ID 查询
      T getById(Serializable id);
      // 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
      T getOne(Wrapper queryWrapper);
      // 根据 Wrapper,查询一条记录
      T getOne(Wrapper queryWrapper, boolean throwEx);
      // 根据 Wrapper,查询一条记录
      Map getMap(Wrapper queryWrapper);
      // 根据 Wrapper,查询一条记录
       V getObj(Wrapper queryWrapper, Function mapper);
      
      
      // 查询所有
      List list();
      // 查询列表
      List list(Wrapper queryWrapper);
      // 查询(根据ID 批量查询)
      Collection listByIds(Collection idList);
      // 查询(根据 columnMap 条件)
      Collection listByMap(Map columnMap);
      // 查询所有列表
      List> listMaps();
      // 查询列表
      List> listMaps(Wrapper queryWrapper);
      // 查询全部记录
      List listObjs();
      // 查询全部记录
       List listObjs(Function mapper);
      // 根据 Wrapper 条件,查询全部记录
      List listObjs(Wrapper queryWrapper);
      // 根据 Wrapper 条件,查询全部记录
       List listObjs(Wrapper queryWrapper, Function mapper);
      
      // 查询总记录数
      int count();
      // 根据 Wrapper 条件,查询总记录数
      int count(Wrapper queryWrapper);
       

      参数说明

      类型 参数名 描述
      Serializable id 主键 ID
      Wrapper queryWrapper 实体对象封装操作类 QueryWrapper
      boolean throwEx 有多个 result 是否抛出异常
      T entity 实体对象
      Function mapper 转换函数
      Map columnMap 表字段 map 对象
      Collection idList 主键 ID 列表
    • 分页:Page

      // 根据 ID 查询
      T getById(Serializable id);
      // 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
      T getOne(Wrapper queryWrapper);
      // 根据 Wrapper,查询一条记录
      T getOne(Wrapper queryWrapper, boolean throwEx);
      // 根据 Wrapper,查询一条记录
      Map getMap(Wrapper queryWrapper);
      // 根据 Wrapper,查询一条记录
       V getObj(Wrapper queryWrapper, Function mapper);
      

      参数说明

      类型 参数名 描述
      IPage page 翻页对象
      Wrapper queryWrapper 实体对象封装操作类 QueryWrapper
    • 链式:Chain

      // 链式查询 普通
      QueryChainWrapper query();
      // 链式查询 lambda 式。注意:不支持 Kotlin
      LambdaQueryChainWrapper lambdaQuery();
      
      // 示例:
      query().eq("column", value).one();
      lambdaQuery().eq(Entity::getId, value).list();
      
      // 链式更改 普通
      UpdateChainWrapper update();
      // 链式更改 lambda 式。注意:不支持 Kotlin
      LambdaUpdateChainWrapper lambdaUpdate();
      
      // 示例:
      update().eq("column", value).remove();
      lambdaUpdate().eq(Entity::getId, value).update(entity);
      
    • 调用Service层操作数据

      我们在自己的 Service 接口中通过继承 MyBatis-Plus 提供的 IService 接口,不仅可以获得其提供的 CRUD 方法,而且还可以使用自身定义的方法。

      • 创建UserService并继承IService

        /**
          * UserService继承IService模板提供的基础功能 
          */
        public interface UserService extends IService {}
        
      • 创建UserService的实现类并继承ServiceImpl

        /**
          * ServiceImpl实现了IService,提供了IService中基础功能的实现 
          * 若ServiceImpl无法满足业务需求,则可以使用自定的UserService定义方法,并在实现类中实现
          */
        @Service
        public class UserServiceImpl extends ServiceImpl implements UserService{}
        

      测试查询记录数

      调用方法:int count();

      @Test
      public void testGetCount(){
          long count = userService.count();
          System.out.println("总记录数:" + count);
      }
      

      控制台打印查询结果

      MybatisPlus基本查询_第11张图片

      测试批量插入

      调用方法:boolean saveBatch(Collection entityList);

      @Test
      public void testSaveBatch(){
          List list = new ArrayList<>();
          for (int i = 1; i <= 10; i++) {
              User user = new User();
              user.setName("Vz" + i);
              user.setAge(20 + i);
              list.add(user);
          }
          boolean result = userService.saveBatch(list);
          System.out.println(result ? "添加成功!" : "添加失败!");
      }
      

      控制台打印查询结果

      MybatisPlus基本查询_第12张图片

      你可能感兴趣的:(MybatisPlus,java,MybatisPlus)