信息流zt_使用json参数拼接sql语句

信息流zt项目中,server端接收前端发送的http json请求,解析后来拼接sql,如果单纯string拼接就比较麻烦,因此使用并改写了SqlHandle代码

参考:项目git分享地址:https://github.com/yoqu/SqlHandleimport java.io.Serializable;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang.ArrayUtils;

/**
 * mysql语法 sql语句拼接工具简类 使用场景:需要快速书写sql语句时用到,主要使用的是mysql中的sql语法
 * 该版本的select语句只支持单表查询,不支持多表查询,待更新 where 语句中关联多个字段默认使用And关键字,暂不可更改,待更新
 * 
 */
public class SqlHandle {
	/**
	 * 排序操作符:顺序 "ASC","DESC"
	 */
	public static final String[] SORTS = { "ASC", "DESC" };
	/**
	 * 数据库操作符:顺序 "select","insert","update","delete"
	 */
	public static final String[] OPERATES = { "select", "insert", "update",
			"delete" };
	/**
	 * sql语句的String类型
	 */
	private StringBuffer sql = new StringBuffer();;
	/**
	 * 要操作的字段,用在update insert中的Set之后,字段名称和值进行对应
	 */
	private Map<String, Object> operatefileds = new HashMap<String, Object>();

	/**
	 * 要操作的值 ,同于insert语句中的values,不需要跟字段名称,只需要值就OK了
	 */
	private ArrayList<Object> operatevalues = new ArrayList<Object>();
	/**
	 * select语句中用于select 后面的字段名称
	 */
	private ArrayList<String> fields = new ArrayList<String>();

	/**
	 * 条件集合,用于where语句后面 形式例如 field1=value1
	 */
	private ArrayList<String> conditions = new ArrayList<String>();
	/**
	 * 操作符,使用select update delete insert者四种操作符
	 */
	private String operate = "";
	/**
	 * 操作表 ,要操作的表
	 */
	private String table = "";
	/**
	 * 限制 要限制的长度
	 */
	private String limit = "";
	/**
	 * 排序规则,定制排序规则
	 */
	private String order = "";

	/**
	 * 分组规则
	 */
	private String group = "";

	/**
	 * GROUP BY 语句后面
	 */
	private ArrayList<String> groupExp = new ArrayList<String>();

	public SqlHandle(String operate, String table) {
		this.operate = operate;
		this.table = table;
	}

	/**
	 * 默认构造方法使用select语句操作
	 */
	public SqlHandle() {
		this.operate = OPERATES[0];
	}

	public ArrayList<String> getFields() {
       return this.fields;
	}

	/**
	 * 初始化构造数据库操作,默认使用select查询
	 * 
	 * @param operate
	 */
	public SqlHandle(String table) {
		this.table = table;
		this.operate = OPERATES[0];
	}

	public SqlHandle OPERATE(String operate) {
		this.operate = operate;
		return this;
	}

	/**
	 * 主要应用update和insert的数据库操作添加sql
	 * 
	 * @param propername
	 * @param propervalue
	 * @return
	 */
	public SqlHandle OPERATEFILED(String propername, Object propervalue) {
		operatefileds.put(propername, propervalue);
		return this;
	}

	public SqlHandle OPERATEFILED(Map<String, Object> fileds) {
		operatefileds.putAll(fileds);
		return this;
	}

	public SqlHandle OPERATEFILED(Object propervalue) {
		operatevalues.add(propervalue);
		return this;
	}

	/**
	 * 主要应用于select语句中,用于添加抬头字段
	 * 
	 * @param filed
	 * @return
	 */
	public SqlHandle FIELD(String field) {
		this.fields.add(field);
		return this;
	}

	public SqlHandle FIELD(ArrayList<String> fields) {
		for (int i = 0; i < fields.size(); i++) {
			this.fields.add(fields.get(i));
		}
		return this;
	}

	public SqlHandle FIELD(String field, Boolean isField) {
		if (isField) {
			this.fields.add(field);
		}
		return this;
	}

	/**
	 * 添加字段并可以给字段加别名
	 * 
	 * @param field
	 * @param alias
	 * @return
	 */
	public SqlHandle FIELD(String field, String alias) {
		this.fields.add(field + " as " + alias);
		return this;
	}

	public SqlHandle FIELD(String field, Boolean isField, String alias) {
		if (isField) {
			this.fields.add(field + " as " + alias);
		}
		;
		return this;
	}

	public SqlHandle JOIN(SqlHandle s2, String alias1, String alias2,
			String joinType, ArrayList<String> k1, ArrayList<String> k2) {
		String sql1 = this.toString();
		String sql2 = s2.toString();
		String tmp;
		if ("left".equalsIgnoreCase(joinType))
			tmp = "(" + sql1 + ") " + alias1 + " LEFT JOIN" + "(" + sql2 + ") "
					+ alias2 + " ON ";
		else
			tmp = "(" + sql1 + ") " + alias1 + " JOIN" + "(" + sql2 + ") "
					+ alias2 + " ON ";
		for (int i = 0; i < k1.size(); i++) {
			tmp = tmp + alias1 + "." + k1.get(i) + "=" + alias2 + "."
					+ k2.get(i);
		}
		SqlHandle sql = new SqlHandle(tmp);
//		for (int i = 0; i < this.fields.size(); i++) {
//			if (k1.contains(this.fields.get(i))) {
//				sql.FIELD(alias1 + "." + this.fields.get(i));
//			} else {
//				if (this.fields.get(i).indexOf("as") > 0)
//					sql.FIELD(this.fields.get(i).substring(
//							this.fields.get(i).indexOf("as") + 3));
//				else
//					sql.FIELD(this.fields.get(i));
//			}
//		}
//		for (int j = 0; j < s2.fields.size(); j++) {
//			if (!k2.contains(s2.fields.get(j))) {
//				if (s2.fields.get(j).indexOf("as") > 0)
//					sql.FIELD(s2.fields.get(j).substring(
//							s2.fields.get(j).indexOf("as") + 3));
//				else
//					sql.FIELD(s2.fields.get(j));
//			}
//		}
		return sql;
	}

	/**
	 * 添加字段
	 * 
	 * @param table
	 * @return
	 */
	public SqlHandle TABLE(String table) {
		this.table = table;
		return this;
	}

	public SqlHandle CONDITION(String field, String operator, Object value) {
		// value.getClass().getTypeName();
		String conditionStr = field + " " + operator + " ";
		// 如果是String类型,需要加上单引号。
		conditionStr += filterValue(value);
		this.conditions.add(conditionStr);
		return this;
	}
	
	public SqlHandle CONDITION1(String field, String operator, String otherField) {
		// value.getClass().getTypeName();
		String conditionStr = field + " " + operator + " ";
		// 如果是String类型,需要加上单引号。
		conditionStr += otherField;
		this.conditions.add(conditionStr);
		return this;
	}

	/**
	 * 一种条件场景 where id in (1,2,3) or where id not in (1,2,3)等
	 * 
	 * @param field
	 * @param operator
	 * @param values
	 * @return
	 */
	public SqlHandle CONDITION(String field, String operator,
			Serializable... values) {
		String conditionStr = field + " " + operator + " (";
		if (values.length > 0) {
			for (int i = 0; i < values.length - 1; i++) {
				conditionStr += filterValue(values[i]) + ",";
			}
			conditionStr += filterValue(values[values.length - 1]) + ")";
		}
		this.conditions.add(conditionStr);
		return this;
	}

	/**
	 * 过滤值方法,如果是String类型添加单引号,不是直接返回原值
	 * 
	 * @param value
	 * @return
	 */
	private String filterValue(Object value) {
		if (value instanceof String) {
			return "'" + value + "'";
		} else if (value instanceof Date) {
			return "'" + value + "'";
		} else {
			return value.toString();
		}
	}

	public SqlHandle ORDERBY(String order, String field) {
		this.order = " " + field + " " + order;
		return this;
	}

	public SqlHandle GROUPBY(String field) {
		this.groupExp.add(field);
		return this;
	}

	public SqlHandle GROUPBY(String field, Boolean isField) {
		if (isField) {
			this.groupExp.add(field);
		}
		return this;
	}

	public SqlHandle LIMIT(int start, int length) {
		limit = "  " + start + "," + length;
		return this;
	}

	/**
	 * 重写toString方法,返回sql结果
	 */
	public String toString() {
		sql.setLength(0);
		switch (operate) {
		case "select":
			return selectToSql();
		case "insert":
			return insertToSql();
		case "update":
			return updateToSql();
		case "delete":
			return deleteToSql();
		default:
			return null;
		}
	}

	/**
	 * 添加字段 例子:filed1,field2
	 */
	private void addfiled() {
		if (fields.size() > 0) {
			// 批量加字段
			for (String filed : this.fields) {
				// 最后一个字段不加逗号
				if (!filed.equals(fields.get(fields.size() - 1))) {
					sql = sql.append(" " + filed + ",");
				} else {
					sql = sql.append(" " + filed);
				}
			}
		} else {
			sql = sql.append(" *");
		}
	}

	/**
	 * 添加条件 例子:where condition1<condition2 and condition3>condition4
	 */
	private void addcondition() {
		if (conditions.size() > 0) {
			sql = sql.append(" where");
			for (String condition : conditions) {
				if (!condition.equals(conditions.get(conditions.size() - 1))) {
					sql.append(" " + condition + " and ");
				} else {
					sql.append(" " + condition);
				}
			}
		}
	}

	/**
	 * 添加排序 例子 order by field DESC
	 */
	private void addorder() {
		if (!order.isEmpty()) {
			sql.append(" order by " + order);
		}
	}

	/**
	 * 添加分组 例子 group by field
	 */
	private void addgroup() {

		if (groupExp.size() > 0) {
			sql = sql.append(" group by");
			for (String group : groupExp) {
				if (!group.equals(groupExp.get(groupExp.size() - 1))) {
					sql.append(" " + group + ",");
				} else {
					sql.append(" " + group);
				}
			}
		}
	}

	/**
	 * 添加限制 例子 limit 0,10
	 */
	private void addlimit() {
		if (!limit.isEmpty()) {
			sql.append(" limit " + limit);
		}
	}

	/**
	 * 添加SET语句到sql变量中 例子 SET key=value,key2=value2
	 */
	private void addkeyvalue() {
		if (!operatefileds.isEmpty()) {
			sql = sql.append(" SET");
			for (String key : operatefileds.keySet()) {
				Object value = operatefileds.get(key);
				sql = sql.append(" " + key + " = " + filterValue(value) + ",");
			}
			// 删除最后一个逗号
			sql = sql.deleteCharAt(sql.length() - 1);
		}
	}

	/**
	 * select语句转sql方法
	 * 
	 * @return 返回转好的字符串
	 */
	private String selectToSql() {
		sql = sql.append(OPERATES[0]);
		// 字段处理,没有字段默认使用*
		addfiled();
		// 表处理,暂时单表
		sql = sql.append(" from " + table);
		// where条件处理,有处理,无不处理,默认使用And连接符。。
		addcondition();
		// 排序语句
		addorder();
		// group语句
		addgroup();
		// 限制条目
		addlimit();
		return sql.toString();
	}

	/**
	 * insert语句转sql放阿飞
	 * 
	 * @return 返回转好的字符串
	 */
	private String insertToSql() {
		sql = sql.append(OPERATES[1]);
		sql = sql.append(" " + table);
		// 如果opratefileds和operatevalues只能取一个
		// operatefields注入sql语句的键值映射,operatevalues只注入值,不注入键
		if (!operatefileds.isEmpty() && operatevalues.isEmpty()) {
			addkeyvalue();
		} else if (!operatevalues.isEmpty() && operatefileds.isEmpty()) {
			sql = sql.append(" values(");
			for (Object value : operatevalues) {
				sql = sql.append(" " + filterValue(value) + ",");
			}
			// 删除最后一个逗号并添加括号括上
			sql = sql.deleteCharAt(sql.length() - 1).append(")");
		}
		return sql.toString();
	}

	private String updateToSql() {
		sql = sql.append(OPERATES[2]);
		sql = sql.append(" " + table);
		// operatefields注入sql语句的键值映射
		addkeyvalue();
		// 写入where语句
		addcondition();
		// 排序语句
		addorder();
		// 限制条目
		addlimit();
		return sql.toString();
	}

	private String deleteToSql() {
		sql = sql.append(OPERATES[3]);
		sql = sql.append(" from " + table);
		// 写入where语句
		addcondition();
		// 排序语句
		addorder();
		// 限制条目
		addlimit();
		return sql.toString();
	}
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值