sql的动态条件拼装

  1. import java.util.ArrayList; 
  2. import java.util.Collection; 
  3. import java.util.HashMap; 
  4. import java.util.LinkedList; 
  5. import java.util.List; 
  6. import java.util.Map; 
  7. /**
  8. * SQL动态封装工具
  9. *
  10. * simple::
  11. *
  12. *           BaseSelector select = new BaseSelector();
  13. *           select.setCommand("select * from  stat_user ");
  14. *           select.createCriteria().andEqualTo("org_code", "YZ1201")
  15. *           .andGreaterThanOrEqualTo("day_code", "2009-01-01")
  16. *           .andLessThanOrEqualTo("day_code", "2009-03-31");
  17. *           List rowset = SqlTemplate.executeQuery(select.toSql(),new Object[] {});
  18. *
  19. *           output:select * from  stat_user where org_code = 'YZ1201' and day_code >= '2009-01-01' and day_code <= '2009-03-31'
  20. *
  21. */
  22. public class BaseSelector { 
  23. /**
  24.      * sql语句
  25.      */
  26. private String command; 
  27. /**
  28.      * 排序字段
  29.      */
  30. protected String orderByClause; 
  31. /**
  32.      * sql条件
  33.      */
  34. protected List oredCriteria; 
  35. public String getCommand() 
  36.     { 
  37. return command; 
  38.     } 
  39. public void setCommand(String command) 
  40.     { 
  41. this.command = command; 
  42.     } 
  43. public BaseSelector() { 
  44.         oredCriteria = new ArrayList (); 
  45.     } 
  46. protected BaseSelector(BaseSelector example) { 
  47. this.orderByClause = example.orderByClause; 
  48. this.oredCriteria = example.oredCriteria; 
  49.     } 
  50. /**
  51.      * 生成最终sql语句
  52.      */
  53. public String toSql() 
  54.     { 
  55. if(oredCriteria==null||oredCriteria.size()<=0) 
  56. return command; 
  57.         StringBuffer sqlAll = new StringBuffer(); 
  58.         sqlAll.append(command); 
  59. if (command != null && command.toUpperCase().indexOf(" WHERE ") == -1) 
  60.             sqlAll.append(" WHERE "); 
  61. else
  62.             sqlAll.append(" AND "); 
  63. for (Criteria cri : oredCriteria) 
  64.         { 
  65. if(!cri.isValid()) 
  66. continue; 
  67.             sqlAll.append("("); 
  68.             StringBuffer sql = new StringBuffer(); 
  69.             criteriaWithoutValueSql(sql,cri.criteriaWithoutValue); 
  70.             criteriaWithSingleValueSql(sql,cri.criteriaWithSingleValue); 
  71.             criteriaWithListValueSql(sql,cri.criteriaWithListValue); 
  72.             criteriaWithBetweenValueSql(sql,cri.criteriaWithBetweenValue); 
  73.             sqlAll.append(sql.toString()); 
  74.             sqlAll.append(")"); 
  75.             sqlAll.append(" or "); 
  76.         } 
  77. return sqlAll.substring(0, sqlAll.length()-4); 
  78.     } 
  79. @SuppressWarnings("unchecked") 
  80. private String criteriaWithoutValueSql(StringBuffer sql,List list) 
  81.     { 
  82. if(list==null) 
  83. return ""; 
  84. int n = list.size(); 
  85. for (int i = 0;i
  86.         { 
  87.             sql.append(list.get(i)); 
  88. if(i
  89.                 sql.append(" and "); 
  90.         } 
  91. return sql.toString(); 
  92.     } 
  93. @SuppressWarnings("unchecked") 
  94. private String criteriaWithSingleValueSql(StringBuffer sql,List list) 
  95.     { 
  96. if(list==null) 
  97. return ""; 
  98. if (sql.length() > 0&&list.size()>0) 
  99.             sql.append(" and "); 
  100. int n = list.size(); 
  101. for (int i = 0;i
  102.         { 
  103.             Map map = (Map) list.get(i); 
  104.             sql.append(map.get("condition")).append(map.get("value")); 
  105. if(i
  106.                 sql.append(" and "); 
  107.         } 
  108. return sql.toString(); 
  109.     } 
  110. @SuppressWarnings("unchecked") 
  111. private String criteriaWithListValueSql(StringBuffer sql,List list) 
  112.     { 
  113. if(list==null) 
  114. return ""; 
  115. if (sql.length() > 0&&list.size()>0) 
  116.             sql.append(" and "); 
  117. int n = list.size(); 
  118. for (int i = 0;i
  119.         { 
  120.             Map map = (Map) list.get(i); 
  121.             sql.append(map.get("condition")).append("("+join((Collection) map.get("values"),",")+")"); 
  122. if(i
  123.                 sql.append(" and "); 
  124.         } 
  125. return sql.toString(); 
  126.     } 
  127. @SuppressWarnings("unchecked") 
  128. private String criteriaWithBetweenValueSql(StringBuffer sql,List list) 
  129.     { 
  130. if(list==null) 
  131. return ""; 
  132. if (sql.length() > 0&&list.size()>0) 
  133.             sql.append(" and "); 
  134. int n = list.size(); 
  135. for (int i = 0;i
  136.         { 
  137.             Map map = (Map) list.get(i); 
  138.             sql.append(map.get("condition")).append(join((Collection) map.get("values")," and ")); 
  139. if(i
  140.                 sql.append(" and "); 
  141.         } 
  142. return sql.toString(); 
  143.     } 
  144. @SuppressWarnings("unchecked") 
  145. private String  join(Collection list,String spe) 
  146.     { 
  147. if(list==null) 
  148. return ""; 
  149.         Object array[] = list.toArray(); 
  150.         StringBuffer buff = new StringBuffer(); 
  151. for (int i = 0; i < array.length; i++) 
  152.         { 
  153.             buff.append(array[i]); 
  154. if(i
  155.                 buff.append(spe); 
  156.         } 
  157. return buff.toString(); 
  158.     } 
  159. /**
  160.      * 顺序排序
  161.      * @param field
  162.      */
  163. public void setOrderByClauseAsc(String field) { 
  164. this.orderByClause = getFieldName(field) + " ASC"; 
  165.     } 
  166. /**
  167.      * 倒序排序
  168.      * @param field
  169.      */
  170. public void setOrderByClauseDesc(String field) { 
  171. this.orderByClause = getFieldName(field) + " DESC"; 
  172.     } 
  173. public String getOrderByClause() { 
  174. return orderByClause; 
  175.     } 
  176. public List getOredCriteria() { 
  177. return oredCriteria; 
  178.     } 
  179. /**
  180.      * or 条件
  181.      */
  182. public void or(Criteria criteria) { 
  183.         oredCriteria.add(criteria); 
  184.     } 
  185. /**
  186.      * 创建条件对象
  187.      */
  188. public Criteria createCriteria() { 
  189.         Criteria criteria = createCriteriaInternal(); 
  190. if (oredCriteria.size() == 0) { 
  191.             oredCriteria.add(criteria); 
  192.         } 
  193. return criteria; 
  194.     } 
  195. protected Criteria createCriteriaInternal() { 
  196.         Criteria criteria = new Criteria(); 
  197. return criteria; 
  198.     } 
  199. /**
  200.      * 清除条件
  201.      */
  202. public void clear() { 
  203.         oredCriteria.clear(); 
  204.     } 
  205. static String getFieldName(String field) 
  206.     { 
  207. if (field == null ) { 
  208. throw new RuntimeException( field + " cannot be null"); 
  209.         } 
  210. return field.toUpperCase(); 
  211. //
  212. //
  213. //        Pattern pattern = Pattern.compile("[A-Z]{1}");
  214. //        Matcher m =  pattern.matcher(field);
  215. //        StringBuffer sbr = new StringBuffer();
  216. //        while(m.find())
  217. //            m.appendReplacement(sbr, "_"+m.group());
  218. //        m.appendTail(sbr);
  219. //        return sbr.toString().toUpperCase();
  220.     } 
  221. /** 
  222.      * 查询条件 
  223.      */
  224. public static class Criteria { 
  225. protected List criteriaWithoutValue; 
  226. protected List > criteriaWithSingleValue; 
  227. protected List > criteriaWithListValue; 
  228. protected List > criteriaWithBetweenValue; 
  229. protected Criteria() { 
  230. super(); 
  231.             criteriaWithoutValue = new ArrayList (); 
  232.             criteriaWithSingleValue = new ArrayList >(); 
  233.             criteriaWithListValue = new ArrayList >(); 
  234.             criteriaWithBetweenValue = new ArrayList >(); 
  235.         } 
  236. public boolean isValid() { 
  237. return criteriaWithoutValue.size() > 0
  238.                 || criteriaWithSingleValue.size() > 0
  239.                 || criteriaWithListValue.size() > 0
  240.                 || criteriaWithBetweenValue.size() > 0; 
  241.         } 
  242. public List getCriteriaWithoutValue() { 
  243. return criteriaWithoutValue; 
  244.         } 
  245. public List > getCriteriaWithSingleValue() { 
  246. return criteriaWithSingleValue; 
  247.         } 
  248. public List > getCriteriaWithListValue() { 
  249. return criteriaWithListValue; 
  250.         } 
  251. public List > getCriteriaWithBetweenValue() { 
  252. return criteriaWithBetweenValue; 
  253.         } 
  254. protected void addCriterion(String condition) { 
  255. if (condition == null||"".equals(condition)) { 
  256. return; 
  257.             } 
  258.             criteriaWithoutValue.add(condition); 
  259.         } 
  260. protected void addCriterion(String condition, Object value, String property) { 
  261. if (value == null||"".equals(value)) { 
  262. return; 
  263.             } 
  264.             Map map = new HashMap (); 
  265.             map.put("condition", condition); 
  266.             map.put("value", value); 
  267.             criteriaWithSingleValue.add(map); 
  268.         } 
  269. protected void addCriterion(String condition, List values, String property) { 
  270. if (values == null || values.size() == 0) { 
  271. return; 
  272.             } 
  273.             Map map = new HashMap (); 
  274.             map.put("condition", condition); 
  275.             map.put("values", values); 
  276.             criteriaWithListValue.add(map); 
  277.         } 
  278. protected void addCriterion(String condition, Object value1, Object value2, String property) { 
  279. if (value1 == null || value2 == null) { 
  280. return; 
  281.             } 
  282.             List list = new ArrayList(); 
    •             list.add(value1); 
    •             list.add(value2); 
    •             Map map = new HashMap (); 
    •             map.put("condition", condition); 
    •             map.put("values", list); 
    •             criteriaWithBetweenValue.add(map); 
    •         } 
    • public Criteria andIsNull(String field) { 
    •             addCriterion(getFieldName(field)+" is null"); 
    • return this; 
    •         } 
    • public Criteria andIsNotNull(String field) { 
    •             addCriterion(getFieldName(field)+" is not null"); 
    • return this; 
    •         } 
    • public Criteria andEqualTo(String field,String value) { 
    •             addCriterion(getFieldName(field)+" =", quoteStr(value), field); 
    • return this; 
    •         } 
    • public Criteria andNotEqualTo(String field,String value) { 
    •             addCriterion(getFieldName(field)+" <>", quoteStr(value), field); 
    • return this; 
    •         } 
    • public Criteria andGreaterThan(String field,String value) { 
    •             addCriterion(getFieldName(field)+" >", quoteStr(value), field); 
    • return this; 
    •         } 
    • public Criteria andGreaterThanOrEqualTo(String field,String value) { 
    •             addCriterion(getFieldName(field)+" >=", quoteStr(value), field); 
    • return this; 
    •         } 
    • public Criteria andLessThan(String field,String value) { 
    •             addCriterion(getFieldName(field)+" <", quoteStr(value), field); 
    • return this; 
    •         } 
    • public Criteria andLessThanOrEqualTo(String field,String value) { 
    •             addCriterion(getFieldName(field)+" <=", quoteStr(value), field); 
    • return this; 
    •         } 
    • public Criteria andLike(String field,String value) { 
    •             addCriterion(getFieldName(field)+" like", quoteStr(value), field); 
    • return this; 
    •         } 
    • public Criteria andNotLike(String field,String value) { 
    •             addCriterion(getFieldName(field)+" not like", quoteStr(value), field); 
    • return this; 
    •         } 
    • @SuppressWarnings("unchecked") 
    • public Criteria andIn(String field,List values) { 
    •             List vs = new ArrayList(); 
    • for (String string : values) 
    •             { 
    •                 vs.add(quoteStr(string)); 
    •             } 
    •             addCriterion(getFieldName(field)+" in", vs, field); 
    • return this; 
    •         } 
    • @SuppressWarnings("unchecked") 
    • public Criteria andNotIn(String field,List values) { 
    •             List vs = new ArrayList(); 
    • for (String string : values) 
    •             { 
    •                 vs.add(quoteStr(string)); 
    •             } 
    •             addCriterion(getFieldName(field)+" not in", vs, field); 
    • return this; 
    •         } 
    • public Criteria andBetween(String field,String value1, String value2) { 
    •             addCriterion(getFieldName(field)+" between", quoteStr(value1), quoteStr(value2), field); 
    • return this; 
    •         } 
    • public Criteria andNotBetween(String field,String value1, String value2) { 
    •             addCriterion(getFieldName(field)+" not between", quoteStr(value1), quoteStr(value2), field); 
    • return this; 
    •         } 
    • private String quoteStr(String str) 
    •         { 
    • if(str==null) 
    • return null; 
    • return "'"+str+"'"; 
    •         } 
    •     } 
    • @SuppressWarnings("unchecked") 
    • public static void main(String[] args) 
    •     { 
    •         List days = new LinkedList(); 
    •         days.add("2008-01-01"); 
    •         days.add("2008-01-02"); 
    •         BaseSelector cri = new BaseSelector(); 
    •         cri.setCommand("select * from table where 1=1"); 
    •         cri.createCriteria().andEqualTo("org_code", "vvv") 
    •         .andIn("day_code", days); 
    •         cri.or( cri.createCriteria().andEqualTo("status", "1")); 
    •         System.out.println(cri.toSql()); 
    •     }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值