Created
July 30, 2013 17:11
-
-
Save longkai/6114879 to your computer and use it in GitHub Desktop.
dynamically generate select sql like android does.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* The MIT License (MIT) | |
* Copyright (c) 2013 longkai(龙凯) | |
*/ | |
package cn.newgxu.lab.core.util; | |
import java.util.Calendar; | |
import java.util.Date; | |
import java.util.regex.Matcher; | |
import java.util.regex.Pattern; | |
/** | |
* 通过方法调用来生成查询语句,这样比一味的使用封装要来得直接并且好用。 | |
* 可以直接将生成的查询语句返回给mybatis就好 | |
* @author longkai | |
* @email [email protected] | |
* @since 13-7-30 | |
* @version 0.1.0.13-7-30 | |
*/ | |
public class SQLUtils { | |
private static Pattern pattern = Pattern.compile("\\?"); | |
private static String columns(String[] columns) { | |
if (columns == null || columns.length == 0) { | |
return "*"; | |
} | |
StringBuilder seletion = new StringBuilder(); | |
for (int i = 0; i < columns.length; i++) { | |
seletion.append(columns[i]).append(","); | |
} | |
return seletion.substring(0, seletion.length() - 1); | |
} | |
private static String where(String where, Object[] args) { | |
if (where == null || where.length() == 0) { | |
return null; | |
} | |
if (args == null || args.length == 0) { | |
return where; | |
} | |
StringBuffer _where = new StringBuffer(); | |
Matcher matcher = pattern.matcher(where); | |
for (int i = 0; matcher.find(); i++) { | |
matcher.appendReplacement(_where, injectArg(args[i])); | |
} | |
matcher.appendTail(_where); | |
return _where.toString(); | |
} | |
private static String injectArg(Object arg) { | |
if (arg == null) { | |
return "null"; | |
} | |
if (arg instanceof Number) { | |
return arg.toString(); | |
} | |
StringBuilder value = new StringBuilder("'"); | |
if (arg instanceof Date) { | |
Date d = (Date) arg; | |
Calendar c = Calendar.getInstance(); | |
c.setTimeInMillis(d.getTime()); | |
value.append(c.get(Calendar.YEAR)).append("-") | |
.append(c.get(Calendar.MONTH) + 1).append("-") | |
.append(c.get(Calendar.DATE)).append(" ") | |
.append(c.get(Calendar.HOUR)).append(":") | |
.append(c.get(Calendar.MINUTE)).append(":") | |
.append(c.get(Calendar.SECOND)); | |
} else { | |
value.append(arg.toString()); | |
} | |
return value.append("'").toString(); | |
} | |
public static final String query(String table, String[] columns, String where, Object[] args, String groupBy, String having, String orderBy, String limit) { | |
StringBuilder query = new StringBuilder(); | |
query.append("SELECT ").append(columns(columns)).append(" FROM ").append(table); | |
where = where(where, args); | |
if (where != null) { | |
query.append(" WHERE ").append(where); | |
} | |
if (groupBy != null) { | |
query.append(" GROUP BY ").append(groupBy); | |
} | |
if (having != null) { | |
query.append(" HAVING ").append(having); | |
} | |
if (orderBy != null) { | |
query.append(" ORDER BY ").append(orderBy); | |
} | |
if (limit != null) { | |
query.append(" LIMIT ").append(limit); | |
} | |
return query.toString(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment