| | |
| | | package com.moral.common.util; |
| | | |
| | | import com.moral.common.bean.Constants; |
| | | import com.moral.common.bean.PageBean; |
| | | import lombok.extern.log4j.Log4j; |
| | | import tk.mybatis.mapper.entity.Example; |
| | | import java.beans.PropertyDescriptor; |
| | | |
| | | import java.io.UnsupportedEncodingException; |
| | | import java.lang.reflect.Field; |
| | | import java.lang.reflect.InvocationTargetException; |
| | | import java.lang.reflect.Method; |
| | | import java.net.URLDecoder; |
| | |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | @Log4j |
| | | public class ExampleUtil { |
| | | private final static String OR_SPLIT = "or\\|"; |
| | | private final static String CRITERIA_SPLIT = "\\|\\|\\|"; |
| | | private final static String CONDITION_SPLIT = "\\|\\|"; |
| | | private static Map<String, Method> criteriaMethodMap = null; |
| | | private final static String SPLIT = "\\|"; |
| | | private final static String OR = "_OR"; |
| | | private final static String OR_SPLIT = OR+SPLIT; |
| | | private final static String CRITERIA = "_CR"; |
| | | private final static String CRITERIA_SPLIT = CRITERIA+SPLIT; |
| | | private final static String CONDITION = "_CO"; |
| | | private final static String CONDITION_SPLIT = CONDITION+SPLIT; |
| | | private static Map<String, Method> criteriaMethodMap = new ConcurrentHashMap<>(); |
| | | private static void setOrderByClause(Example example,String orderByClause) throws UnsupportedEncodingException, NoSuchFieldException { |
| | | orderByClause = URLDecoder.decode(orderByClause,"UTF-8"); |
| | | String[] orderBys = orderByClause.split(CRITERIA_SPLIT); |
| | | for(String orderBy : orderBys){ |
| | | String[] items = orderBy.split(CONDITION_SPLIT); |
| | | if(items.length == 2){ |
| | | String property = items[0]; |
| | | String sort = items[1]; |
| | | if(isPropertyOfClass(example.getEntityClass(),property)){ |
| | | |
| | | public static Example generateExample(Class clzz, String params) { |
| | | Example example = new Example(clzz); |
| | | if("asc".equals(sort)){ |
| | | example.orderBy(property).asc(); |
| | | }else{ |
| | | example.orderBy(property).desc(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | public static Example generateExample(Class clazz, PageBean page){ |
| | | return generateExample(clazz,false,page); |
| | | } |
| | | public static Example generateExample(Class clazz, boolean isDelete, PageBean page) { |
| | | Example example = null; |
| | | try { |
| | | params = URLDecoder.decode(params, "UTF-8"); |
| | | if (!StringUtils.isNullOrEmpty(params) && params.startsWith("or|")) { |
| | | String[] criteria = params.trim().split(OR_SPLIT); |
| | | Example.Criteria criteriaOfExample = example.or(); |
| | | for (String criterion : criteria) { |
| | | if (!StringUtils.isNullOrEmpty(criterion)) { |
| | | String[] conditions = criterion.trim().split(CRITERIA_SPLIT); |
| | | for (String condition : conditions) { |
| | | if (!StringUtils.isNullOrEmpty(condition)) { |
| | | String[] conditionItems = condition.split(CONDITION_SPLIT); |
| | | if (conditionItems != null && conditionItems.length > 1) { |
| | | //方法名 |
| | | String methodName = conditionItems[0]; |
| | | //属性名 |
| | | String propertyName = conditionItems[1]; |
| | | Method method = getMethod(methodName); |
| | | if (method != null && isPropertyOfClass(clzz, propertyName)) { |
| | | String params = page.getQueryParams(); |
| | | String orderByClause = page.getOrderByClause(); |
| | | example = new Example(clazz); |
| | | if(!StringUtils.isNullOrEmpty(orderByClause)){ |
| | | setOrderByClause(example,orderByClause); |
| | | } |
| | | if(!StringUtils.isNullOrEmpty(params)){ |
| | | params = URLDecoder.decode(params, "UTF-8"); |
| | | if (params.startsWith(OR)) { |
| | | String[] criteria = params.trim().split(OR_SPLIT); |
| | | for (String criterion : criteria) { |
| | | // criterion为null或""跳过 |
| | | if(StringUtils.isNullOrEmpty(criterion)) { continue;}; |
| | | Example.Criteria criteriaOfExample = example.or(); |
| | | if (!StringUtils.isNullOrEmpty(criterion)) { |
| | | String[] conditions = criterion.trim().split(CRITERIA_SPLIT); |
| | | for (String condition : conditions) { |
| | | if (!StringUtils.isNullOrEmpty(condition)) { |
| | | String[] conditionItems = condition.split(CONDITION_SPLIT); |
| | | if (conditionItems != null && conditionItems.length > 1) { |
| | | //方法名 |
| | | String methodName = conditionItems[0]; |
| | | //属性名 |
| | | String propertyName = conditionItems[1]; |
| | | //参数列表 |
| | | List values = new ArrayList<Object>(); |
| | | if (conditionItems.length > 2) { |
| | | //属性到类型 |
| | | Class<?> valutType = new PropertyDescriptor(propertyName, clzz).getPropertyType(); |
| | | for (int index = 2; index < conditionItems.length; index++) { |
| | | values.add(StringUtils.stringToObject4Type(valutType, conditionItems[index])); |
| | | values.add(conditionItems[index]); |
| | | } |
| | | } |
| | | invokeMethod(criteriaOfExample,method,propertyName,values); |
| | | } |
| | | Method method = getExampleMethod(methodName,values.size()+1); |
| | | if (method != null && (methodName.equals("andCondition")||isPropertyOfClass(clazz, propertyName))) { |
| | | invokeMethod(criteriaOfExample,method,propertyName,values); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | if(!isDelete) { |
| | | addDeletesToExample(example,clazz); |
| | | } |
| | | } catch (Exception ex) { |
| | | log.error(ex.getMessage()); |
| | |
| | | } |
| | | |
| | | ; |
| | | |
| | | private static boolean isPropertyOfClass(Class clzz, String propertyName) throws NoSuchFieldException { |
| | | return clzz.getDeclaredField(propertyName) != null; |
| | | /** |
| | | * 增加删除条件过滤 |
| | | * @param example |
| | | */ |
| | | private static void addDeletesToExample(Example example,Class clzz){ |
| | | if(isPropertyOfClass(clzz,"isDelete")) { |
| | | List<Example.Criteria> criteriaList = example.getOredCriteria(); |
| | | if(criteriaList!=null&&criteriaList.size()>0){ |
| | | for(Example.Criteria cri : criteriaList){ |
| | | boolean isHasIsDelete = false; |
| | | for(Example.Criterion con : cri.getCriteria()){ |
| | | if( con.getCondition().indexOf("is_delete") >-1) { |
| | | isHasIsDelete = true; |
| | | break; |
| | | } |
| | | } |
| | | if( !isHasIsDelete) { |
| | | cri.andNotEqualTo("isDelete", Constants.IS_DELETE_TRUE); |
| | | } |
| | | } |
| | | }else { |
| | | example.or().andNotEqualTo("isDelete",Constants.IS_DELETE_TRUE); |
| | | } |
| | | } |
| | | } |
| | | private static boolean isPropertyOfClass(Class clzz, String propertyName){ |
| | | for(Field field : clzz.getDeclaredFields()) { |
| | | if(field.getName().equals(propertyName)) { |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private static Method getMethod(String methodName) { |
| | | if (criteriaMethodMap == null) { |
| | | criteriaMethodMap = new HashMap<>(); |
| | | private static Method getExampleMethod(String methodName, int paramCount) { |
| | | String criteriaMethodKey = methodName+"_"+String.valueOf(paramCount); |
| | | Method methodTemp = criteriaMethodMap.get(criteriaMethodKey); |
| | | if(methodTemp==null) { |
| | | Method[] methods = Example.Criteria.class.getMethods(); |
| | | for (Method m : methods) { |
| | | Method method = criteriaMethodMap.get(m.getName()); |
| | | //重载函数存储参数最长的 |
| | | if (method==null||m.getParameterTypes().length>method.getParameterTypes().length){ |
| | | criteriaMethodMap.put(m.getName(),m); |
| | | for (Method method : methods) { |
| | | if(method.getName().equals(methodName)&&method.getParameterCount() == paramCount) { |
| | | criteriaMethodMap.put(criteriaMethodKey,method); |
| | | return method; |
| | | } |
| | | } |
| | | } |
| | | return criteriaMethodMap.get(methodName); |
| | | return methodTemp; |
| | | } |
| | | } |