← 返回首页
MybatisPlus基础教程(八)
发表时间:2020-03-30 12:51:46
讲解MybatisPlus的分页

MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能。

单表的分页

1.实现步骤

1)在MpConfig中,注册分页插件。

@EnableTransactionManagement
@Configuration
@MapperScan("com.simoniu.mpdemo.mapper")
public class MpConfig {
    //逻辑删除插件
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }

    // 乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

    // 分页插件
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

    //分页插件,基于mybatisplus 3.4.0之后的写法
    /*
    @Bean
    public MybatisPlusInterceptor mybatisPlusPagerInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }*/
}

2.测试 返回对象类型的分页。

//分页查询
    @Test
    public void testPage() {
        //1 创建page对象
        //传入两个参数:当前页 和 每页显示记录数
        Page<Users> page = new Page<Users>(1, 3);
        //调用mp分页查询的方法
        //调用mp分页查询过程中,底层封装
        //把分页所有数据封装到page对象里面
        usersMapper.selectPage(page, null);
        page.getRecords().forEach(System.out::println);
        //通过page对象获取分页数据
        System.out.println(page.getCurrent());//当前页
        System.out.println(page.getRecords());//每页数据list集合
        System.out.println(page.getSize());//每页显示记录数
        System.out.println(page.getTotal()); //总记录数
        System.out.println(page.getPages()); //总页数
        System.out.println(page.hasNext()); //下一页
        System.out.println(page.hasPrevious()); //上一页
    }
运行结果:
Users(id=1, name=张1, age=21, email=zhang1@qq.com, createTime=Mon Mar 30 12:41:36 CST 2020, updateTime=Mon Mar 30 12:41:36 CST 2020, deleted=0, version=1)
Users(id=2, name=张2, age=22, email=zhang2@qq.com, createTime=Mon Mar 30 12:41:36 CST 2020, updateTime=Mon Mar 30 12:41:36 CST 2020, deleted=0, version=1)
Users(id=3, name=张3, age=23, email=zhang3@qq.com, createTime=Mon Mar 30 12:41:36 CST 2020, updateTime=Mon Mar 30 12:41:36 CST 2020, deleted=0, version=1)
1
[Users(id=1, name=张1, age=21, email=zhang1@qq.com, createTime=Mon Mar 30 12:41:36 CST 2020, updateTime=Mon Mar 30 12:41:36 CST 2020, deleted=0, version=1), Users(id=2, name=张2, age=22, email=zhang2@qq.com, createTime=Mon Mar 30 12:41:36 CST 2020, updateTime=Mon Mar 30 12:41:36 CST 2020, deleted=0, version=1), Users(id=3, name=张3, age=23, email=zhang3@qq.com, createTime=Mon Mar 30 12:41:36 CST 2020, updateTime=Mon Mar 30 12:41:36 CST 2020, deleted=0, version=1)]
3
20
7
true
false

返回Map类型的分页。

@Test
    public void testMapPage() {
        //1 创建page对象
        //传入两个参数:当前页 和 每页显示记录数
        Page<Users> page = new Page<Users>(1, 3);
        //调用mp分页查询的方法
        //调用mp分页查询过程中,底层封装
        //把分页所有数据封装到page对象里面
        IPage<Map<String, Object>> mapIPage = usersMapper.selectMapsPage(page, null);
        //注意:此行必须使用 mapIPage 获取记录列表,否则会有数据类型转换错误
        mapIPage.getRecords().forEach(System.out::println);
        //通过page对象获取分页数据
        System.out.println(page.getCurrent());//当前页
        System.out.println(page.getRecords());//每页数据list集合
        System.out.println(page.getSize());//每页显示记录数
        System.out.println(page.getTotal()); //总记录数
        System.out.println(page.getPages()); //总页数
        System.out.println(page.hasNext()); //下一页
        System.out.println(page.hasPrevious()); //上一页
    }

运行结果:
{update_time=2020-03-30 12:41:36.0, deleted=0, create_time=2020-03-30 12:41:36.0, name=张1, id=1, version=1, age=21, email=zhang1@qq.com}
{update_time=2020-03-30 12:41:36.0, deleted=0, create_time=2020-03-30 12:41:36.0, name=张2, id=2, version=1, age=22, email=zhang2@qq.com}
{update_time=2020-03-30 12:41:36.0, deleted=0, create_time=2020-03-30 12:41:36.0, name=张3, id=3, version=1, age=23, email=zhang3@qq.com}
1
[{update_time=2020-03-30 12:41:36.0, deleted=0, create_time=2020-03-30 12:41:36.0, name=张1, id=1, version=1, age=21, email=zhang1@qq.com}, {update_time=2020-03-30 12:41:36.0, deleted=0, create_time=2020-03-30 12:41:36.0, name=张2, id=2, version=1, age=22, email=zhang2@qq.com}, {update_time=2020-03-30 12:41:36.0, deleted=0, create_time=2020-03-30 12:41:36.0, name=张3, id=3, version=1, age=23, email=zhang3@qq.com}]
3
20
7
true
false

多表级联分页

多表级联查询分页,需要借助原生SQL查询实现。在mapper接口层定义原生查询SQL语句,返回视图分页对象。

实现步骤如下:

1).定义视图类

把原生SQL查询返回的数据集,封装为视图类。

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UsersView implements Serializable,Cloneable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @TableId(type= IdType.AUTO)

    private Integer uid; //用户编号
    private String username; //用户名
    //private String password; //密码
    @Column(length = 20)
    private String regDate; //注册日期
    @Column(length = 15)
    private String mobile; //注册手机
    @Column(length = 50)
    private String email; //注册电子邮箱
    private boolean flag; //逻辑删除字段
    private String rname; //角色

}

2).mapper层定义原生SQL查询。

public interface UsersMapper  extends BaseMapper<Users> {
  @Select("select u.uid,u.username,u.regDate,u.mobile,u.email,u.flag,r.rname from users u,usersroles ur ,roles r\n" +
            "where u.flag=0 and u.uid = ur.uid and r.rid = ur.rid and ur.rid=#{rid}")
  IPage<UsersView> queryAllUsersViewPagerByRid(Page<UsersView> page, Integer rid);

}

3).service层实现

UsersService.java

public interface UsersService extends IService<Users> {

    IPage<UsersView> queryUsersViewPager(Integer currentPageNumber);
}

UsersServiceImpl.java

@Service
public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements UsersService {

    ...
    @Override
    public IPage<UsersView> queryUsersViewPager(Integer currentPageNumber) {
        Page<UsersView> page = new Page<UsersView>(currentPageNumber, perPagerSize);
        return usersMapper.queryAllUsersViewPager(page);
    }

}