SQL语句的另一种写法
上一节我们把 WHERE子句的常用条件归纳完了。
里面用到了一些对 SQL的格式化方法。我们今天就展开说明一下。
我们将常见的对象,转换为SQL中的值 需要在前后加上单引号。
例如: select * from `customer` where `name` = '马云' and `company` in ('支付宝','淘宝','阿里巴巴') and `time` between '2005-06-01' and '2019-06-01'
类型 | 需要的操作 |
---|---|
Integer | 直接输出 |
Double | 直接输出 |
Long | 直接输出 |
String | 单引变双引 并前后加单引号 |
Calendar | 转换为YYYY-MM-DD HH:mm:ss 并前后加单引号 |
Date | 转换为YYYY-MM-DD HH:mm:ss 并前后加单引号 |
JSON | 单引变双引 并前后加单引号 |
public static String toSqlString(Object obj) {
if(obj == null)obj = "";
String ret = "";
if (obj instanceof Integer) {
ret = obj.toString().trim();
} else if (obj instanceof Double) {
ret = obj.toString().trim();
} else if (obj instanceof Long) {
ret = obj.toString().trim();
} else if (obj instanceof Number) {
ret = obj.toString().trim();
} else if (obj instanceof String) {
obj = ((String) obj).replace("'", "\"");
ret = "'" + obj.toString().trim() + "'";
} else if (obj instanceof Calendar) {
ret = "'" + (CalendarUtil.getLongString((Calendar) obj)) + "'";
} else if (obj instanceof Date) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ret = "'" + (formatter.format((Date) obj)).toString() + "'";
} else {
// JSONObject JSONArray
obj = obj.toString().replace("'", "\"");
ret = "'" + obj.toString().trim() + "'";
}
return ret;
}
这样做的目的就是将对象变成SQL中的数据。
在SQL中的列是要单独受到重视的,因为这个很容易和值产生不可预知的问题,所以我们在列的前后加上 `
//当出现 . 需要另行处理。例如 dbname.table
//转换后 为 dbname.`table`
public static String toSqlStringByColumnName(String columnname)
{
if(StringEx.isEmpty(columnname)) return "";
if(columnname.contains("`"))return columnname;
String[] columeNameA = columnname.split("\\.");
if(columeNameA.length == 2)
columnname = columeNameA[0].trim() + "." + "`" + columeNameA[1].trim() + "`";
else
columnname = "`" + columnname.trim() + "`";
return columnname;
}
我们在WHERE子句中还会碰到Between Like In 我们分别提供转换方法
//Between 转换为 between 'start' and 'end'
public static String toSqlStringByBetween(String start,String end)
{
StringBuffer str = new StringBuffer();
str.append(" between ");
str.append(toSqlString(start));
str.append(" and ");
str.append(toSqlString(end));
return str.toString();
}
//Like 转换为 '%String%'
public static String toSqlLikeString(String obj)
{
obj = obj.replace("'", "\"");
obj = obj.replace(" ", "%");
return "'%" + obj.trim() + "%'";
}
//In 转换为 'String1','String2','String3'
public static String toSqlStringByMulti(String obj,String split)
{
String[] objs = obj.split(split);
StringBuffer str = new StringBuffer();
for(int i = 0;i < objs.length; i++)
{
if("".equals(objs[i] ))continue;
str.append("'" + objs[i].trim() + "',");
}
if(str.toString().endsWith(","))
return StringEx.subSuffix(str.toString());
return str.toString();
}
//多关键字 Like 转换为 %String1%文本2%文本3%文本4%文本5%
public static String toSqlLikeStringByMulti(String obj,String split)
{
String[] objs = obj.split(split);
StringBuffer str = new StringBuffer();
for(int i = 0;i < objs.length; i++)
{
if("".equals(objs[i] ))continue;
str.append("%" + objs[i].trim());
}
String text = str.toString();
if(!text.startsWith("%")) text = "%" + text;
if(!text.endsWith("%")) text = text + "%";
return text;
}
多关键字 Like 经常用在 多个关键字 有序搜索时使用。
有了这些方法,我们就可以尽情的把SQL的语言结构用对象化的方式来表达了。
完整代码地址:点击这里