/*** 根据QueryRule自动构建sql语句*/
public class QueryRuleSqlBuilder {private int CURR_INDEX = 0; //记录参数所在的位置private List<String> properties; //保存列名列表private List<Object> values; //保存参数值列表private List<Order> orders; //保存排序规则列表private String whereSql = ""; private String orderSql = "";private Object [] valueArr = new Object[]{};private Map<Object,Object> valueMap = new HashMap<Object,Object>();/*** 或得查询条件* @return*/public String getWhereSql(){return this.whereSql;}/*** 获得排序条件* @return*/public String getOrderSql(){return this.orderSql;}/*** 获得参数值列表* @return*/public Object [] getValues(){return this.valueArr;}/*** 获取参数列表* @return*/public Map<Object,Object> getValueMap(){return this.valueMap;}/*** 创建SQL构造器* @param queryRule*/public QueryRuleSqlBuilder(QueryRule queryRule) {CURR_INDEX = 0;properties = new ArrayList<String>();values = new ArrayList<Object>();orders = new ArrayList<Order>();for (Rule rule : queryRule.getRuleList()) {switch (rule.getType()) {case QueryRule.BETWEEN:processBetween(rule);break;case QueryRule.EQ:processEqual(rule);break;case QueryRule.LIKE:processLike(rule);break;case QueryRule.NOTEQ:processNotEqual(rule);break;case QueryRule.GT:processGreaterThen(rule);break;case QueryRule.GE:processGreaterEqual(rule);break;case QueryRule.LT:processLessThen(rule);break;case QueryRule.LE:processLessEqual(rule);break;case QueryRule.IN:processIN(rule);break;case QueryRule.NOTIN:processNotIN(rule);break;case QueryRule.ISNULL:processIsNull(rule);break;case QueryRule.ISNOTNULL:processIsNotNull(rule);break;case QueryRule.ISEMPTY:processIsEmpty(rule);break;case QueryRule.ISNOTEMPTY:processIsNotEmpty(rule);break;case QueryRule.ASC_ORDER:processOrder(rule);break;case QueryRule.DESC_ORDER:processOrder(rule);break;default:throw new IllegalArgumentException("type " + rule.getType() + " not supported.");}}//拼装where语句appendWhereSql();//拼装排序语句appendOrderSql();//拼装参数值appendValues();}/*** 去掉order* * @param sql* @return*/protected String removeOrders(String sql) {Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE);Matcher m = p.matcher(sql);StringBuffer sb = new StringBuffer();while (m.find()) {m.appendReplacement(sb, "");}m.appendTail(sb);return sb.toString();}/*** 去掉select* * @param sql* @return*/protected String removeSelect(String sql) {if(sql.toLowerCase().matches("from\\s+")){int beginPos = sql.toLowerCase().indexOf("from");return sql.substring(beginPos);}else{return sql;}}/*** 处理like* @param rule*/private  void processLike(Rule rule) {if (ArrayUtils.isEmpty(rule.getValues())) {return;}Object obj = rule.getValues()[0];if (obj != null) {String value = obj.toString();if (!StringUtils.isEmpty(value)) {value = value.replace('*', '%');obj = value;}}add(rule.getAndOr(),rule.getPropertyName(),"like","%"+rule.getValues()[0]+"%");}/*** 处理between* @param rule*/private  void processBetween(Rule rule) {if ((ArrayUtils.isEmpty(rule.getValues()))|| (rule.getValues().length < 2)) {return;}add(rule.getAndOr(),rule.getPropertyName(),"","between",rule.getValues()[0],"and");add(0,"","","",rule.getValues()[1],"");}/*** 处理 =* @param rule*/private  void processEqual(Rule rule) {if (ArrayUtils.isEmpty(rule.getValues())) {return;}add(rule.getAndOr(),rule.getPropertyName(),"=",rule.getValues()[0]);}/*** 处理 <>* @param rule*/private  void processNotEqual(Rule rule) {if (ArrayUtils.isEmpty(rule.getValues())) {return;}add(rule.getAndOr(),rule.getPropertyName(),"<>",rule.getValues()[0]);}/*** 处理 >* @param rule*/private  void processGreaterThen(Rule rule) {if (ArrayUtils.isEmpty(rule.getValues())) {return;}add(rule.getAndOr(),rule.getPropertyName(),">",rule.getValues()[0]);}/*** 处理>=* @param rule*/private  void processGreaterEqual(Rule rule) {if (ArrayUtils.isEmpty(rule.getValues())) {return;}add(rule.getAndOr(),rule.getPropertyName(),">=",rule.getValues()[0]);}/*** 处理<* @param rule*/private  void processLessThen(Rule rule) {if (ArrayUtils.isEmpty(rule.getValues())) {return;}add(rule.getAndOr(),rule.getPropertyName(),"<",rule.getValues()[0]);}/*** 处理<=* @param rule*/private  void processLessEqual(Rule rule) {if (ArrayUtils.isEmpty(rule.getValues())) {return;}add(rule.getAndOr(),rule.getPropertyName(),"<=",rule.getValues()[0]);}/*** 处理  is null* @param rule*/private  void processIsNull(Rule rule) {add(rule.getAndOr(),rule.getPropertyName(),"is null",null);}/*** 处理 is not null* @param rule*/private  void processIsNotNull(Rule rule) {add(rule.getAndOr(),rule.getPropertyName(),"is not null",null);}/*** 处理  <>''* @param rule*/private  void processIsNotEmpty(Rule rule) {add(rule.getAndOr(),rule.getPropertyName(),"<>","''");}/*** 处理 =''* @param rule*/private  void processIsEmpty(Rule rule) {add(rule.getAndOr(),rule.getPropertyName(),"=","''");}/*** 处理in和not in* @param rule* @param name*/private void inAndNotIn(Rule rule,String name){if (ArrayUtils.isEmpty(rule.getValues())) {return;}if ((rule.getValues().length == 1) && (rule.getValues()[0] != null)&& (rule.getValues()[0] instanceof List)) {List<Object> list = (List) rule.getValues()[0];if ((list != null) && (list.size() > 0)){for (int i = 0; i < list.size(); i++) {if(i == 0 && i == list.size() - 1){add(rule.getAndOr(),rule.getPropertyName(),"",name + " (",list.get(i),")");}else if(i == 0 && i < list.size() - 1){add(rule.getAndOr(),rule.getPropertyName(),"",name + " (",list.get(i),"");}if(i > 0 && i < list.size() - 1){add(0,"",",","",list.get(i),"");}if(i == list.size() - 1 && i != 0){add(0,"",",","",list.get(i),")");}}}} else {Object[] list =  rule.getValues();for (int i = 0; i < list.length; i++) {if(i == 0 && i == list.length - 1){add(rule.getAndOr(),rule.getPropertyName(),"",name + " (",list[i],")");}else if(i == 0 && i < list.length - 1){add(rule.getAndOr(),rule.getPropertyName(),"",name + " (",list[i],"");}if(i > 0 && i < list.length - 1){add(0,"",",","",list[i],"");}if(i == list.length - 1 && i != 0){add(0,"",",","",list[i],")");}}}}/*** 处理 not in* @param rule*/private void processNotIN(Rule rule){inAndNotIn(rule,"not in");}/*** 处理 in* @param rule*/private  void processIN(Rule rule) {inAndNotIn(rule,"in");}/*** 处理 order by* @param rule 查询规则*/private void processOrder(Rule rule) {switch (rule.getType()) {case QueryRule.ASC_ORDER:// propertyName非空if (!StringUtils.isEmpty(rule.getPropertyName())) {orders.add(Order.asc(rule.getPropertyName()));}break;case QueryRule.DESC_ORDER:// propertyName非空if (!StringUtils.isEmpty(rule.getPropertyName())) {orders.add(Order.desc(rule.getPropertyName()));}break;default:break;}}/*** 加入到sql查询规则队列* @param andOr and 或者 or* @param key 列名* @param split 列名与值之间的间隔* @param value 值*/private  void add(int andOr,String key,String split ,Object value){add(andOr,key,split,"",value,"");}/*** 加入到sql查询规则队列* @param andOr and 或则 or* @param key 列名* @param split 列名与值之间的间隔* @param prefix 值前缀* @param value 值* @param suffix 值后缀*/private  void add(int andOr,String key,String split ,String prefix,Object value,String  suffix){String andOrStr = (0 == andOr ? "" :(QueryRule.AND == andOr ? " and " : " or "));  properties.add(CURR_INDEX, andOrStr + key + " " + split + prefix + (null != value ? " ? " : " ") + suffix);if(null != value){values.add(CURR_INDEX,value);CURR_INDEX ++;}}/*** 拼装 where 语句*/private void appendWhereSql(){StringBuffer whereSql = new StringBuffer();for (String p : properties) {whereSql.append(p);}this.whereSql = removeSelect(removeOrders(whereSql.toString()));}/*** 拼装排序语句*/private void appendOrderSql(){StringBuffer orderSql = new StringBuffer();for (int i = 0 ; i < orders.size(); i ++) {if(i > 0 && i < orders.size()){orderSql.append(",");}orderSql.append(orders.get(i).toString());}this.orderSql = removeSelect(removeOrders(orderSql.toString()));}/*** 拼装参数值*/private void appendValues(){Object [] val = new Object[values.size()];for (int i = 0; i < values.size(); i ++) {val[i] = values.get(i);valueMap.put(i, values.get(i));}this.valueArr = val;}}

基于SpringJDBC 实现关键功能-QueryRuleSqlBulider相关推荐

  1. 基于SpringJDBC 实现关键功能-EntityOperation

    /*** 实体对象的反射操作*/ public class EntityOperation<T> {private Logger log = Logger.getLogger(Entity ...

  2. 基于SpringJDBC 实现关键功能-ClassMappings

    public class ClassMappings {private ClassMappings(){}static final Set<Class<?>> SUPPORTE ...

  3. 核心网upf作用_高性能5G核心网,动力从何而来? 核心网,是整个通信网络的大脑,是不可或缺的重要组成部分。 网络的管理控制、鉴权认证等关键功能,主要由核心网负责。核心网的... - 雪球...

    来源:雪球App,作者: 鲜枣课堂,(https://xueqiu.com/7282046183/152278945) 核心网,是整个通信网络的大脑,是不可或缺的重要组成部分. 网络的管理控制.鉴权认 ...

  4. 硬件课程设计:基于STM32的多功能播放器之小说阅读

    1 小说阅读功能 1.1 功能介绍 1.1.1 设计思路 在TFTLCD屏上显示中英文文本文件是本次硬件课程设计的基本要求,也是我设计的多功能播放器最重要的功能,要求能够读取事先存储在SD卡中的文本文 ...

  5. 硬件课程设计:基于STM32的多功能播放器之MP3音乐播放

    3 MP3音乐播放 3.1 功能介绍 3.1.1 设计思路 音乐播放是手机等电子产品最常见的功能,也是最具娱乐性的功能,在该模块中,我先从SD卡中读取已存放的MP3音乐文件,然后将读取的字节流依次送人 ...

  6. 企业集成平台即服务的关键功能

    2020年9月21日发布-ID G00434187-32分钟阅读 本文是Critical Capabilities for Enterprise Integration Platform as a S ...

  7. 硬件课程设计:基于STM32的多功能播放器之聊天功能

    6 聊天功能 6.1 功能介绍 6.1.1 设计思路        在该功能模块中,我打算模拟手机QQ的聊天功能,不同的是QQ是通过互联网实现手机与手机之间的通信,而我是通过蓝牙实现stm32开发板与 ...

  8. think php ajax分页,thinkPHP5框架实现基于ajax的分页功能示例

    本文实例讲述了thinkPHP5框架实现基于ajax的分页功能.分享给大家供大家参考,具体如下: 最近一个页面的选项卡又牵扯到ajax分页,所以研究了一下tp5的ajax分页使用方法 首先看一下tp5 ...

  9. 移动端apm关键指标_3个经常被忽视的APM关键功能

    移动端apm关键指标 APM核心功能已不再足够. 市场领先的应用程序超越了所有人,树立了其他人必须匹配的新标准. 每当任何针对消费者或企业的Web应用程序达到新的性能高峰时,都会为用户期望值设定基准. ...

最新文章

  1. linux libffi 简介 高级语言互调库
  2. 一篇博客带你轻松应对Springboot面试
  3. 作为Leader如何与团队成员更好地沟通?
  4. 数据结构实验之图论二:图的深度遍历(DFS)
  5. 2022年全球及中国商业净水器行业十四五运营方向与盈利前景分析报告
  6. Android 自定义Button按钮显示样式(正常、按下、获取焦点)
  7. 每天一道LeetCode-----后缀表达式求值
  8. PAT乙级题目——1002写出这个数
  9. 性能测试工具JMeter的安装及环境配置--Windows和Linux
  10. python字典成绩_python字典总结
  11. hdoj1176 免费馅饼(dp 数塔)
  12. 105.输出控制缓存
  13. retinex算法小感
  14. SDUT 2482 二叉排序树
  15. ubuntu 配置登录失败次数限制
  16. 3DSMAX中英文对照大全(从A-Z分类)
  17. Wordpress模板主题中functions.php常用功能代码与常用插件[ 后台篇](持续收集整理)
  18. 最新车载以太网解决方案,你知多少?
  19. 有的js为什么放在body里面
  20. 穷人靠学,富人靠抄!

热门文章

  1. Java全套零基础视频教程,2019最新编程
  2. Mysql的一些问题
  3. 绕过CDN查找网站真实IP方法收集
  4. atitit.jQuery Validate验证框架详解与ati Validate 设计新特性
  5. liferay 导入源码问题
  6. Mobile RDA 同步数据库的类--转
  7. 【HTTPS、HTTP】网易新闻首页https跨协议调用http的问题
  8. Extjs.FormPanel
  9. 深度有趣 | 01 前言
  10. 本地Git关联远程Git时遇到的一些问题