Skip to content

Instantly share code, notes, and snippets.

@longkai
Created July 30, 2013 17:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save longkai/6114879 to your computer and use it in GitHub Desktop.
Save longkai/6114879 to your computer and use it in GitHub Desktop.
dynamically generate select sql like android does.
/*
* 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 im.longkai@gmail.com
* @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