赞
踩
MyBatis-Plus 参数转换问题
1、前言
代码主要解决的是前端请求后端传的参数解析的问题,比如查询一个like的名称,后端是不知道的,这种请求下我们可以使用Map来作为参数,把字段的查询条件作为key的一部分,通过解析,转化为Wrapper,来完成查询。
2、代码
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.commons.lang.StringUtils; import java.util.HashMap; import java.util.Map; import java.util.Set; public class Map2WrapperUtil { private static final String PREFIX = "qp"; private static final String PARAM_REGEX = "-"; private static final String TABLE_REGEX = "_"; private static final String IN = "in"; private static final String EQ = "eq"; private static final String GT = "gt"; private static final String LT = "lt"; private static final String LIKE = "like"; private static final String BETWEEN = "between"; public Wrapper map2Wrapper(Map<String, Object> params) { //遍历params, 拆分成三个字段,qp-myAddress-in Set<Map.Entry<String, Object>> entries = params.entrySet(); QueryWrapper<Object> wrapper = new QueryWrapper<>(); for (Map.Entry<String, Object> entry : entries) { //解析key parseKey(wrapper, entry); } return wrapper; } public void parseKey(QueryWrapper<Object> wrapper, Map.Entry<String, Object> entry) { String key = entry.getKey(); Object value = entry.getValue(); if (StringUtils.isNotBlank(key)) { String[] keys = key.split(PARAM_REGEX); String prefix = keys[0]; String column = keys[1]; //解析Java字段转化为数据库字段 column = replaceUpperCase2LowerCase(column); String method = keys[2]; if (PREFIX.equals(prefix)) { //解析规则中的字段 switch (method) { case IN : wrapper.in(column, value); break; case EQ: wrapper.eq(column, value); break; case GT: wrapper.gt(column, value); break; case LT: wrapper.le(column, value); break; case LIKE: wrapper.like(column, value); break; default: break; } } } } private String replaceUpperCase2LowerCase(String column) { //遇到A字母,则将其解析成_a columnName--->column_name char[] charArr = column.toCharArray(); for (int i = 0; i < charArr.length; i++) { if (Character.isUpperCase(charArr[i])) { column = column.replace(""+charArr[i], TABLE_REGEX+Character.toLowerCase(charArr[i])); } } return column; } public static void main(String[] args) { Map2WrapperUtil util = new Map2WrapperUtil(); Map<String, Object> params = new HashMap<>(); params.put("qp-tableName-eq", "张三"); params.put("qp-tableAge-gt", 18); params.put("qp-tableAddress-like", "北京"); Wrapper wrapper = util.map2Wrapper(params); System.out.println("end"); } }
3、结论
代码虽然解决了常用的查询参数转换问题,但同时也存在一些问题。
比如代码臃肿,扩展性不好。目前有很多wrapper的方法是不支持的,需要在case中累加。我的想法是最好可以实现map和wrapper之间的方法映射,可惜能力有限,希望有大佬能够提供更好的解决方案。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。