精华内容
下载资源
问答
  • 但是我测试过程中发现,通过ajax动态请求资源时候,IE默认使用浏览器缓存,根本就不数据包,加上 requestIf-Modified-Since属性后,会数据包了,但是这个时间应该设为缓存中最后修改时间。如何获得...
  • 但Qt Creator 默认是用动态链接, 就是可执行程序在运行时需要相应.dll 文件。我们点击生成.exe 文件,首 先可能显示“没有找到mingwm10.dll,因此这个应用程序未能启动。重新安装 应用程序可能会修复此问题。...
  • C#23种设计模式

    2013-06-02 16:49:43
    (100块钱一份,你要不要) 原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有...
  • 原始模型模式: 原始模型模式 通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原 型对象的方法创建出更多同类型的对象。 原始模型模式允许动态的增加或减少产品类, 产品 类不需要非得有任何事先...
  • 所以我们爬虫也应该用某种规则来获取那些一开始进入页面没有获取到文章列表。我们来看下知乎发现页下network,当页面向下滚动时候会加载新文章,这个时候会一个新请求: 首先可以...
  • asp.net知识库

    2015-06-18 08:45:45
    完整的动态加载/卸载程序集的解决方案 从NUnit中理解.NET自定义属性的应用(转载) 如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件机制的简单实现 我对J2EE和.NET的一点理解 难分难舍的DSO(一) ...
  • 第一次博客,不知道该怎么写,算了直接提出问题吧先: 现在持久层框架用最多的应该是hibernate、mybatis或者包含现在jpa吧,也是前两天接触jpa,我也不晓得为什么这玩意能火起来而且尤其是国外用比mybatis...

    第一次发博客,不知道该怎么写,算了直接提出问题吧先:

    现在持久层框架用的最多的应该是hibernate、mybatis或者包含现在的jpa吧,也是前两天接触jpa,我也不晓得为什么这玩意能火起来而且尤其是国外用的比mybatis多的多的多,我擦,百思不得其解。想了半天也只有在不使用多表或者动态多条件的情况下这东西能用用,可是哪个应用会出现全部功能都是单表操作呢,我估计很少吧。所以与其代码中写一大推原生sql,拼接各种条件,然后返回自定义对象可能还不是那么完美的情况下,直接使用mybatis它不香么…

    okok,跑偏了,说说今天的主题:假如你用了jpa并且有多表关联很可能还有很多动态条件(可以传值可以为空,传值时动态拼接查询语句),那么代码中耦合sql语句并且各种 if 判空,这显得非常不优雅而且在业务变动的情况下很麻烦,所以想到了有没有类似mybatis中的动态语句生成工具 SQL.java这个类,原本是想着直接拿过来用,结果遗憾的是mybatis中的这个工具并不能达到我的需求,不是那么健全。基于这个情况在网上也没有找到合适的工具类(不重复造轮子我们只是轮子的搬运工),因此花了三天死掉了好多脑细胞的情况下自己搞了一个工具类(主要废弃了好几种方案最终采用了目前的这个),代码不多也很简单,就是装的不够优雅所以发出来让大家帮忙优化优化。

    举个例子:假如我们有以下这么一个jpa查询,并且班级、性别和年龄条件都是动态的,这个业务含义应该不用解释很简单,

    select s from Student s where class='class2' and ((age>=20 and sex='男') or (age <=16 and sex = '女'))
    

    那么可以按照如下写法:

    Cnd.select("select s from Student s")
    .andExp("name","like","%张三%")
    .andExp("class","=","class2")
    .andExps(Cnd.exps(Cnd.exp("age",">=","20").andExp("sex","=","男")).orExps(Cnd.exp("age","<=","16").andExp("sex","=","女")));
    

    执行后生成的SQL语句长这样:

    select s from Student s where name like :name_0 and class = :class_0 and ((age >= :age_0 and sex = :sex_0) or (age <= :age_1 and sex = :sex_1))
    

    然后Cnd中会封装查询参数,可以用在后边查询流程:
    在这里插入图片描述

    一般业务不会太复杂,但是条件可以是动态的,上边写法当名称或者年龄为空时生成的查询语句不会包含这个条件

    so还是挺简单,直接上代码,

    public class Cnd {
        private String select = "";
        private StringBuilder cndStr = new StringBuilder();
        private Map<String, Object> conditions = new HashMap<String, Object>();
    
        private Cnd() {
        }
    
        /**
         * 获取条件表达式
         * @param ql 查询语句
         */
        public static Cnd select(String ql) {
            Cnd cnd = new Cnd();
            cnd.select = ql;
            return cnd;
        }
    
        /**
         * 获取条件表达式
         *
         * @param name
         * @param operator
         * @param value
         * @return
         */
        public static Cnd exp(String name, String operator, Object value) {
            Cnd cnd = new Cnd();
            if(!cnd.validate(value)) {
                return cnd;
            }
            String alias = cnd.setAlias(name,value);
            cnd.cndStr.append(" where ").append(name).append(" ").append(operator).append(" ").append(":").append(alias);
            return cnd;
        }
    
        /**
         * 获取条件表达式组
         *
         * @param cnd
         * @return
         */
        public static Cnd exps(Cnd cnd) {
            Cnd cnd1 = new Cnd();
            cnd1.andExps(cnd);
            return cnd1;
        }
    
        /**
         * 增加 and条件表达式
         *
         * @param name
         * @param operator
         * @param value
         * @return
         */
        public Cnd andExp(String name, String operator, Object value) {
            if(!validate(value)) {
                return this;
            }
            if(value instanceof Cnd) {
                Cnd cnd = (Cnd)value;
                Iterator<Map.Entry<String, Object>> entries = cnd.conditions.entrySet().iterator();
                while (entries.hasNext()) {
                    Map.Entry<String, Object> entry = entries.next();
                    String k = entry.getKey();
                    Object v = entry.getValue();
                    String alias = setAlias(k,v);
                    cnd.cndStr.replace(cnd.cndStr.indexOf(k),cnd.cndStr.indexOf(k)+k.length(),alias);
                    conditions.put(alias,v);
                }
                if(cnd.toString().trim().startsWith("where")) {
                    cnd.cndStr.replace(0,cnd.cndStr.indexOf("where")+6,"");
                }
                if (cndStr.length() != 0) {
                    cndStr.append(" and ").append(name).append(" ").append(operator).append("(").append(cnd.select).append(cnd.cndStr.toString()).append(")");
                } else {
                    cndStr.append(" where ").append(name).append(" ").append(operator).append("(").append(cnd.select).append(cnd.cndStr.toString()).append(")");
                }
            } else {
                String alias = setAlias(name, value);
                if (cndStr.length() != 0) {
                    cndStr.append(" and ").append(name).append(" ").append(operator).append(" ").append(":").append(alias);
                } else {
                    cndStr.append(" where ").append(name).append(" ").append(operator).append(" ").append(":").append(alias);
                }
            }
            return this;
        }
    
        /**
         * 增加or条件表达式
         *
         * @param name
         * @param operator
         * @param value
         * @return
         */
        public Cnd orExp(String name, String operator, Object value) {
            if(!validate(value)) {
                return this;
            }
            if(value instanceof Cnd) {
                Cnd cnd = (Cnd)value;
                Iterator<Map.Entry<String, Object>> entries = cnd.conditions.entrySet().iterator();
                while (entries.hasNext()) {
                    Map.Entry<String, Object> entry = entries.next();
                    String k = entry.getKey();
                    Object v = entry.getValue();
                    String alias = setAlias(k,v);
                    cnd.cndStr.replace(cnd.cndStr.indexOf(k),cnd.cndStr.indexOf(k)+k.length(),alias);
                    conditions.put(alias,v);
                }
                if(cnd.toString().trim().startsWith("where")) {
                    cnd.cndStr.replace(0,cnd.cndStr.indexOf("where")+6,"");
                }
                if (cndStr.length() != 0) {
                    cndStr.append(" or ").append(name).append(" ").append(operator).append("(").append(cnd.select).append(cnd.cndStr.toString()).append(")");
                } else {
                    cndStr.append(" where ").append(name).append(" ").append(operator).append("(").append(cnd.select).append(cnd.cndStr.toString()).append(")");
                }
            } else {
                String alias = setAlias(name, value);
                if (cndStr.length() != 0) {
                    cndStr.append(" or ").append(name).append(" ").append(operator).append(" ").append(":").append(alias);
                } else {
                    cndStr.append(" where ").append(name).append(name).append(" ").append(operator).append(" ").append(":").append(alias);
                }
            }
            return this;
        }
    
        /**
         * 增加and条件表达式组
         *
         * @param cnd
         * @return
         */
        public Cnd andExps(Cnd cnd) {
            //经单线程或者多线程环境测试,使用lambda表达式生成需要60毫秒,原生Entry遍历1毫秒左右
            //cnd.conditions.forEach((k,v)->{
            //    String alias = setAlias(k,v);
            //    cnd.cndStr.replace(cnd.cndStr.indexOf(k),cnd.cndStr.indexOf(k)+k.length(),alias);
            //    conditions.put(alias,v);
            //});
            if(cnd.toString().length()==0) {
                return this;
            }
            Iterator<Map.Entry<String, Object>> entries = cnd.conditions.entrySet().iterator();
            while (entries.hasNext()) {
                Map.Entry<String, Object> entry = entries.next();
                String k = entry.getKey();
                Object v = entry.getValue();
                String alias = setAlias(k,v);
                cnd.cndStr.replace(cnd.cndStr.indexOf(k),cnd.cndStr.indexOf(k)+k.length(),alias);
                conditions.put(alias,v);
            }
            if(cnd.toString().trim().startsWith("where")) {
                cnd.cndStr.replace(0,cnd.cndStr.indexOf("where")+6,"");
            }
            if (cndStr.length() != 0) {
                cndStr.append(" and (").append(cnd.toString()).append(")");
            } else {
                cndStr.append(" where (").append(cnd.toString()).append(")");
            }
            return this;
        }
    
        /**
         * 增加or条件表达式组
         *
         * @param cnd
         * @return
         */
        public Cnd orExps(Cnd cnd) {
            //经单线程或者多线程环境测试,使用lambda表达式生成需要60毫秒,原生Entry遍历1毫秒左右
            //cnd.conditions.forEach((k,v)->{
            //    String alias = setAlias(k,v);
            //    cnd.cndStr.replace(cnd.cndStr.indexOf(k),cnd.cndStr.indexOf(k)+k.length(),alias);
            //    conditions.put(alias,v);
            //});
            if(cnd.toString().length()==0) {
                return this;
            }
            Iterator<Map.Entry<String, Object>> entries = cnd.conditions.entrySet().iterator();
            while (entries.hasNext()) {
                Map.Entry<String, Object> entry = entries.next();
                String k = entry.getKey();
                Object v = entry.getValue();
                String alias = setAlias(k,v);
                cnd.cndStr.replace(cnd.cndStr.indexOf(k),cnd.cndStr.indexOf(k)+k.length(),alias);
                conditions.put(alias,v);
            }
            if(cnd.toString().trim().startsWith("where")) {
                cnd.cndStr.replace(0,cnd.cndStr.indexOf("where")+6,"");
            }
            if (cndStr.length() != 0) {
                cndStr.append(" or (").append(cnd.toString()).append(")");
            } else {
                cndStr.append(" where (").append(cnd.toString()).append(")");
            }
            return this;
        }
    
        private boolean isOpenGroupBy = false;
        private boolean isOpenOrderBy = false;
        public Cnd groupBy(String groupBy) {
            if(isOpenGroupBy) {
                cndStr.append(",").append(groupBy);
            } else {
                cndStr.append(" group by ").append(groupBy);
                isOpenGroupBy = true;
            }
            return this;
        }
    
        public Cnd orderBy(String orderBy) {
            if(isOpenOrderBy) {
                cndStr.append(",").append(orderBy);
            } else {
                cndStr.append(" order by ").append(orderBy);
                isOpenOrderBy = true;
            }
            return this;
        }
    
        /**
         * 参数验证
         * @param value
         * @return
         */
        private boolean validate(Object value){
            //值为空
            if(value==null) {
                return false;
            }
            if(value instanceof String) {
                String str = String.valueOf(value).trim();
                //值为空字符串
                if (str.length()==0) {
                    return false;
                }
                //like语句时,值为空字符串
                else if(str.replaceAll("%","").length()==0 || str.replaceAll("%","").equals("null")) {
                    return false;
                }
            }
            return true;
        }
        /**
         * 设置参数map,如果存在需要修改别名
         * @param name
         * @param value
         */
        private String setAlias(String name, Object value) {
            if(name.indexOf(".")>0){
                name = name.substring(name.indexOf(".")+1);
            }
            String newName = null;
            int i = 0;
            if(name.lastIndexOf("_")<0) {
                name = name+"_"+0;
            } else {
                String str = name.substring(name.lastIndexOf("_")+1);
                try{
                    i = Integer.valueOf(str);
                } catch (Exception e){
                    name = name+"_"+i;
                }
            }
            String namePrefix = name.substring(0,name.indexOf("_")+1);
            newName = namePrefix+i;
            while(conditions.get(namePrefix+i)!=null) {
                i++;
                newName = namePrefix+i;
            }
            conditions.put(newName, value);
            return newName;
        }
    
        /**
         * 获取查询参数
         * @return
         */
        public Map<String,Object> getConditions(){
            return conditions;
        }
        /**
         * 获取select语句
         * @return
         */
        public String getSelect() {
            return select.toString();
        }
        public void setSelect(String select) {
            this.select = select;
        }
    
        @Override
        public String toString() {
            return select+cndStr.toString();
        }
    }
    

    ok基本上张这个样子,请各位大佬帮忙优化,谢谢…

    展开全文
  • 二十三种设计模式【PDF版】

    热门讨论 2011-05-30 14:13:49
    中国画,也有套路,树应该怎么画 法?有几种画法?艺术大家通常是创造出自己套路,比如明末清初,水墨画法开始成熟,这时画树就不用勾勒这个模式了,而是一笔 下去,浓淡几个叶子,待毛笔水墨要干枯时,画一下树干,这样,一...
  • 软件设计规范

    2015-03-11 11:57:50
    1、 活跃的、黏性的动态层次。应用层。和现实之间的界面,是设备逻辑。需求简化、解决方案的奇异性;应用算法的专业性。这是软件形象最活跃的部分。 这里用的是抽象(业务流程)和具体(设备能力)统一的思维方法,...
  • 数据结构--C++与面向对象的途径(修订版) 目录 出版者的话 专家指导委员会 中文版序 译者序 序 第2版序 第1版序 导 论 第1章 致读者 3 1.1 本书的结构 3 1.1.1 例子和参考 4 1.1.2 练习 5 1.1.3 有关...
  • 数据结构--C++与面向对象的途径(修订版) 目录 出版者的话 专家指导委员会 中文版序 译者序 序 第2版序 第1版序 导 论 第1章 致读者 3 1.1 本书的结构 3 1.1.1 例子和参考 4 1.1.2 练习 5 1.1.3 有关...
  • C++程序设计语言(特别版)--源代码

    热门讨论 2012-04-23 07:33:51
    数据结构--C++与面向对象的途径(修订版) 目录 出版者的话 专家指导委员会 中文版序 译者序 序 第2版序 第1版序 导 论 第1章 致读者 3 1.1 本书的结构 3 1.1.1 例子和参考 4 1.1.2 练习 5 1.1.3 有关...
  • 它会返回一个带有 <code>issue</code> 格式对象的数组。每一个 <code>issue</code> 有很多属性,我们可能不需要那么多,先了解了解底下这几种: <pre><code>javascript // 为了方便,我把...
  •  对象采样分析是CBO(基于成本的优化器)的灵魂和核心,CBO如果没有了对象的分析数据,就好像一个医生不使用病人的病历来确定病人的病一样危险—那是一种没有依据的、盲目的行为。  在这一章里,我们将详细讨论...
  •  注:官方帮助文档原文中对该事件描述中有这样一句:“If you return 'true' or do not return any value then the upload proceeds.”,从中可以看到既定设计是当不返回任何值时候应该等同于返回true,...
  • 1.2.8 对大数据平台中元数据管理是怎么理解,元数据收集管理体系是怎么,会对大数据应用有什么样影响 1.2.9 你理解常见如阿里,和友商大数据平台技术体系差异以及发展趋势和技术瓶颈,在存储和计算两...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计 .107 9.5 小 结 .110 第十章 类 .112 10.1 类 的 声 明 .112 ...
  • ExtAspNet_v2.3.2_dll

    2010-09-29 14:37:08
    -实际上IE7下所以都慢,原因是客户端Base64编码速度慢,已经使用encodeURIComponent来代替Base64编码。 -俄语翻译(feedback:vbelyaev)。 +2010-06-30 v2.3.1 -ExtAspNet控件将不在依赖ViewState,...
  • -修正Expanded项和Checked项状态在回改变后不能保持BUG。 -GetNodeById更名为FindNode,保持和FindControl一致命名。 -删除CheckedNodeIDArray属性,增加GetCheckedNodes和GetCheckedNodeIDs函数。 -...
  • C#微软培训资料

    2014-01-22 14:10:17
    第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计 .107 9.5 小 结 .110 第十章 类 .112 10.1 类 的 声 明 .112 ...
  • vfp6.0系统免费下载

    2009-09-17 13:49:13
    Form 对象的 Controls 属性就是一种集合。Visual FoxPro 6.0 支持 Access/Assign 方法程序,它们可以用于创建真正的用户自定义集合。在 Solutions 示例应用程序中有一个很好的相关示例。 问题 2-9: 为什么 Visual ...
  • 算法导论(part2)

    2010-09-09 22:54:12
    10.3 指针和对象的实现 10.4 有根树的表示 第11章 散列表 11.1 直接寻址表 11.2 散列表 11.3 散列函数 11.3.1 除法散列法 11.3.2 乘法散列法 *11.3.3 全域散列 11.4 开放寻址法 *11.5 完全...
  • 算法导论(part1)

    2010-09-09 22:51:05
    10.3 指针和对象的实现 10.4 有根树的表示 第11章 散列表 11.1 直接寻址表 11.2 散列表 11.3 散列函数 11.3.1 除法散列法 11.3.2 乘法散列法 *11.3.3 全域散列 11.4 开放寻址法 *11.5 完全...
  • 班会第 44 期

    2020-12-08 21:06:39
    我们这个时候应该是觉得背景图片位置是 50px 100px 位置(10% * 500px 20% * 500px), 但事实上却不是这样,结合 w3c 官网文档中提到,还要去用这个百分比值计算背景图...
  • 环境(并不一定是最友好,但一定是最强大),我建议你一定要好好熟悉一下 Linux。 三.如何得到Linux? 据我所知,大多数 Linux 发行版本(Linux distribution)和核心(Kernel)都是可以 从网上下载...
  • 面试题1:谈谈你对面向对象的认识 面试题2:面向对象的三大特征 面试题3:面向过程和面向对象有什么区别 8.2 类的成员变量和成员函数 面试题4:简述类public、protected、private的作用 面试题5:写出代码的打印结果...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    任务管理器应该大家都很熟悉,论坛里也有好多任务管理器源码,解决CListCtr刷新时滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好一个实例,把网络连接UDP/TCP都插入到CList控件中显示出来。 VC++...

空空如也

空空如也

1 2
收藏数 39
精华内容 15
关键字:

发对象的动态应该怎么发