MP2️⃣基础 CRUD & 分页查询

1、基础 CRUD(❗)

① 增

  1. 自动生成主键 ID:默认采用雪花算法。

    User user = new User();
    user.setName("ump1");
    user.setPassword("123456");
    
    userDao.insert(user);
    
  2. 自动根据实体类属性,生成动态 SQL(只插入非 null 的字段)

    示例:user 没有设置 age,插入时不会有 age)

    INSERT INTO mp_user ( id, name, password ) VALUES ( ?, ?, ? )
    

② 删

删除方法参数为 id 或 entity,但本质上都是通过 ID 进行删除。

同理,批量删除的参数可以是 idList 或 entityList。

Hint:本例中 id 字段是 bigint 类型,对应 Java 的 long 类型。

单个

  • 代码

    // 根据ID
    userDao.deleteById(id);
    // 根据entity,本质也是获取id
    User user = new User();
    user.setId(id);
    userDao.deleteById(user);
    
  • SQL

    DELETE FROM mp_user WHERE id=?
    

批量

  • 代码

    // 根据ID
    Long[] idList = {id1, id2};
    userDao.deleteBatchIds(Arrays.asList(idList));
    // 根据entity
    User u1 = new User();
    u1.setId(id1);
    User u2 = new User();
    u2.setId(id2);
    User[] userList = {u1, u2};
    userDao.deleteBatchIds(Arrays.asList(userList));
    
  • SQL:自动根据 ID 个数,拼接动态 SQL

    DELETE FROM mp_user WHERE id IN {?, ?}
    

③ 改

  • 通过 ID 确定要更新的记录。

    User user = new User();
    user.setId(id);
    user.setName("new name");
    
    userDao.updateById(user);
    
  • 自动根据 entity 的属性赋值情况,拼接动态 SQL(只更新非 null 的属性)。

    UPDATE mp_user SET name=? WHERE id=?
    

④ 查

  • ID

  • ID 列表:自动根据 ID 个数,拼接动态 SQL。

  • 查询所有(参数是 Wrapper,null 表示不加查询条件)

    // 单个
    userDao.selectById(id);
    // 批量
    Long[] idList = {id1, id2, id3};
    userDao.selectBatchIds(Arrays.asList(idList));
    // 所有
    userDao.selectList(null);
    

2、分页(❗)

  • Page:分页模型(可设置分页参数,保存查询数据记录)。

  • Wrapper:条件构造器(可为 null)。

    <P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    

2.1、分页拦截器

要使分页功能生效,需要配置分页拦截器

  1. @Configuration:创建 MP 配置类。

  2. @Bean:创建拦截器对象,添加分页拦截器。

    @Configuration
    public class MybatisPlusConfig {
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            MybatisPlusInterceptor mpi = new MybatisPlusInterceptor();
            mpi.addInnerInterceptor(new PaginationInnerInterceptor());
            return mpi;
        }
    }
    

2.2、使用

从日志可看出,MP 基于 LIMIT 物理分页。

  1. 创建 Page 对象,设置分页参数(当前页码,页面大小)

  2. 分页查询

  3. 获取结果

    IPage<User> page = new Page<>(1, 5);
    userDao.selectPage(page, null);
    // 当前页码、页面大小
    System.out.println(page.getCurrent());
    System.out.println(page.getSize());
    // 总页数、总记录数
    System.out.println(page.getPages());
    System.out.println(page.getTotal());
    // 当前页数据
    System.out.println(page.getRecords());
    

附:BaseMapper <T>

从源码可看出,接口参数的 id 是 Serializable 类型。

可作为主键 ID 的所有数据类型,都直接或间接实现了 Serializable 接口。

(这就是 面向抽象编程 的体现)

  • String 和 Number 都实现了 Serializable 接口。

    image-20220522142749192

  • 基本类型、原子类型等都继承自 Number 抽象类。

    image-20220522143013043

int insert(T entity);

  • ID

  • 实体,本质也是 ID

  • columnMap

  • 拼接条件

  • ID 列表或实体列表,批量

    int deleteById(Serializable id);
    int deleteById(T entity);
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
    int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<?> idList);
    

  • 实体,由 ID 确定记录

  • 实体,拼接条件

    int updateById(@Param(Constants.ENTITY) T entity);
    int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
    

基础

  • ID

  • ID 列表,批量

  • columnMap

  • 拼接条件

  • 拼接条件,批量(entity)

  • 拼接条件,批量(包含属性的 Map)

  • 拼接条件,首个字段的列表

    T selectById(Serializable id);
    
    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
    
    List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
    
    default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) {
        List<T> ts = this.selectList(queryWrapper);
        if (CollectionUtils.isNotEmpty(ts)) {
            if (ts.size() != 1) {
                throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records");
            }
            return ts.get(0);
        }
        return null;
    }
    
    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    

分页

分页 Page 对象,拼接条件。

<P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

<P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

其它

  • 判断存在:拼接条件

  • 总记录数:拼接条件

    default boolean exists(Wrapper<T> queryWrapper) {
        Long count = this.selectCount(queryWrapper);
        return null != count && count > 0;
    }
    
    Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
posted @ 2022-05-22 16:10  Jaywee  阅读(69)  评论(0编辑  收藏  举报

👇