当前位置: 首页 > 工具软件 > SqlBuilder > 使用案例 >

SqlBuilder工具类

钮巴英
2023-12-01
package XXX.PingBiao.Core.Common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.XXX.ZtbCommon.Functions;
import com.XXX.ZtbCommon.ZtbCommonDao;
import com.XXX.core.utils.string.StringUtil;

/**
 * SqlBuilder工具类
 * 
 */
public class SqlBuilder
{
    /**
     * 参数化 sql 字符串
     */
    private StringBuffer sqlBuffer = null;

    /**
     * 参数集合
     */
    private List<Object> params = null;

    public SqlBuilder() {
        sqlBuffer = new StringBuffer();
        params = new ArrayList<Object>();
    }

    /**
     * 追加无参sql语句
     * 
     * @param sql
     * @return
     */
    public SqlBuilder sqlAppend(String sql) {
        sqlBuffer.append(" ").append(sql).append(" ");
        return this;
    }

    /**
     * 追加参数集合.
     * 如果args为null或空集合,则不做任何处理
     * 
     * @param args
     * @return
     */
    public SqlBuilder paramsAppend(Object... args) {
        if (args != null && args.length > 0) {
            params.addAll(Arrays.asList(args));
        }
        return this;
    }

    /**
     * 普通sql 参数化写法
     * 
     * @param sql
     *            sql语句
     * @param args
     *            SQL所需参数
     */
    public SqlBuilder append(String sql, Object... args) {
        return sqlAppend(sql).paramsAppend(args);
    }

    /**
     * 处理sql中含有in的参数
     * 
     * @param sql
     *            语句中只允许出现一个in(?),不能有其他代参,示例select col1 from tableA where col2
     *            in(?)
     * @param params
     *            in中参数的集合
     */
    public SqlBuilder appendIn(String sql, List<String> params) {
        if (params == null || params.isEmpty()) {
            throw new RuntimeException("参数不能为空");
        }
        else {
            this.params.addAll(params);
            StringBuilder marks = new StringBuilder();
            for (int i = 0; i < params.size(); i++) {
                marks.append("?,");
            }
            return sqlAppend(sql.replace("?", marks.substring(0, marks.length() - 1)));
        }
    }

    /**
     * 兼容用逗号分隔的字符串形式,以及含有单引号的形式,
     * 
     * @param sql
     *            语句中只允许出现一个in(?),不能有其他代参,示例select col1 from tableA where col2
     *            in(?)
     * @param args
     *            in中参数的集合,示例'',''
     */
    public SqlBuilder appendIn(String sql, String args) {
        if (StringUtil.isBlank(args)) {
            throw new RuntimeException("参数不能为空");
        }

        String[] argArray = args.split(",");

        List<String> argList = new ArrayList<>(argArray.length);
        for (String arg : argArray) {
            argList.add(Functions.Trim(arg, "'"));
        }

        return appendIn(sql, argList);
    }

    /**
     * 得到拼接的Sql字符串(参数化写法)
     * 
     * @return
     */
    public String getSql() {
        return sqlBuffer.toString();
    }

    /**
     * 获取所传参数值
     * 
     * @return
     */
    public Object[] getParams() {
        return params.toArray();
    }

    /**
     * 获取params-List
     * 
     * @return
     */
    public List<Object> getListParams() {
        return params;
    }

    /**
     * 删除后面的几个字符
     * 
     * @param length
     *            需要删除的长度
     * @return
     */
    public SqlBuilder deleteEnd(int length) {
        sqlBuffer.delete(sqlBuffer.length() - length, sqlBuffer.length());
        return this;
    }

    /**
     * 兼容不同数据库类型的SQL语句(三组语句);
     * 注意使用该方法时必须使用paramsAppend()方法
     * 
     * @param sql
     * @param oracleSql
     * @param mysql
     * @return
     */
    public SqlBuilder cmdSwitch(String sql, String oracleSql, String mysql) {
        return sqlAppend(DatabaseSettings.CmdSwitch(sql, oracleSql, mysql));
    }

    /**
     * 兼容不同数据库类型的SQL语句(二组语句);
     * 注意使用该方法时必须使用paramsAppend()方法
     * 
     * @param sql
     * @param oracleSql
     * @return
     */
    public SqlBuilder cmdSwitch(String sql, String oracleSql) {
        return sqlAppend(ZtbCommonDao.getInstance().cmdSwitch(sql, oracleSql));
    }

}

用例:

 /**
     * 查询评分点得分
     * 
     * @param fields 查询字段
     * @param biaoDuanGuid 标段标识
     * @param pfdType 评分点类型
     * @return List<Record>
     */
public List<Record> listRecordsByPFDType(String fields, String biaoDuanGuid, String pfdType) {
        String sql = "";
        if ("11".equals(pfdType)) {
            sql = "select " + fields
                    + " from PingBiao_PFDLastMark where biaoduanguid=? and PFDType in (15,4,5,6,7,8,11)";
            SqlBuilder sb = new SqlBuilder();
            sb.append(sql,biaoDuanGuid);
            return service.findList(sb.getSql(), Record.class, sb.getParams());
        }
        sql = "select " + fields + " from PingBiao_PFDLastMark where biaoduanguid=? and PFDType=?";
        SqlBuilder sb = new SqlBuilder();
        sb.append(sql,biaoDuanGuid, pfdType);
        return service.findList(sb.getSql(), Record.class, sb.getParams());
    }

 类似资料: