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; } } }