package com.rzy.api.db;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Query
{
private static Query query = null;
private String table = null;
private String baseSQL = null;
private Map<String, String> condMap = new HashMap<String, String>();
private Query(String tableName)
{
this.table = tableName.toUpperCase();
baseSQL = String.format("SELECT * FROM %s T", this.table);
}
/**
* 根据表名创建Query单例对象
*
* @return Query单例对象
*/
public static Query Create(String tableName)
{
query = new Query(tableName);
return query;
}
/**
* 根据条件MAP得到条件SQL语句
*
* @return
*/
private StringBuffer getWHERE()
{
StringBuffer where = new StringBuffer();
for (Map.Entry<String, String> entry : this.condMap.entrySet())
{
String field = entry.getKey();
String[] arr = entry.getValue().split("\\|");
if ("=".equals(arr[0]))
{
if (where.length() != 0)
{
where.append(" AND ");
}
where.append(field).append(arr[0]).append("\'").append(arr[1])
.append("\'");
}
else if ("LIKE".equalsIgnoreCase(arr[0]))
{
if (where.length() != 0)
{
where.append(" AND ");
}
where.append(field).append(" LIKE \'%").append(arr[1]).append(
"%\'");
}
else if ("BETWEEN".equalsIgnoreCase(arr[0]))
{
if (where.length() != 0)
{
where.append(" AND ");
}
where.append("(").append(field).append(" BETWEEN \'").append(
arr[1]).append("\' AND \'").append(arr[2])
.append("\')");
}
else if ("IN".equalsIgnoreCase(arr[0]))
{
if (where.length() != 0)
{
where.append(" AND ");
}
where.append(field).append(" IN(").append(arr[1]).append(")");
}
else if ("ORDER".equalsIgnoreCase(arr[0]))
{
if (where.length() != 0)
{
where.append(" ORDER BY ");
}
else
{
where.append("ORDER BY ");
}
where.append(field).append(" ").append(arr[1]);
}
else
{
if (where.length() != 0)
{
where.append(" AND ");
}
where.append(field).append(arr[0]).append(arr[1]);
}
}
boolean isOnlyOrder = where.toString().startsWith("ORDER BY");
if (!isOnlyOrder)
{
where.insert(0, "WHERE ");
}
return where;
}
/**
* 根据条件MAP得到SQL语句
*
* @return SQL语句
*/
private String SQL()
{
StringBuffer ret = new StringBuffer(baseSQL);
if (this.condMap != null && this.condMap.size() != 0)
{
ret.append(" ").append(getWHERE());
}
return ret.toString();
}
/**
* 查询
*
* @return 数据集合List<Map<k,v>> 其中k:字段名小写,v:字段值
* @throws SQLException
*/
public List<Map<String, Object>> list()
throws SQLException
{
String sql = SQL().toString();
List<Map<String, Object>> list = DBHelper.query(sql);
return list;
}
/**
* 分页查询
*
* @param start
* 开始记录数
* @param limit
* 查询条数
* @return 数据集合List<Map<k,v>> 其中k:字段名小写,v:字段值
* @throws SQLException
*/
public List<Map<String, Object>> list(int start, int limit) throws SQLException
{
StringBuffer ret = new StringBuffer("SELECT * FROM(");
ret.append(SQL().replace("*", "ROWNUM AS RM ,T.*")).append(
") WHERE RM BETWEEN ").append(start + 1).append(" AND ")
.append(start + limit);
List<Map<String, Object>> list = DBHelper.query(ret.toString());
return list;
}
/**
* 得到总记录数
*
*
* @return 总记录数
*/
public int count() throws SQLException
{
String sql = SQL().replace("*", "COUNT(*)");
return Integer.parseInt(DBHelper.scalar(sql).toString());
}
/**
* 添加条件
*
* @param field 字段 如:"name"
* @param opVal 操作符和值 如:"like|aaa","=|001","between|20|70","order|desc"
* @return Query
*/
public Query add(String field,String opVal)
{
this.condMap.put(field,opVal);
return this;
}
}