zoukankan      html  css  js  c++  java
  • 简易sql拼接工具类(使用StringBuilder实现)

    /**
     * 简易sql拼接
     * 注意不同重载方法的不同注释!!!
     */
    public class SqlBuilder {
        /** 不要包含where
         */
        public SqlBuilder(String sql){
            this.sb  = new StringBuilder(sql);
        }
        /** 不要包含where
         */
        public SqlBuilder(String sql,String append1){
            this.sb  = new StringBuilder(sql);
            this.sb.append(append1);
        }
        /** 不要包含where
         */
        public SqlBuilder(String sql,String append1,String append2){
            this.sb  = new StringBuilder(sql);
            this.sb.append(append1).append(append2);
        }
        
        private StringBuilder sb;
        boolean haveWhere=false;
        boolean haveSet=false;
        int OrderByInd=-1;
        int isOr;
        
        public SqlBuilder setHaveSet(boolean val){
            this.haveSet=val;
            return this;
        }
        public SqlBuilder setHaveWhere(boolean val){
            this.haveWhere=val;
            return this;
        }
        
        public SqlBuilder append(Object str){
            this.sb.append(str);
            return this;
        }
        public SqlBuilder append(Object str,Object str2){
            this.sb.append(str).append(str2);
            return this;
        }
        public SqlBuilder append(Object str,Object str2,Object str3){
            this.sb.append(str).append(str2).append(str3);
            return this;
        }
        public SqlBuilder delete(int start){
            return delete(start,sb.length());
        }
        public SqlBuilder delete(int start ,int end){
            this.sb.delete(start, end);
            return this;
        }
        public SqlBuilder insert(int offset,Object str){
            this.sb.insert(offset,str);
            return this;
        }
        public int indexOf(String str){
            return sb.indexOf(str);
        }
        
        public SqlBuilder startOr(){
            isOr=1;
            return this;
        }
        public SqlBuilder endOr(){
            sb.append(")");
            isOr=0;
            return this;
        }
        
        
        /**原数据不能有加了where关键字;
         * val为null或val=="" 都为=""
         */
        public SqlBuilder appendWhere(String column,String val){
            return appendWhere(column,val,false);
        }
        /**原数据不能有加了where关键字;
         * @param continueBlank 为tuue时,val为null或val==""都不加入;;;;否则 val为null或val=="" 都为=""
         */
        public SqlBuilder appendWhere(String column,String val,boolean continueBlank){
            if(isEmpty(val)){
                if(continueBlank)
                    return this;
                val="";
            }
            sb.append(getWhere()).append(column).append("='").append(val.replace("'","")).append("'");
            return this;
        }
        /**原数据不能有加了where关键字;
         * 直接加入表达式
         */
        public SqlBuilder appendWhere(String relation){
            if(!isEmpty(relation))
                sb.append(getWhere()).append(relation);
            return this;
        }
        
        /**原数据不能有加了where关键字;
         * val为null或val=="" 都不加入条件(特别注意)            
         */
        public SqlBuilder appendWhereLike(String column,String val){
            if(isEmpty(val)){
                return this;
            }
            sb.append(getWhere()).append(column).append(" like '%").append(val.replace("'","").replace("%","")).append("%'");
            return this;
        }
        /**原数据不能有加了where关键字;
         * val为null或val=="" 都不加入条件(特别注意)            
         */
        public SqlBuilder appendWhereLikeRight(String column,String val){
            if(isEmpty(val)){
                return this;
            }
            sb.append(getWhere()).append(column).append(" like '").append(val.replace("'","").replace("%","")).append("%'");
            return this;
        }
        
        /**原数据不能有加了where关键字;
         * val为null或val=="" 都不加入条件(特别注意)
         */
        public SqlBuilder appendWhereIn(String column,String val){
            if(isEmpty(val)){
                return this;
            }
            sb.append(getWhere()).append(column).append(" in (").append(val).append(")");
            return this;
        }
        /**原数据不能有加了where关键字;
         * val为null 则不加入条件(特别注意)    
         */
        public SqlBuilder appendWhereIn(String column,List<String> val,String[] type){
            return appendWhereIn(column,val.toArray(type));
        }
        /**原数据不能有加了where关键字;
         * val为null 则不加入条件(特别注意)    
         */
        public SqlBuilder appendWhereIn(String column,String[] val){
            if(val==null){
                return this;
            }
            sb.append(getWhere()).append(column).append(" in (");
            for(int i=0; i<val.length; i++){
                if(i>0)
                    sb.append(",");
                sb.append("'").append(val[i]).append("'");
            }
            sb.append(")");
            return this;
        }
        /**原数据不能有加了where关键字;
         * val为null 则不加入条件(特别注意)        
         */
        public SqlBuilder appendWhereIn(String column,List<Integer> val,Integer[] type){
            return appendWhereIn(column,val.toArray(type));
        }
        /**原数据不能有加了where关键字;
         * val为null 则不加入条件(特别注意)        
         */
        public SqlBuilder appendWhereIn(String column,Integer[] val){
            if(val==null){
                return this;
            }
            sb.append(getWhere()).append(column).append(" in (");
            for(int i=0; i<val.length; i++){
                if(i>0)
                    sb.append(",");
                sb.append(val[i]);
            }
            sb.append(")");
            return this;
        }
        /**原数据不能有加了where关键字;
         * val为null或val=="" 都不加入条件(特别注意)
         */
        public SqlBuilder appendWhereNotIn(String column,String val){
            if(isEmpty(val)){
                return this;
            }
            sb.append(getWhere()).append(column).append(" not in (").append(val).append(")");
            return this;
        }
        
        /** 原数据不能有加了where关键字;
         */
        public SqlBuilder appendWhere(String column,int val){
            return appendWhere(column,val,null);
        }
        /** 原数据不能有加了where关键字;
         *  @param continueVal 为true时,val==continueVal则不加入
         */
        public SqlBuilder appendWhere(String column,int val,Integer continueVal){
            if(continueVal!=null && continueVal==val)
                return this;
            sb.append(getWhere()).append(column).append("=").append(val);
            return this;
        }
        /** 原数据不能有加了where关键字;
         */
        public SqlBuilder appendWhere(String column,String condition,int val){
            sb.append(getWhere()).append(column).append(condition).append(val);
            return this;
        }
        /** 原数据不能有加了where关键字;小心使用该方法
         *  @param continueNull 为true时,val==null则不加入
         */
        public SqlBuilder appendWhere(String column,Integer val,boolean continueNull){
            if(val==null && continueNull)
                return this;
            sb.append(getWhere()).append(column).append("=").append(val);
            return this;
        }
        /** 原数据不能有加了where关键字;
         */
        public SqlBuilder appendWhere(String column,boolean val){
            sb.append(getWhere()).append(column).append("=").append(val);
            return this;
        }
        
        /** 原数据不能有加了set关键字;
         * val为null或"" 都设置成null
         */
        public SqlBuilder appendSet(String column,String val){
            return appendSet(column,null,val,false);
        }
        /** 原数据不能有加了set关键字;
         *  val为null或"" 都设置成null
         *  @param isWriteBlack 为true时,val为null或"" 都设置成""
         */
        public SqlBuilder appendSet(String column,String val,boolean isWriteBlack){
            return appendSet(column,null,val,isWriteBlack);
        }
        public SqlBuilder appendSet(String column,Object appendColumn,String val,boolean isWriteBlack){
            sb.append(getSet()).append(column);
            if(appendColumn!=null)
                sb.append(appendColumn);
            sb.append("=");
            if(isEmpty(val)){
                if(isWriteBlack)
                    sb.append("''");
                else{
                    sb.append("null");
                    return this;
                }
            }else{
                sb.append("'").append(val.replace("'","")).append("'");
            }
            return this;
        }
        /** 原数据不能有加了set关键字;
         * val为null或"" 都设置成null
         */
        public SqlBuilder appendSet(String text){
            sb.append(getSet()).append(text);
            return this;
        }
        /** 原数据不能有加了set关键字;
         */ 
        public SqlBuilder appendSet(String column,Integer val){
            sb.append(getSet()).append(column).append("=").append(val);
            return this;
        }
        /** 原数据不能有加了set关键字;
         */ 
        public SqlBuilder appendSet(String column,boolean val){
            sb.append(getSet()).append(column).append("=").append(val);
            return this;
        }
        /** 原数据不能有加了set关键字;
         */ 
        public SqlBuilder appendSet(String column,Float val){
            sb.append(getSet()).append(column).append("=").append(val);
            return this;
        }
        /** 原数据不能有加了set关键字;
         *  @param saveCount 保留小数位
         */ 
        public SqlBuilder appendSet(String column,Float val,int saveCount){
            sb.append(getSet()).append(column).append("=").append(val==null?val:formatFloat(val, saveCount));
            return this;
        }
        /** 原数据不能有加了set关键字;
         */ 
        public SqlBuilder appendSet(String column,Double val){
            sb.append(getSet()).append(column).append("=").append(val);
            return this;
        }
        /** 原数据不能有加了set关键字;适用于energy_m12
         */ 
        public SqlBuilder appendSet(String column,Object appendColumn,String val){
            return appendSet(column,appendColumn,val,false);
        }
        /** 原数据不能有加了set关键字;
         */ 
        public SqlBuilder appendSet(String column,Double val,int saveCount){
            sb.append(getSet()).append(column).append("=").append(val==null?val:formatFloat(val, saveCount));
            return this;
        }
        /** 原数据不能有加了limit关键字;
         */ 
        public SqlBuilder appendLimit(Pager<?> pager){
            sb.append(" limit ").append(pager.getStartCount()).append(",").append(pager.getPageSize());
            return this;
        }
        /** 原数据不能有加了limit关键字;
         */ 
        public SqlBuilder appendLimit(Pager<?> pager,int addSize){
            sb.append(" limit ").append(pager.getStartCount()).append(",").append(pager.getPageSize()+addSize);
            return this;
        }
        
        
        /** 看对字符串值是否需要加上单引号
         */ 
        public SqlBuilder appendVal(String val,String after){
            return appendVal(val,after,false);
        }
        /** 看对字符串值是否需要加上单引号
         */ 
        public SqlBuilder appendVal(String val,boolean isCanBlank){
            return appendVal(val,null,isCanBlank);
        }
        /** 看对字符串值是否需要加上单引号
         */ 
        public SqlBuilder appendVal(String val){
            return appendVal(val,null,false);
        }
        /** 看对字符串值是否需要加上单引号
         */ 
        public SqlBuilder appendVal(String val,String after,boolean isCanBlank){
            if(isEmpty(val)){
                if(isCanBlank){
                    sb.append("''");
                }else{
                    sb.append("null");
                }
            }else{
                sb.append("'").append(val.replace("'","‘")).append("'");
            }
            if(after!=null)
                sb.append(after);
            return this;
        }
        public SqlBuilder appendVal(Integer val){
            return this.append(val);
        }
        public SqlBuilder appendVal(Integer val,String after){
            sb.append(val);
            if(after!=null)
                sb.append(after);
            return this;
        }
        public SqlBuilder appendVal(Float val){
            return this.append(val);
        }
        public SqlBuilder appendVal(Float val,String after){
            this.append(val);
            if(after!=null)
                sb.append(after);
            return this;
        }
        public SqlBuilder appendVal(Double val){
            return this.append(val);
        }
        public SqlBuilder appendVal(Double val,String after){
            this.append(val);
            if(after!=null)
                sb.append(after);
            return this;
        }
        public SqlBuilder appendVal(boolean val){
            return this.append(val);
        }
        public SqlBuilder appendVal(boolean val,String after){
            this.append(val);
            if(after!=null)
                sb.append(after);
            return this;
        }
        public SqlBuilder appendOrder(String columns){
            OrderByInd = sb.length();
            sb.append(" order by ").append(columns);
            return this;
        }
        
        public SqlBuilder appendParams(String[] params){
            for(int i=0; i<params.length; i++){
                if(i!=0)
                    sb.append(",");
                sb.append(params[i]);
            }
            return this;
        }
        public SqlBuilder appendParamFn(String fn,String[] params){
            for(int i=0; i<params.length; i++){
                if(i!=0)
                    sb.append(",");
                appendParamFn(fn,params[i]);
            }
            return this;
        }
        public SqlBuilder appendParamFn(String fn,String p){
            if(p.indexOf(" ")==-1){
                sb.append(fn).append("(").append(p).append(")").append(p);
            }else{
                String[] ps = p.split(" ");
                sb.append(fn).append("(").append(ps[0]).append(")").append(ps[1]);
            }
            return this;
        }
        
        
        private String getWhere(){
            if(haveWhere){
                if(isOr==0){
                    return " and ";
                }else if(isOr==1){
                    isOr=2;
                    return " and (";
                }else{
                    return " or ";
                }
            }else{
                haveWhere=true;
                return " where ";
            }
        }
        
        private String getSet(){
            if(haveSet)
                return ",";
            else{
                haveSet=true;
                return " set ";
            }
        }
        
        public int length(){
            return sb.length();
        } 
        
        public String toString(){
            return sb.toString();
        }
        public String toString(int len){
            String result = sb.substring(0, len); 
            return result;
        }
        public String toString(int len,boolean print){
            String result = toString(len); 
            if(print)
                System.out.println(result);
            return result;
        }
        public String toString(boolean print){
            String result = sb.toString();
            if(print)
                System.out.println(result);
            return result;
        }
        /** 注意规则,有order时。
         */
        public String toStringCount(){
            return toStringCount(null,null,null,false);
        }
        /** 注意规则,有order时。
         */
        public String toStringCount(boolean print){
            return toStringCount(null,null,null,print);
        }
        /** 注意规则,有order时。
         */
        public String toStringCount(String param,boolean print){
            return toStringCount(param,null,null,print);
        }
        /** 注意规则,有order时。
         */
        public String toStringCount(String param,String endStr){
            return toStringCount(param,endStr,null,false);
        }
        /** 注意规则,有order时。
         */
        public String toStringCount(String param,String endStr,boolean print){
            return toStringCount(param,endStr,null,print);
        }
        /** 注意规则,有order时。
         */
        public String toStringCount(String param,String endStr,String lasSub){
            return toStringCount(param,endStr,lasSub,false);
        }
        /** 注意规则,有order时。
         */
        public String toStringCount(String param,String endStr,String lasSub,boolean print){
            int start = sb.indexOf(" from ");
            int end = sb.length();
            int limit = lasSub==null?sb.lastIndexOf(" limit "):"".equals(lasSub)?sb.length():sb.lastIndexOf(lasSub);
            if(lasSub!=null){
                end = limit;
            }else if(OrderByInd!=-1){
                end = OrderByInd;
            }else if(limit!=-1){
                end = limit;
            }
            StringBuilder temp = new StringBuilder("select ").append(isEmpty(param)?"count(*) count":param);
            temp.append(sb.substring(start, end));
            if(!isEmpty(endStr))
                temp.append(endStr);
            if(print)
                System.out.println(temp.toString());
            return temp.toString();
        }
        
        
        //TODO以下方法可放置到统一工具类中
        /** 字符串是否为null或空字符串(“”)
         */
        public static boolean isEmpty(String text){
            return text==null || text.length()==0 || "null".equals(text);
        }
        /** 格式化浮点数。四舍五入,保留2位
         */
        public static String formatFloat(double data,boolean is){
            if(is){
                if(data<=0)
                    return "0";
            }
            return formatFloat(data,2);
        }
        /** 格式化浮点数。四舍五入,保留自定义位数
         */
        public static String formatFloat(double data, int digits) {
            NumberFormat nf = NumberFormat.getInstance(Locale.CHINA);
            nf.setGroupingUsed(false);
            nf.setMaximumFractionDigits(digits);
            return nf.format(data);
        }
    }
    View Code

      注:改工具类中的appendLimit方法,包含了Pager(分页工具类),可以引用https://www.cnblogs.com/bl123/p/13719776.html文中的分页工具,

    也可以自定义或者删除。

      使用示例如下

    //新增sql
            SqlBuilder sql = new SqlBuilder("insert into tbl_userinfo(userName,age) values(").appendVal(userName,",").appendVal(age,")");
            //修改sql
            SqlBuilder sql2 = new SqlBuilder("update tbl_userinfo").appendSet("age", age).appendWhere("userName", userName);
            //查询sql,还有(appendWhereIn、appendWhereNotIn、appendOrder)等查询拼接方法使用
            SqlBuilder sql3 = new SqlBuilder("select count(*) from tbl_userinfo").appendWhere("userName", userName);
            //params为String数组
            SqlBuilder sql4 = new SqlBuilder("select ").appendParamFn("sum", params).append(" from tbl_userinfo");
            SqlBuilder sql5 = new SqlBuilder("select ").appendParams(params).append(" from tbl_userinfo");
            SqlBuilder sql6 = new SqlBuilder("select * from tbl_userinfo").startOr().appendWhereLike("userName", userName)
                    .appendWhereLike("age", age).endOr();
            //pager为分页工具类
            SqlBuilder sql7 = new SqlBuilder("select * from tbl_userinfo").appendOrder("id").appendLimit(pager);
            sql.toStringCount();//此方法用于分页查询时,查询数量
    View Code
  • 相关阅读:
    [转]为什么阿里巴巴要禁用Executors创建线程池?
    支付宝的架构到底有多牛逼!
    [转] Java Agent使用详解
    Spring Boot必备技能之Starter自定义
    面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
    Docker 容器化应用
    Python Click 学习笔记
    MySQL优化(7):其他注意事项
    MySQL优化(6):分表和读写分离
    MySQL优化(5):分区
  • 原文地址:https://www.cnblogs.com/bl123/p/13720518.html
Copyright © 2011-2022 走看看