前言
上一章节解读了 MP 的 条件构造器,本章节继续解读 MP 的其他特性
分页插件
Springboot 下的分页,以 bean 的形式注册 分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
则使用对应 IService 接口的 page
相关方法即可
// 带条件
default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper) {
return this.getBaseMapper().selectPage(page, queryWrapper);
}
// 不带条件
default <E extends IPage<T>> E page(E page) {
return this.page(page, Wrappers.emptyWrapper());
}
default <E extends IPage<Map<String, Object>>> E pageMaps(E page, Wrapper<T> queryWrapper) {
return this.getBaseMapper().selectMapsPage(page, queryWrapper);
}
default <E extends IPage<Map<String, Object>>> E pageMaps(E page) {
return this.pageMaps(page, Wrappers.emptyWrapper());
}
示例 demo
/**
* 表中共三条数据
*/
@Test
public void testPage() {
Page<User> page = userService.page(
new Page<>(1, 2)
//, new QueryWrapper<>(new User("1", null, null)).eq("age", 1)
);
page.getRecords().forEach(System.out::println);
// User(id=1, name=u3, age=1, email=1) User(id=2, name=2, age=2, email=2)
System.out.println(page.getPages()); // 2
System.out.println(page.getTotal()); // 3
System.out.println(page.getSize()); // 2
System.out.println(page.getCurrent()); // 1
}
主键序列
@Data
@EqualsAndHashCode(callSuper = false)
// 自己添加无参构造
@NoArgsConstructor
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String name;
private Integer age;
private String email;
// 自己添加的构造方法
public User(String name, Integer age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
这是我们之前生成的实体类,要想自定义 主键序列 ,首先要修改主键的 type
属性值为 INPUT
MP 内置如下 序列生成类
- DB2KeyGenerator
- H2KeyGenerator
- KingbaseKeyGenerator
- OracleKeyGenerator
- PostgreKeyGenerator
我们也可实现 IKeyGenerator 接口来进行扩展,如下我们注入 DB2KeyGenerator 实例,则主键自增
@Bean
public IKeyGenerator keyGenerator() {
return new DB2KeyGenerator();
}
------------------DB2KeyGenerator 源码---------------------
public class DB2KeyGenerator implements IKeyGenerator {
public DB2KeyGenerator() {
}
// 自增
public String executeSql(String incrementerName) {
return "values nextval for " + incrementerName;
}
}
自定义主键
MP 内置 雪花算法 + UUID(不含中划线),自定义拓展则实现 IdentifierGenerator 接口即可
修改主键的字段类型为 String(Varchar),修改主键注解 type
属性值为 ASSIGN_UUID 即可,不做演示
总结
除此之外,MP 还拓展了很多插件功能,比如 逻辑删除、乐观锁、多租户 等等,功能都十分强大。本文花了四个章节,也只是讲解了 MP 强大功能的 凤毛麟角,对于其 源码 更是几乎没有深入,使用起来如此轻便想必其实现也是十分巧妙,如果有机会,可以学习源码再深入了解下
关于其他更多的特性,如果感兴趣,可以直接上官网了解