1.准备BaseQuery,其他query对象继承BaseQuery
@Data
public class BaseQuery {
private Integer page = 1;
private Integer limit = 10;
private String sortBy;
private String orderBy;
}
2.在需要排序的Service层添加如下方法
private static String convertData(String sortBy) {
sortBy = sortBy.toLowerCase();
final StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile("_(\\w)");
Matcher m = p.matcher(sortBy);
while (m.find()) {
m.appendReplacement(sb, m.group(1).toUpperCase());
}
m.appendTail(sb);
return sb.toString();
}
3.构造SortUtils
package cn.xingqutuan.utils;
import cn.xingqutuan.query.BaseQuery;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Field;
import java.util.Map;
public class SortUtils {
public static <T> void appendSortColumn(BaseQuery query, QueryWrapper<T> wrapper, Class<?> clazz) {
if (query.getSortby() != null) {
String column = getSortColumn(query, clazz);
if (StringUtils.equals(query.getOrderBy(), "desc")) {
wrapper.orderByDesc(column);
} else {
wrapper.orderByAsc(column);
}
}
}
public static String getSortColumn(BaseQuery query, Class<?> clazz) {
return getSortColumn(query, clazz, null, null);
}
public static String getSortColumn(BaseQuery query, Class<?> clazz, Map<String, String> sortMap) {
return getSortColumn(query, clazz, sortMap, null);
}
public static String getSortColumn(BaseQuery query, Class<?> clazz, Map<String, String> sortMap, String defaultPrefix) {
if (query.getSortby() == null) {
return null;
}
boolean needGBK = false;
try {
Field field = clazz.getDeclaredField(query.getSortby());
Class<?> type = field.getType();
if (type.equals(String.class)) {
needGBK = true;
}
} catch (NoSuchFieldException ignored) {
}
String columnName = getColumnName(query, sortMap, defaultPrefix);
if (!needGBK) {
return columnName;
}
return columnName;
}
private static String getColumnName(BaseQuery query, Map<String, String> sortMap, String defaultPrefix) {
if (sortMap != null) {
String sortColumn = sortMap.get(query.getSortby());
if (sortColumn != null) {
return sortColumn;
}
}
String dbSortColumn = query.getSortby();
if (defaultPrefix == null) {
return dbSortColumn;
}
return defaultPrefix + '.' + dbSortColumn;
}
private static String getDBSortColumn(String sortColumn) {
if (sortColumn == null) {
return null;
}
char[] chars = sortColumn.toCharArray();
StringBuilder comlumn = new StringBuilder(50).append(chars[0]);
for (int i = 1; i < chars.length; i++) {
char c = chars[i];
if (Character.isUpperCase(c)) {
comlumn.append('_').append(Character.toLowerCase(c));
} else {
comlumn.append(c);
}
}
return comlumn.toString();
}
}
4.使用
-
Service层
public IPage<ViewObject> pageView(QueryObject query) {
QueryWrapper<ViewObject> wrapper = new QueryWrapper<>();
Page<ViewObject> page = new Page<>(query.getPage(), query.getLimit());
query.setSortby(StringUtils.isNotEmpty(query.getSortby()) ? convertData(query.getSortby()) : null);
SortUtils.appendSortColumn(query, wrapper, ViewObject.class);
return baseMapper.pageView(page, wrapper, query);
}
- viewObject:返回的vo对象
- QueryObject:封装请求参数对象(继承BaseQuery)
-
Mapper层
IPage<MediaStatistic> pageView(Page<ViewObject> page,
@Param(Constants.WRAPPER) QueryWrapper<MediaStatistic> search,
@Param("query") QueryObject query);
-
Mapper.xml
<select id="pageView" parameterType="java.util.HashMap" resultType="com.abo.view.ViewObject">
<include refid="sql"/>
${ew.customSqlSegment}
</select>
<include refid="sql"/>引用的sql标签就是自己写的业务sql,后面加上${ew.customSqlSegment}即可动态实现排序