简易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
原文地址:https://www.cnblogs.com/bl123/p/13720518.html