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());
}