一、 新建MybatisPlusConfig配置类文件
二、新建分页类
三、根据业务 组装查询构造器
四 、 编写ServeImpl 以及 编写mapper.xnl
一、
/**
• MyBatis - Plus 配置
•
/
@Slf4j
@EnableTransactionManagement
@Configuration
public class MyBatisPlusConfig {
/**
* 乐观锁
* @return
*/@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
/**
* Mybatis 拦截器
* @param sqlSessionFactory
* @return
*/
@Bean
public String myInterceptor(SqlSessionFactory sqlSessionFactory) {
sqlSessionFactory.getConfiguration().addInterceptor(new MybatisAutoFillInterceptor());
return "interceptor";
}}
二、
/**
• 分页类
•
*/
@Slf4j
public class Page<T extends BaseEntity,E extends ApiWrapper> extends PageSerializable{private int pageNo = 1;
private int pageSize = 10;
/** 查询条件构造器 */
private QueryWrapper<T> queryWrapper;
public Page(){
super();
}
/**
* 分页 构造函数
* @param pageNo 页
* @param pageSize 分页大小
*/
public Page(int pageNo, int pageSize) {
super();
this.pageNo = pageNo;
this.pageSize = pageSize;
}
/**
* 分页 构造函数
* @param pageNo 页
* @param pageSize 分页大小
* @param queryWrapper 查询条件
*/
public Page(int pageNo, int pageSize, QueryWrapper<T> queryWrapper) {
super();
this.pageNo = pageNo;
this.pageSize = pageSize;
this.queryWrapper = queryWrapper;
}
/**
* 分页函数
*/
public void pageHelperBegin(){
this.pageHelperBegin(true);
}
/**
* 分页函数 不统计 count
*/
public void pageHelperBegin(boolean countFlag){
PageHelper.startPage(this.pageNo,this.pageSize, countFlag);
}
/**
* 分页函数
*/
public void pageHelperEnd(){
PageHelper.clearPage();
}
/**
* 设置数据
* @param pageInfo
*/
public void instance(PageInfo<T> pageInfo, List<E> list) {
super.setList(list);
super.setTotal(pageInfo.getTotal());
}
/**
* 获取bootstrap data分页数据
* @return map对象
*/
public Page.PageData getPageData(){
Page.PageData pageData = new PageData();
pageData.setRows(this.getList());
pageData.setTotal(this.getTotal());
return pageData;
}
// =======================================================
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public QueryWrapper<T> getQueryWrapper() {
return queryWrapper;
}
public void setQueryWrapper(QueryWrapper<T> queryWrapper) {
this.queryWrapper = queryWrapper;
}
//
/**
* 分页对象
*/
@Data
public static class PageData {
/** 条数 */
private Long total;
/** 行 */
private List rows;
}
三、
@ApiOperation(value = "获得分页数据", notes = "获得分页数据 - 查询构造器")
// @RequiresPermissions("assets_manage_select")
@EnableLog
@Override
public ResultVo<?> findPage(String assetsStatus, String queryField,
BigDecimal minValue,BigDecimal maxValue,Integer pageNo, Integer pageSize, HttpServletRequest request) {
QueryBuilder<AssetsInfo> queryBuilder = new GenQueryBuilder<>();
Page<AssetsInfo, AssetsInfoModel> page = new Page<>(pageNo, pageSize);
QueryWrapper<AssetsInfo> queryWrapper = queryBuilder.build();
if(!StringUtil.isBlank(queryField)){
queryWrapper.between(queryField, minValue, maxValue);
}
if(!StringUtil.isBlank(type)){
queryWrapper.eq("type", type);
}
if(!StringUtil.isBlank(lawsuitStatue)){
queryWrapper.eq("lawsuit_statue", lawsuitStatue);
}
if(!StringUtil.isBlank(assetsStatus)){
queryWrapper.eq("assets_status", assetsStatus);
}
queryWrapper.orderByDesc("a.update_time");
page.setQueryWrapper(queryWrapper);
page = IService.findPageAssets(page);
return ResultVo.success(page.getPageData());
}
这里 QueryBuilder 查询构造器 可以 通过 实现 implements QueryBuilder 给与一些默认updatetime 时间排序 ,合法验证,其中也可以定义一些构造函数达成自动组装查询条件,处理数据库字段与实体类字段转换关系等。
例子 :
package com.in.core.persistence.querybuilder;
import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import com.in.common.constants.MyBatisConstants;
import com.in.common.utils.HumpUtil;
import com.in.core.base.entity.BaseEntity;
import com.in.core.persistence.querybuilder.conf.WebQueryConf;import java.util.Map;
/**
• @Description: Web 条件构造器
*/
public class WebQueryBuilder implements QueryBuilder{
// == 匹配条件 ==
/** 全值匹配 /
private static final String EQ = “EQ”;
/* 模糊匹配 /
private static final String LIKE = “LIKE”;
/* 日期匹配 /
private static final String BEGIN = “BEGIN”;
private static final String END = “END”;
/* 排序方式 */
private static final String ORDER = “ORDER”;
private static final String ORDER_ASC = “ASC”;
private static final String ORDER_DESC = “DESC”;
/** 参数 /
private final Map<String, String[]> parameterMap;
/* Entity Clazz /
private final Class<? extends BaseEntity> entityClazz;
/* 默认排序字段 /
private final String defaultOrderField;
/* 配置类 */
private WebQueryConf conf;
/**• 构造函数 只是生产 查询器
• @param entityClazz Entity 的 clazz
• @param parameterMap request 参数
*/
public WebQueryBuilder(Class entityClazz, Map<String, String[]> parameterMap){
this.parameterMap = parameterMap;
this.entityClazz = entityClazz;
this.defaultOrderField = MyBatisConstants.FIELD_UPDATE_TIME;
}/**
• 构造函数 只是生产 查询器
• @param entityClazz Entity 的 clazz
• @param parameterMap request 参数
*/
public WebQueryBuilder(Class entityClazz, Map<String, String[]> parameterMap, WebQueryConf conf){
this.parameterMap = parameterMap;
this.entityClazz = entityClazz;
this.defaultOrderField = MyBatisConstants.FIELD_UPDATE_TIME;
this.conf = conf;
}/**
• 构造函数 只是生产 查询器
• @param entityClazz Entity 的 clazz
• @param parameterMap request 参数
• @param defaultOrderField 默认排序字段
*/
public WebQueryBuilder(Class entityClazz, Map<String, String[]> parameterMap,
String defaultOrderField){
this.parameterMap = parameterMap;
this.entityClazz = entityClazz;
this.defaultOrderField = defaultOrderField;
}/**
• 构造函数 只是生产 查询器
• @param entityClazz Entity 的 clazz
• @param parameterMap request 参数
• @param defaultOrderField 默认排序字段
• @param conf 配置
*/
public WebQueryBuilder(Class entityClazz, Map<String, String[]> parameterMap,
String defaultOrderField, WebQueryConf conf){
this.parameterMap = parameterMap;
this.entityClazz = entityClazz;
this.defaultOrderField = defaultOrderField;
this.conf = conf;
}@Override
public QueryWrapper build() {
QueryWrapper queryWrapper = new QueryWrapper<>();
return this.createQueryWrapper(queryWrapper);
}/**
• 创建 查询条件构造器
• @return QueryWrapper
*/
private QueryWrapper createQueryWrapper(QueryWrapper queryWrapper){
if(this.parameterMap == null){
return queryWrapper;
}
// order 排序次数 如果为0 则默认按照修改时间来排序
int orderCount = 0;
for (Map.Entry<String, String[]> stringEntry : this.parameterMap.entrySet()) {
String keys = stringEntry.getKey();
String[] values = stringEntry.getValue();
// 非空检测
if(StringUtils.isEmpty(keys) || values == null || StringUtils.isEmpty(values[0])){
continue;
}// 键 和 操作
String[] keyHandle = keys.split("_");
if(keyHandle.length < 2){
continue;
}
// 键
String key = keyHandle[0];
// 操作
String handle = keyHandle[1];
// 判断 字段是否合法
boolean hasField = this.validationField(key);
if(hasField){
// 验证操作是否合法
boolean hasHandle = this.validationHandle(handle);
if(hasHandle){
// 处理值
String value = values[0];
// 赋值
this.handlerValue(queryWrapper, handle, key ,value);
// 如果有排序 就+1
if(ORDER.equals(handle)){
orderCount++;
}
}
}}
// 如果没有排序 默认按照 修改时间倒叙排序
if(orderCount == 0){
if(StringUtils.isNotEmpty(this.defaultOrderField)){
String key = this.defaultOrderField;
String keyStr = null;
if(conf != null){
keyStr = conf.get(key);
}// 检测 Conf 配置中是否已经指定该配置
if(StringUtils.isNotEmpty(keyStr)){
key = keyStr;
}else{
// 转换驼峰 为 数据库下划线字段
key = HumpUtil.humpToUnderline(key);
}
queryWrapper.orderByDesc(key);
}}
return queryWrapper;
}/**
• 处理值
• @param queryWrapper 查询构造器
• @param handle 操作
• @param key 键
• @param value 值
• @return
*/
private void handlerValue(QueryWrapper queryWrapper, String handle, String key, String value){
if(queryWrapper == null || StringUtils.isEmpty(handle)
|| StringUtils.isEmpty(key) || StringUtils.isEmpty(value)
){
return;
}
String keyStr = null;
if(conf != null){
keyStr = conf.get(key);
}
// 检测 Conf 配置中是否已经指定该配置
if(StringUtils.isNotEmpty(keyStr)){
key = keyStr;
}else{
// 转换驼峰 为 数据库下划线字段
key = HumpUtil.humpToUnderline(key);
}
switch (handle) {
case EQ:
// 全值匹配
queryWrapper.eq(key, value);
break;
case LIKE:
// 模糊匹配
queryWrapper.like(key, value);
break;
case BEGIN:
// 大于等于
queryWrapper.ge(key, value);
break;
case END:
// 小于等于
queryWrapper.le(key, value);
break;
case ORDER:
// 排序
if (ORDER_ASC.equals(value)) {
queryWrapper.orderByAsc(key);
} else if (ORDER_DESC.equals(value)) {
queryWrapper.orderByDesc(key);
} else {
queryWrapper.orderByAsc(key);
}
break;
default:
break;
}
}/**
• 检测 字段是否合法
• @param key key值
• @return boolean
*/
private boolean validationField(String key){
if(StringUtils.isEmpty(key)){
return false;
}
boolean ret;
// 先判断 conf 文件中是否包含 改 key
if(conf != null){
ret = conf.hashKey(key);
if(ret){
return true;
}
}
// entity 对象是否为空
if(entityClazz == null){
return false;
}
// 判断当前传入参数 是否是Entity的字段
return ReflectUtil.hasField(entityClazz, key);
}/**
• 检测 操作是否合法
• @param handle 操作
• @return boolean
*/
private boolean validationHandle(String handle){
if(StringUtils.isEmpty(handle)){
return false;
}
switch (handle) {
case EQ:
case END:
case LIKE:
case BEGIN:
return true;
default:
return ORDER.equals(handle);
}
}
}
--------------------------------------------------------可以参考
四 、
@Override
public Page<AssetsInfo, AssetsInfoModel> findPageAssets(Page<AssetsInfo, AssetsInfoModel> page) {
page.pageHelperBegin();try {
List<AssetsInfo> list = mapper.queryPageAssets(page.getQueryWrapper());
PageInfo<AssetsInfo> pageInfo =new PageInfo<>(list);
List<AssetsInfoModel> es = WrapperUtil.transformInstance(pageInfo.getList(),AssetsInfoModel.class);
page.instance(pageInfo,es);
} finally {
page.pageHelperEnd();
}
return page;
}
<select id="queryPageAssets" parameterType="AssetsInfo" resultType="com.in.modulars.assets.manage.entity.AssetsInfo">
select a.*,
<include refid="Base_Result_column"></include>
<if test ="ew !=null and ew.sqlSelect != null and ew.sqlSelect !='' ">
,${ew.SqlSelect}
</if>
from assets_info a left join debtor_info b on a.debtor_id =b.id
${ew.customSqlSegment}