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);
}
}