博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生成jFinal的动态条件查询语句的工具类
阅读量:5241 次
发布时间:2019-06-14

本文共 11644 字,大约阅读时间需要 38 分钟。

因为有时候需要根据前台的多个条件来过滤数据!因此需要根据是否有值以及当前值是以什么方式来过滤。这样我们不可能一个一个值来判断吧!这样代码就有些难看了!而jFinal也没有提供这样的方法,而网上的一些解决方法感觉不太好用麻烦而且不够灵活!基于这个考虑我就自己写了一个工具类!目前来说用着还挺方便的!如果有什么不对或者改进的地方请指正,大家共同进步!

1 /**  2  * 用于生成JFinal的SQL查询语句
3 * 类名称:Conditions
4 * 创建人:yangxp
5 * 创建时间:2014-1-19 上午11:22:26
6 * 7 * @version v1.0.9 8 * 9 */ 10 public class Conditions { 11 static Logger log = Logger.getLogger(Conditions.class); 12 13 public static final String EQUAL = "EQUAL"; // 相等 14 15 public static final String NOT_EQUAL = "NOT_EQUAL"; // 不相等 16 17 public static final String LESS_THEN = "LESS_THEN"; // 小于 18 19 public static final String LESS_EQUAL = "LESS_EQUAL"; // 小于等于 20 21 public static final String GREATER_EQUAL = "GREATER_EQUAL"; // 大于等于 22 23 public static final String GREATER_THEN = "GREATER_THEN"; // 大于 24 25 public static final String FUZZY = "FUZZY"; // 模糊匹配 %xxx% 26 27 public static final String FUZZY_LEFT = "FUZZY_LEFT"; // 左模糊 %xxx 28 29 public static final String FUZZY_RIGHT = "FUZZY_RIGHT"; // 右模糊 xxx% 30 31 public static final String NOT_EMPTY = "NOT_EMPTY"; // 不为空值的情况 32 33 public static final String EMPTY = "EMPTY"; // 空值的情况 34 35 public static final String IN = "IN"; // 在范围内 36 37 public static final String NOT_IN = "NOT_IN"; // 不在范围内 38 39 // 用于接收SQL语句 40 private ThreadLocal
sql = new ThreadLocal
(); 41 42 // 用于接收参数数组 43 private ThreadLocal
> paramList = new ThreadLocal
>(); 44 45 // 用于存放设置的条件 46 private ThreadLocal
> conditionMap = new ThreadLocal
>(); 47 48 // 用于存放需要排除的字段 49 private ThreadLocal
> excludeFieldMap = new ThreadLocal
>(); 50 51 // 构造方法(表示没有设置查询类型的字段全部按照等于来处理) 52 public Conditions() { 53 conditionMap.set(new HashMap
()); 54 excludeFieldMap.set(new HashMap
()); 55 } 56 57 // 构造方法(设置后表示字段所有的查询方式按照设置类型来处理,除非后面针对字段的重新设置) 58 public Conditions(String type) { 59 Map
map = new HashMap
(); 60 map.put("GLOBALTYPE", new String[] { type }); 61 conditionMap.set(map); 62 excludeFieldMap.set(new HashMap
()); 63 } 64 65 /*************************************************************************** 66 * 设置字段的查询类型 67 * 68 * @param QueryType 69 * 查询类型 70 * @param fieldName 71 * 字段名称数组 72 */ 73 public void setFiledQuery(String QueryType, String... filedName) { 74 if (StringUtils.isNotBlank(QueryType) && !Common.isNullOrEmpty(filedName)) { 75 Map
map = conditionMap.get(); 76 map.put(QueryType, filedName); 77 conditionMap.set(map); 78 } 79 } 80 81 /*************************************************************************** 82 * 设置需要排除的字段 83 * 84 * setexcludeField
85 * 86 * @param 参数说明 87 * @return 返回对象 88 * @Exception 异常对象 89 * 90 */ 91 public void setExcludeField(String... filedName) { 92 if (!Common.isNullOrEmpty(filedName)) { 93 Map
map = excludeFieldMap.get(); 94 for (String str : filedName) { 95 map.put(str, str); 96 } 97 excludeFieldMap.set(map); 98 } 99 }100 101 /***************************************************************************102 * 查询空值或者不为空值的情况 setNullFieldQuery103 * 104 * @param 参数说明105 * @return 返回对象106 * @Exception 异常对象107 */108 public void setNullOrNotNullFieldQuery(String QueryType, String... filedName) {109 if (StringUtils.isNotBlank(QueryType) && !Common.isNullOrEmpty(filedName)) {110 if (!NOT_EMPTY.equals(QueryType) && !EMPTY.equals(QueryType)) {111 log.error("空值或者非空查询的类型只能为:EMPTY、NOT_EMPTY");112 throw new RuntimeException("空值或者非空查询的类型只能为:EMPTY、NOT_EMPTY");113 }114 Map
map = conditionMap.get();115 map.put(QueryType, filedName);116 conditionMap.set(map);117 }118 }119 120 /***************************************************************************121 *
传值查询
122 * 注:如果QueryType为
in或者
not in那么filedValue必须为一个list对象123 * 124 * @param QueryType125 * 查询类型126 * @param fieldName127 * 字段名称128 * @param filedValue129 * 字段值130 */131 public void setValueQuery(String QueryType, String fieldName, Object filedValue) {132 if (StringUtils.isNotBlank(QueryType) && StringUtils.isNotBlank(fieldName) && !Common.isNullOrEmpty(filedValue)) {133 Object[] param = new Object[2];134 param[0] = fieldName; // 字段名135 param[1] = filedValue;// 字段值136 Map
map = conditionMap.get();137 map.put(QueryType + "#" + fieldName, param);// 避免类型重复被覆盖掉就加上字段名138 conditionMap.set(map);139 }140 }141 142 /***************************************************************************143 * 用于生成SQL条件语句不带别名144 * 145 * @param modelClass146 * 必须继承于Model147 */148 public void modelToCondition(Model
modelClass) {149 modelToCondition(modelClass, null);150 }151 152 /***************************************************************************153 * 用于生成SQL条件语句不带别名154 * 155 * @param RecordClass156 * 必须是一个Record类157 */158 public void recordToCondition(Record recordClass) {159 recordToCondition(recordClass, null);160 }161 162 /***************************************************************************163 * 用于生成SQL条件语句带别名164 * 165 * @param modelClass166 * 必须继承于Model167 * @param alias168 * 别名169 */170 public void modelToCondition(Model
modelClass, String alias) {171 alias = StringUtils.isNotBlank(alias) ? alias + "." : "";172 if (modelClass != null) {173 // 所有的字段174 String[] fieldNames = modelClass.getAttrNames();175 // 字段名和值的map集合176 Map
valueMap = Common.modelToMap(modelClass);177 178 // 构建查询条件179 buildCondition(alias, fieldNames, valueMap);180 } else {181 if (!conditionMap.get().isEmpty()) {182 buildCondition(alias, new String[] {}, new HashMap
());183 } else {184 sql.set("");185 paramList.set(new ArrayList
());186 }187 }188 }189 190 /***************************************************************************191 * 用于生成SQL条件语句不带别名192 * 193 * @param RecordClass194 * 必须是一个Record类195 * @param alias196 * 别名197 */198 public void recordToCondition(Record recordClass, String alias) {199 // 别名200 alias = StringUtils.isNotBlank(alias) ? alias + "." : "";201 if (recordClass != null) {202 // 所有的字段203 String[] fieldNames = recordClass.getColumnNames();204 // 字段名和值的map集合205 Map
valueMap = Common.recordToMap(recordClass);206 207 // 构建查询条件208 buildCondition(alias, fieldNames, valueMap);209 } else {210 if (!conditionMap.get().isEmpty()) {211 buildCondition(alias, new String[] {}, new HashMap
());212 } else {213 sql.set("");214 paramList.set(new ArrayList
());215 }216 }217 }218 219 /***************************************************************************220 * 构建条件语句221 * 222 * @param resultMap223 * 用于返回结果的map224 * @param alias225 * 别名226 * @param fieldNames227 * 所有查询的字段名称228 * @param valueMap229 * 所有的值的map230 */231 private void buildCondition(String alias, String[] fieldNames, Map
valueMap) {232 try {233 // 构建条件前先清空变量234 sql.set("");235 paramList.set(new ArrayList
());236 // 用于存放参数列表237 ArrayList paramArrayList = new ArrayList();238 StringBuilder sb = new StringBuilder();239 // 所有的字段名称240 Map
usedFieldMap = new HashMap
();241 if (!conditionMap.get().isEmpty()) {242 for (Entry
map : conditionMap.get().entrySet()) {243 String queryType = map.getKey();244 Object[] array = map.getValue();245 if (queryType.indexOf("#") > 0) { // 传值查询246 String fieldQueryType = queryType.split("#")[0];247 String fieldName = array[0] != null ? array[0].toString() : "";248 Object fieldValue = array[1];249 250 // 将设置过的字段保存到数组中251 usedFieldMap.put(fieldName, fieldName);252 // 构建SQL语句253 buildSQL(sb, fieldQueryType, fieldName, fieldValue, alias, paramArrayList);254 } else { // 字段查询255 if (!"GLOBALTYPE".equals(queryType)) {256 for (Object field : array) {257 String filedName = field != null ? field.toString() : "";258 if (!excludeFieldMap.get().containsKey(filedName)) {259 Object fieldValue = valueMap.get(filedName);260 // 将设置过的字段保存到数组中261 usedFieldMap.put(filedName, filedName);262 // 构建查询语句263 buildSQL(sb, queryType, filedName, fieldValue, alias, paramArrayList);264 }265 }266 }267 }268 }269 }270 // 对没有设置条件的字段进行查询类型设置271 String queryType = EQUAL;272 if (conditionMap.get().containsKey("GLOBALTYPE")) {273 String[] typeArray = (String[]) conditionMap.get().get("GLOBALTYPE");274 queryType = typeArray[0];275 }276 // 对未使用过的字段进行build277 for (String field : fieldNames) {278 if (!usedFieldMap.containsKey(field)) {279 Object fieldValue = valueMap.get(field);280 // 构建查询语句281 buildSQL(sb, queryType, field, fieldValue, alias, paramArrayList);282 }283 }284 285 // 合并传入的参数到参数对象中286 sql.set(sb.toString());287 paramList.set(paramArrayList);288 conditionMap.set(new HashMap
());// 清空本次的条件map289 excludeFieldMap.set(new HashMap
());// 清空本次的排除字段290 } catch (Exception e) {291 log.error("Conditions构建SQL语句出现错误,请仔细检查!",e);292 e.printStackTrace();293 }294 }295 296 /***************************************************************************297 * 构建SQL语句298 * 299 * @param sb300 * 用于拼接SQL语句301 * @param queryType302 * 查询类型303 * @param fieldName304 * 字段名称305 * @param fieldValue306 * 字段值307 * @param alias308 * 别名309 * @return310 */311 @SuppressWarnings("unchecked")312 private void buildSQL(StringBuilder sb, String queryType, String fieldName, Object fieldValue, String alias, ArrayList
params) {313 // 非空的时候进行设置314 if (!Common.isNullOrEmpty(fieldValue) && !Common.isNullOrEmpty(fieldName)) {315 if (EQUAL.equals(queryType)) {316 sb.append(" and " + alias + fieldName + " = ? ");317 params.add(fieldValue);318 } else if (NOT_EQUAL.equals(queryType)) {319 sb.append(" and " + alias + fieldName + " <> ? ");320 params.add(fieldValue);321 } else if (LESS_THEN.equals(queryType)) {322 sb.append(" and " + alias + fieldName + " < ? ");323 params.add(fieldValue);324 } else if (LESS_EQUAL.equals(queryType)) {325 sb.append(" and " + alias + fieldName + " <= ? ");326 params.add(fieldValue);327 } else if (GREATER_THEN.equals(queryType)) {328 sb.append(" and " + alias + fieldName + " > ? ");329 params.add(fieldValue);330 } else if (GREATER_EQUAL.equals(queryType)) {331 sb.append(" and " + alias + fieldName + " >= ? ");332 params.add(fieldValue);333 } else if (FUZZY.equals(queryType)) {334 sb.append(" and " + alias + fieldName + " like ? ");335 params.add("%" + fieldValue + "%");336 } else if (FUZZY_LEFT.equals(queryType)) {337 sb.append(" and " + alias + fieldName + " like ? ");338 params.add("%" + fieldValue);339 } else if (FUZZY_RIGHT.equals(queryType)) {340 sb.append(" and " + alias + fieldName + " like ? ");341 params.add(fieldValue + "%");342 } else if (IN.equals(queryType)) {343 try {344 List list = (List) fieldValue;345 StringBuffer instr = new StringBuffer();346 sb.append(" and " + alias + fieldName + " in (");347 for (Object obj : list) {348 instr.append(StringUtils.isNotBlank(instr) ? ",?" : "?");349 params.add(obj);350 }351 sb.append(instr + ") ");352 } catch (Exception e) {353 throw new RuntimeException("使用IN条件的时候传入的值必须是个List对象,否则将会转换出错!例如将 in('1','2','3')中的'1','2','3'分为三个分别添加到List中做为值传入.",e);354 }355 } else if (NOT_IN.equals(queryType)) {356 try {357 List list = (List) fieldValue;358 StringBuffer instr = new StringBuffer();359 sb.append(" and " + alias + fieldName + " not in (");360 for (Object obj : list) {361 instr.append(StringUtils.isNotBlank(instr) ? ",?" : "?");362 params.add(obj);363 }364 sb.append(instr + ") ");365 } catch (Exception e) {366 throw new RuntimeException("使用NOT IN条件的时候传入的值必须是个List对象,否则将会转换出错!例如将 not in('1','2','3')中的'1','2','3'分为三个分别添加到List中做为值传入.",e);367 }368 }369 } else {370 if (EMPTY.equals(queryType)) {371 sb.append(" and " + alias + fieldName + " is null ");372 } else if (NOT_EMPTY.equals(queryType)) {373 sb.append(" and " + alias + fieldName + " is not null ");374 }375 }376 }377 378 public String getSql() {379 return sql.get();380 }381 382 public List getParamList() {383 return paramList.get();384 }385 }

 

转载于:https://www.cnblogs.com/helloyangxp/p/3863593.html

你可能感兴趣的文章