package com.github.walker.easydb.dao;
import com.github.walker.easydb.assistant.EasyConfig;
import com.github.walker.easydb.assistant.LogFactory;
import com.github.walker.easydb.assistant.MappingUtil;
import com.github.walker.easydb.criterion.Criteria;
import com.github.walker.easydb.dao.mysql.MysqlSqlConstructor;
import com.github.walker.easydb.dao.oracle.OracleSqlConstructor;
import com.github.walker.easydb.dao.sqlserver.SqlserverSqlConstructor;
import com.github.walker.easydb.exception.IllegalEntityException;
import com.github.walker.easydb.exception.IllegalParamException;
import org.apache.log4j.Logger;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Vector;
/**
* This class constructs the INSERT/DELETE/QUERY/UPDATE sql, it supports for
* multiple database.
*
* @author HuQingmiao
*/
public abstract class SqlConstructor {
protected Logger log = LogFactory.getLogger(this.getClass());
/**
* @param dbType
* @return SqlConstructor
*/
public static SqlConstructor getInstance(String dbType) {
if ("mysql".equalsIgnoreCase(dbType)) {
return MysqlSqlConstructor.getInstance();
} else if ("oracle".equalsIgnoreCase(dbType)) {
return OracleSqlConstructor.getInstance();
} else if ("sqlserver".equalsIgnoreCase(dbType)) {
return SqlserverSqlConstructor.getInstance();
}
Logger log = LogFactory.getLogger(LogFactory.MODULE_EASYDB);
log.error("The database type in the file '" + EasyConfig.CONFIG_FILENAME
+ "' is not be specified, please config it! ");
return null;
}
public abstract SqlParamIndexer buildInsert(EntityParser entityParser) throws IllegalParamException;
public abstract SqlParamIndexer buildUpdateByPk(EntityParser entityParser) throws IllegalParamException,
IllegalEntityException;
public abstract SqlParamIndexer buildUpdateByCriteria(EntityParser entityParser, Criteria criteria)
throws IllegalParamException;
public SqlParamIndexer buildDeleteByPk(EntityParser entityParser) throws IllegalParamException,
IllegalEntityException {
StringBuffer sql = new StringBuffer("DELETE FROM ");
sql.append(MappingUtil.getTableName(entityParser.getClassName()));
sql.append(" WHERE 1=1");
// 主键属性
HashSet<String> pkSet = entityParser.getPKSet();
if (pkSet.isEmpty()) {
throw new IllegalEntityException(IllegalEntityException.NOT_SPECIFY_PK, "");
}
// 按'?'在SQL中的先后顺序存储对应属性名
Vector<String> indexedParamVec = new Vector<String>(2);
// 以主键为删除条件
boolean hasPkValue = false;
for (Iterator<String> it = pkSet.iterator(); it.hasNext(); ) {
String fieldName = (String) it.next();
String columnName = MappingUtil.getColumnName(fieldName);
sql.append(" AND ");
sql.append(columnName);
sql.append("=? ");
indexedParamVec.add(fieldName);
hasPkValue = true;
}
// 没有找到主键值
if (!hasPkValue) {
throw new IllegalParamException(IllegalParamException.NOVALUE_FOR_ENTITY_PK, "");
}
return new SqlParamIndexer(sql.toString(), indexedParamVec);
}
public String buildDeleteByCriteria(Class<?> entityClass, Criteria criteria) {
StringBuffer sql = new StringBuffer("DELETE FROM ");
sql.append(MappingUtil.getTableName(entityClass.getName()));
String c = criteria.toString().trim();
if (!"".equals(c)) {
// build the where clause
sql.append(" WHERE ");
sql.append(criteria.toString());
}
return sql.toString();
}
public SqlParamIndexer buildSelectByPk(EntityParser entityParser) throws IllegalParamException,
IllegalEntityException {
StringBuffer sql = new StringBuffer("SELECT * FROM ");
sql.append(MappingUtil.getTableName(entityParser.getClassName()));
sql.append(" WHERE 1=1");
// 主键属性
HashSet<String> pkSet = entityParser.getPKSet();
if (pkSet.isEmpty()) {
throw new IllegalEntityException(IllegalEntityException.NOT_SPECIFY_PK, "");
}
// 按'?'在SQL中的先后顺序存储对应属性名
Vector<String> indexedParamVec = new Vector<String>(2);
// 以主键为查询条件
boolean hasPkValue = false;
for (Iterator<String> it = pkSet.iterator(); it.hasNext(); ) {
String fieldName = (String) it.next();
String columnName = MappingUtil.getColumnName(fieldName);
sql.append(" AND ");
sql.append(columnName);
sql.append("=? ");
indexedParamVec.add(fieldName);
hasPkValue = true;
}
// 没有找到主键值
if (!hasPkValue) {
throw new IllegalParamException(IllegalParamException.NOVALUE_FOR_ENTITY_PK, "");
}
return new SqlParamIndexer(sql.toString(), indexedParamVec);
}
/**
* Builds the select sql For querying one data.
*/
public String buildSelectSql(Class<?> entityClass, Criteria criteria) {
StringBuffer sql = new StringBuffer("SELECT * FROM ");
sql.append(MappingUtil.getTableName(entityClass.getName()));
sql.append(" WHERE ");
sql.append(criteria.toString());
return sql.toString();
}
/**
* Builds the pager sql by decorating the common business logic sql.
*
* @param sql the common business logic sql
* @param start starting position in searching records
* @param end end position of in searching records
* @return 包装构造后的SQL
*/
public abstract String buildPageSql(String sql, int start, int end);
/**
* Builds the sql for retrieveing the column meta of the table.
*
* @param tableName
* @return the sql
*/
public abstract String buildGettingMetaSql(String tableName);
/**
* Builds the sql which calculate the total records of pager query.
*
* @param sql the common business logic sql
* @return 包装构造后的SQL
*/
public abstract String buildCountSql(String sql);
public static void main(String[] args) {
try {
SqlConstructor sc = SqlConstructor.getInstance("oracle");
String sql = "SELECT A.NAME, (TO_DATE('2003-02-04','YYYY-MM-DD')-SYSDATE) S1, (TO_DATE('2ss003-02-04','YYYY-MMss-DD')-SYSDATE) S2 FROM TABLE_X A ";
System.out.println(sc.buildPageSql(sql, 1, 5));
} catch (Exception e) {
e.printStackTrace();
}
}
}