1. 程式人生 > 實用技巧 >簡易sql拼接工具類(使用StringBuilder實現)

簡易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