package li.dao_2;
import li.dao.Page;
import li.model.Bean;
import li.model.Field;
import li.util.Reflect;
import li.util.Verify;
/**
* Dao的辅助类,用以组装SQL
*
* @author li (limingwei@mail.com)
* @version 0.1.8 (2012-05-08)
*/
public class QueryBuilder {
/**
* 表示对象结构的beanMeta
*/
protected Bean beanMeta;
/**
* 根据传入的ID,构建一个用于删除单条记录的SQL
*/
public String deleteById(Object id) {
return "DELETE FROM " + beanMeta.table + " WHERE " + beanMeta.getId().column + "=" + (id);
}
/**
* 根据传入的SQL,构建一个用于删除若干条记录的SQL
*
* @param sql 传入的sql语句,可以包含'?'占位符和具名占位符
* @param args
* @param args 替换sql中占位符的值,或者对应具名占位符的Map
* @see li.dao.QueryBuilder#setArgs(String, Object[])
*/
public String deleteBySql(String sql, Object[] args) {
if (!Verify.startWith(sql, "DELETE")) {
sql = "DELETE FROM " + beanMeta.table + " " + sql;
}
return sql;
}
/**
* 构造默认的COUNT(*)查询的SQL,查询表中的总记录数
*/
public String countAll() {
return "SELECT COUNT(*) FROM " + beanMeta.table;
}
/**
* 根据传入的SQL,构造一个用于COUNT(*)查询的SQL
*
* @param sql 传入的sql语句,可以包含'?'占位符和具名占位符
* @param args
* @param args 替换sql中占位符的值,或者对应具名占位符的Map
* @see li.dao.QueryBuilder#setArgs(String, Object[])
*/
public String countBySql(String sql, Object[] args) {
if (!Verify.startWith(sql, "SELECT")) {// 不以SELECT开头
sql = "SELECT COUNT(*) FROM " + beanMeta.table + " " + sql;
} else if (!Verify.regex(sql.toUpperCase(), "COUNT\\(.*\\)")) {// 不包括COUNT(*)
sql = "SELECT COUNT(*) FROM " + sql.substring(sql.toUpperCase().indexOf("FROM") + 4, sql.length()).trim();
}
int index = sql.toUpperCase().indexOf("LIMIT");
if (index > 0) {
sql = sql.substring(0, index);// 去掉limit部分
}
return sql;
}
/**
* 使用传入的ID,构造一个用于查询一条记录的SQL
*/
public String findById() {
return "SELECT * FROM " + beanMeta.table + " WHERE " + beanMeta.getId().column + "=?";
}
/**
* 使用传入的SQL和参数,构造一个用于查询一条记录的SQL
*
* @param args
*/
public String findBySql(String sql, Object[] args) {
if (!Verify.startWith(sql, "SELECT")) {// 添加SELECT * FROM table 部分
sql = "SELECT * FROM " + beanMeta.table + " " + sql;
}
return sql;
}
/**
* 使用传入的page,构造一个用于分页查询的SQL
*/
public String list() {
return "SELECT * FROM " + beanMeta.table + " LIMIT ?,?";
}
/**
* 根据传入的SQL和page,构造一个用于分页查询的SQL
*
* @param page 分页对象
* @param sql 传入的sql语句,可以包含'?'占位符和具名占位符
* @param args
* @param args 替换sql中占位符的值,或者对应具名占位符的Map
* @see li.dao.QueryBuilder#setPage(String, Page)
* @see li.dao.QueryBuilder#setArgs(String, Object[])
*/
public String listBySql(Page page, String sql, Object[] args) {
if (!Verify.startWith(sql, "SELECT")) {// 添加SELECT * FROM table 部分
sql = "SELECT * FROM " + beanMeta.table + " " + sql;
}
return sql;// 先处理别名,再处理args,最后处理page
}
/**
* 根据传入的对象构建一个用于更新一条记录的SQL
*/
public String update(Object entity) {
String sql = "UPDATE " + beanMeta.table + " SET ";
for (Field field : beanMeta.fields) {
Object fieldValue = Reflect.get(entity, field.name);
if (!beanMeta.getId().name.equals(field.name)) {// 更新所有属性,fieldValue可能为null
sql += field.column + "=" + (fieldValue) + ",";
}
}
Object id = Reflect.get(entity, beanMeta.getId().name);
return sql.substring(0, sql.length() - 1) + " WHERE " + beanMeta.getId().column + "=" + id;
}
/**
* 根据传入的对象构建一个用于更新一条记录的SQL,忽略对象中值为null的属性
*/
public String updateIgnoreNull(Object entity) {
String sql = "UPDATE " + beanMeta.table + " SET ";
for (Field field : beanMeta.fields) {
Object fieldValue = Reflect.get(entity, field.name);
if (!beanMeta.getId().name.equals(field.name) && !Verify.isEmpty(fieldValue)) {// 更新所有属性,fieldValue可能为null
sql += field.column + "=" + fieldValue + ",";
}
}
Object id = Reflect.get(entity, beanMeta.getId().name);
return sql.substring(0, sql.length() - 1) + " WHERE " + beanMeta.getId().column + "=" + id;
}
/**
* 根据传入的SQL,构建一个用于更新若干条记录的SQL
*
* @param sql 传入的sql语句,可以包含'?'占位符和具名占位符
* @param args
* @param args 替换sql中占位符的值,或者对应具名占位符的Map
* @see li.dao.QueryBuilder#setArgs(String, Object[])
*/
public String updateBySql(String sql, Object[] args) {
if (!Verify.startWith(sql, "UPDATE")) {
sql = "UPDATE " + beanMeta.table + " " + sql;
}
return sql;
}
/**
* 根据传入的对象构建一个插入一条记录的SQL
*/
public String insert(Object entity) {
String columns = " (", values = " VALUES (";
for (Field field : beanMeta.fields) {
Object fieldValue = Reflect.get(entity, field.name);
columns += field.column + ",";
values += fieldValue + ",";
}
columns = columns.substring(0, columns.length() - 1) + ")";
values = values.substring(0, values.length() - 1) + ")";
return "INSERT INTO " + beanMeta.table + columns + values;
}
/**
* 根据传入的对象构建一个插入一条记录的SQL,忽略为空的属性
*/
public String insertIgnoreNull(Object entity) {
String columns = " (", values = " VALUES (";
for (Field field : beanMeta.fields) {
Object fieldValue = Reflect.get(entity, field.name);
if (!Verify.isEmpty(fieldValue)) {// 略过为null的属性
columns += field.column + ",";
values += fieldValue + ","; // TODO
}
}
columns = columns.substring(0, columns.length() - 1) + ")";
values = values.substring(0, values.length() - 1) + ")";
return "INSERT INTO " + beanMeta.table + columns + values;
}
}