单数据源的分页没什么说的用现成的pageHelper插件就可以了,而双数据源因为存在两个数据源方言差异的问题,已经无法通过pageHelper搞定,是时候自己搞一个分页插件了
在上次基于注解实现双数据源配置的基础上,我们在加上分页插件的功能
基本思路:
- 利用拦截器拦截所有分页查询,判断当前数据源的方言
- 根据方言拼装total查询sql查询当前查询的总条数
- 根据方言拼装分页sql,实现分页查询
第一步:修改配置文件
在上次双数据源的配置文件中添加dialect参数,用于动态判断当前数据源方言
datasource:
db1:
jdbc-url: jdbc:mysql://localhost:3306/mybatis-demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
max-idle: 10
max-wait: 10000
min-idle: 5
initial-size: 5
dialect: mysql
db2:
jdbc-url: jdbc:mysql://localhost:3306/mybatis-demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
max-idle: 10
max-wait: 10000
min-idle: 5
initial-size: 5
dialect: mysql
第二步:新建一个用于分页参数类PageParam.java
@Data
public class PageParam {
public PageParam() {
pageSize=0;
pageNum=0;
total = 0;
}
public PageParam(Integer pageNum, Integer pageSize) {
this.pageNum = pageNum;
this.pageSize = pageSize;
}
private Integer pageNum;
// 默认每页显示条数
private Integer pageSize;
// 是否启用分页功能
@JSONField(serialize = false)
private Boolean useFlag;
// 是否检测当前页码的合法性(大于最大页码或小于最小页码都不合法)
@JSONField(serialize = false)
private Boolean checkFlag;
//当前sql查询的总记录数,回填
private Integer total;
// 当前sql查询实现分页后的总页数,回填
private Integer totalPage;
@JSONField(serialize = false)
private String orderColumn;
@JSONField(serialize = false)
private String order;
public Boolean isUseFlag() {
return useFlag;
}
public Boolean istCheckFlag() {
return checkFlag;
}
}
第三步:新建pageConfig.java
用于数据源方言配置信息的加载及根据方言拼装分页相关的SQL语句
@Component
public class PageConfig {
@Value("${spring.datasource.db1.dialect}")
private String db1Dialect;
@Value("${spring.datasource.db2.dialect}")
private String db2Dialect;
public String getDateSource() {
return DataSourceContextHolder.getDB();
}
public static PageParam getPageParam(Integer pageNum, Integer pageSize) {
if (pageSize == null || pageNum == null) {
return null;
}
pageNum = pageNum > 0 ? pageNum : 1;
pageSize = pageSize > 0 ? pageSize : 1;
return new PageParam(pageNum, pageSize);
}
public static PageParam setPageParam(Integer pageNum, Integer pageSize, Map param) {
PageParam pageParam = getPageParam(pageNum, pageSize);
if (pageParam != null)
param.put("pageParam", pageParam);
return pageParam;
}
public String getDialect() {
String dialect = getDialect(getDateSource());
return dialect;
}
public String getDialect(String dbName){
if(dbName.equals("db1"))
return db1Dialect;
else
return db2Dialect;
}
public String getTotalSqlParam() {
String sqlParma = " paging";
if (getDialect().equals("postgre"))
sqlParma = " as paging";
else if (getDialect().equals("sqlserver")) {
sqlParma = " as paging";
}
return sqlParma;
}
public String getSelectSqlParam(PageParam pageParam) {
Map param =