package com.jqmobile.core.android.db.orm;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jqmobile.core.orm.DBTable;
import com.jqmobile.core.orm.exception.ORMNotDBTableException;
import com.jqmobile.core.orm.exception.ORMTableParmaryRepeatException;
import com.jqmobile.core.utils.plain.BeanUtils;
import com.jqmobile.core.utils.plain.StringUtils;
public class BaseDBTable {
private final Class<?> tableClass;
private final DBTable dbLable;
private BaseDBColumn parmaryId;
private List<BaseDBColumn> mappingFields = new ArrayList<BaseDBColumn>();
private String createTableSql,insertSql,updateSql,dropTableSql,deleteSql,findSql;
private final static Map<Class<?>, BaseDBTable> map = new HashMap<Class<?>, BaseDBTable>();
public static BaseDBTable getInstance(Class<?> c) throws ORMNotDBTableException{
synchronized (map) {
if(!map.containsKey(c)){
map.put(c, new BaseDBTable(c));
}
}
return map.get(c);
}
private BaseDBTable(Class<?> c) throws ORMNotDBTableException{
this.tableClass = c;
this.dbLable = c.getAnnotation(DBTable.class);
if(null == dbLable){
throw new ORMNotDBTableException();
}
initSql();
}
public DBTable getDBTable() {
return dbLable;
}
public List<BaseDBColumn> getMappingFields() {
return mappingFields;
}
public String getTableName(){
if(DBTable.DefaultValue.equals(dbLable.name())) return tableClass.getName().substring(tableClass.getName().lastIndexOf(".")+1);
return dbLable.name();
}
public Class<?> getTableClass() {
return tableClass;
}
private void initSql(){
clear();
Field[] fields = BeanUtils.getAllFields_Cache(tableClass);
StringBuilder creatTableSql=new StringBuilder("create table "),
dropTableSql=new StringBuilder(" DROP TABLE "),
insertDataSql=new StringBuilder("insert into "),
iValues = new StringBuilder(" ( "),
updateDataSql=new StringBuilder("update "),
deleteDataSql=new StringBuilder(" delete from "),
findDataSql=new StringBuilder(" select * from ");
String tableName = getTableName();
creatTableSql.append(tableName);
creatTableSql.append(" ( ");
dropTableSql.append(tableName);
insertDataSql.append(tableName);
insertDataSql.append("(");
updateDataSql.append(tableName);
updateDataSql.append(" set \n");
deleteDataSql.append(tableName);
deleteDataSql.append(" where ");
findDataSql.append(tableName);
findDataSql.append(" where ");
boolean isFirst = true;
//临时变量,用于储存主键列名
String tempId="";
for(Field f : fields){
if(f.getName().contains("$")) continue;
BaseDBColumn column = BaseDBColumn.getInstance(f);
if(!column.isMapping()) continue;
//paimary id
if(column.isPaimaryId()){
//将主键列名赋值给临时变量
tempId=column.getColumnName();
if(null == parmaryId){
this.parmaryId = column;
deleteDataSql.append(column.getColumnName());
deleteDataSql.append("=?");
findDataSql.append(column.getColumnName());
findDataSql.append("=?");
}else{
throw new ORMTableParmaryRepeatException(" old:"+parmaryId.getColumnName()+",now:"+f.getName());
}
}
String columnType = column.getColumnType();
String columnName = column.getColumnName();
if(!isFirst) creatTableSql.append(" , \n ");
creatTableSql.append(" ");
creatTableSql.append(columnName);
creatTableSql.append(" ");
creatTableSql.append(columnType);
if(!isFirst) insertDataSql.append(" , ");
insertDataSql.append(columnName);
if(!isFirst) iValues.append(" , ");
iValues.append(" ? ");
if(!columnName.equals(tempId)){
updateDataSql.append(columnName);
}
if(!isFirst) updateDataSql.append("=?, ");
//
f.setAccessible(true);
mappingFields .add(column);
isFirst = false;
}
creatTableSql.append(" ,PRIMARY KEY ("+tempId+") \n)");
iValues.append(" ) ");
insertDataSql.append(" ) ");
insertDataSql.append(" values ");
insertDataSql.append(iValues);
updateDataSql.delete(updateDataSql.length()-2, updateDataSql.length()-1);
updateDataSql.append(" where "+tempId+" = ?");
this.createTableSql = creatTableSql.toString();
this.insertSql = insertDataSql.toString();
this.updateSql = updateDataSql.toString();
this.dropTableSql = dropTableSql.toString();
this.deleteSql = deleteDataSql.toString();
this.findSql = findDataSql.toString();
}
private void clear() {
parmaryId = null;
}
public BaseDBColumn getParmaryId() {
return parmaryId;
}
public String getCreateTableSql(){
if(null == createTableSql) initSql();
return createTableSql;
}
public String getDropTableSql(){
if(null == dropTableSql) initSql();
return dropTableSql;
}
public String getInstnerSql(){
if(null == insertSql) initSql();
return insertSql;
}
public String getUpdateSqlByPID(){
if(null == updateSql) initSql();
return updateSql;
}
public String getDeleteSqlByPID(){
if(null == deleteSql) initSql();
return deleteSql;
}
public String getFindSqlByPID() {
if(null == findSql) initSql();
return findSql;
}
public String getQuerySql(String where) {
String head = "select * from "+getTableName();
if(StringUtils.isEmpty(where, true)){
return head;
}else if(where.trim().toLowerCase().startsWith("select")){
return where;
}else if(where.trim().toLowerCase().startsWith("where")){
return head+" "+where;
}else{
return head+" where "+where;
}
}
public String getQueryRowSql(String where) {
String head = "select count("+parmaryId.getColumnName()+") from "+getTableName();
if(StringUtils.isEmpty(where, true)){
return head;
}else if(where.trim().toLowerCase().startsWith("select")){
return where;
}else if(where.trim().toLowerCase().startsWith("where")){
return head+" "+where;
}else{
return head+" where "+where;
}
}
public String getModifySql(String set) {
String head = "update from "+getTableName()+" ";
if(StringUtils.isEmpty(set, true)){
return "";
}else if(set.trim().toLowerCase().startsWith("update")){
return set;
}else if(set.trim().toLowerCase().startsWith("set")){
return head+set;
}else{
return head+" set "+set;
}
}
public String getDeleteSql(String where) {
String head = "delete * from "+getTableName();
if(StringUtils.isEmpty(where, true)){
return head;
}else if(where.trim().toLowerCase().startsWith("select")){
return where;
}else if(where.trim().toLowerCase().startsWith("where")){
return head+" "+where;
}else{
return head+" where "+where;
}
}
}