package cn.org.rapid_framework.generator.provider.db.table.model; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import cn.org.rapid_framework.generator.GeneratorProperties; import cn.org.rapid_framework.generator.provider.db.table.TableFactory; import cn.org.rapid_framework.generator.util.StringHelper; /** * 用于生成代码的Table对象.对应数据库的table * @author badqiu * @email badqiu(a)gmail.com */ public class Table { String sqlName; String remarks; String className; /** the name of the owner of the synonym if this table is a synonym */ private String ownerSynonymName = null; LinkedHashSet<Column> columns = new LinkedHashSet<Column>(); List<Column> primaryKeyColumns = new ArrayList<Column>(); public Table() {} public Table(Table t) { setSqlName(t.getSqlName()); this.remarks = t.getRemarks(); this.className = t.getSqlName(); this.ownerSynonymName = t.getOwnerSynonymName(); this.columns = t.getColumns(); this.primaryKeyColumns = t.getPrimaryKeyColumns(); this.tableAlias = t.getTableAlias(); this.exportedKeys = t.exportedKeys; this.importedKeys = t.importedKeys; } public LinkedHashSet<Column> getColumns() { return columns; } public void setColumns(LinkedHashSet<Column> columns) { this.columns = columns; } public String getOwnerSynonymName() { return ownerSynonymName; } public void setOwnerSynonymName(String ownerSynonymName) { this.ownerSynonymName = ownerSynonymName; } /** 使用 getPkColumns() 替换*/ @Deprecated public List<Column> getPrimaryKeyColumns() { return primaryKeyColumns; } /** 使用 setPkColumns() 替换*/ @Deprecated public void setPrimaryKeyColumns(List<Column> primaryKeyColumns) { this.primaryKeyColumns = primaryKeyColumns; } /** 数据库中表的表名称,其它属性很多都是根据此属性派生 */ public String getSqlName() { return sqlName; } public void setSqlName(String sqlName) { this.sqlName = sqlName; } public static String removeTableSqlNamePrefix(String sqlName) { String prefixs = GeneratorProperties.getProperty("tableRemovePrefixes", ""); for(String prefix : prefixs.split(",")) { String removedPrefixSqlName = StringHelper.removePrefix(sqlName, prefix,true); if(!removedPrefixSqlName.equals(sqlName)) { return removedPrefixSqlName; } } return sqlName; } /** 数据库中表的表备注 */ public String getRemarks() { return remarks; } public void setRemarks(String remarks) { this.remarks = remarks; } public void addColumn(Column column) { columns.add(column); } public void setClassName(String customClassName) { this.className = customClassName; } /** * 根据sqlName得到的类名称,示例值: UserInfo * @return */ public String getClassName() { if(StringHelper.isBlank(className)) { String removedPrefixSqlName = removeTableSqlNamePrefix(sqlName); className = StringHelper.makeAllWordFirstLetterUpperCase(StringHelper.toUnderscoreName(removedPrefixSqlName)); } return className; } /** * 根据sqlName得到的类名称的小写,示例值: userinfo * @return */ public String getClassNameLower() { if(StringHelper.isBlank(className)) { String removedPrefixSqlName = removeTableSqlNamePrefix(sqlName); className = StringHelper.makeAllWordFirstLetterUpperCase(StringHelper.toUnderscoreName(removedPrefixSqlName)); } return className.toLowerCase(); } /** 数据库中表的别名,等价于: getRemarks().isEmpty() ? getClassName() : getRemarks() */ public String getTableAlias() { if(StringHelper.isNotBlank(tableAlias)) return tableAlias; return StringHelper.removeCrlf(StringHelper.defaultIfEmpty(getRemarks(), getClassName())); } public void setTableAlias(String v) { this.tableAlias = v; } /** * 等价于getClassName().toLowerCase() * @return */ public String getClassNameLowerCase() { return getClassName().toLowerCase(); } /** * 得到用下划线分隔的类名称,如className=UserInfo,则underscoreName=user_info * @return */ public String getUnderscoreName() { return StringHelper.toUnderscoreName(getClassName()).toLowerCase(); } /** * 返回值为getClassName()的第一个字母小写,如className=UserInfo,则ClassNameFirstLower=userInfo * @return */ public String getClassNameFirstLower() { return StringHelper.uncapitalize(getClassName()); } /** * 根据getClassName()计算而来,用于得到常量名,如className=UserInfo,则constantName=USER_INFO * @return */ public String getConstantName() { return StringHelper.toUnderscoreName(getClassName()).toUpperCase(); } /** 使用 getPkCount() 替换*/ @Deprecated public boolean isSingleId() { return getPkCount() == 1 ? true : false; } /** 使用 getPkCount() 替换*/ @Deprecated public boolean isCompositeId() { return getPkCount() > 1 ? true : false; } /** 使用 getPkCount() 替换*/ @Deprecated public boolean isNotCompositeId() { return !isCompositeId(); } /** * 得到主键总数 * @return */ public int getPkCount() { int pkCount = 0; for(Column c : columns){ if(c.isPk()) { pkCount ++; } } return pkCount; } /** * use getPkColumns() * @deprecated */ public List getCompositeIdColumns() { return getPkColumns(); } /** * 得到是主键的全部column * @return */ public List<Column> getPkColumns() { List results = new ArrayList(); for(Column c : getColumns()) { if(c.isPk()) results.add(c); } return results; } /** * 得到不是主键的全部column * @return */ public List<Column> getNotPkColumns() { List results = new ArrayList(); for(Column c : getColumns()) { if(!c.isPk()) results.add(c); } return results; } /** 得到单主键,等价于getPkColumns().get(0) */ public Column getPkColumn() { if(getPkColumns().isEmpty()) { throw new IllegalStateException("not found primary key on table:"+getSqlName()); } return getPkColumns().get(0); } /**使用 getPkColumn()替换 */ @Deprecated public Column getIdColumn() { return getPkColumn(); } public List<Column> getEnumColumns() { List results = new ArrayList(); for(Column c : getColumns()) { if(!c.isEnumColumn()) results.add(c); } return results; } public Column getColumnByName(String name) { Column c = getColumnBySqlName(name); if(c == null) { c = getColumnBySqlName(StringHelper.toUnderscoreName(name)); } return c; } public Column getColumnBySqlName(String sqlName) { for(Column c : getColumns()) { if(c.getSqlName().equalsIgnoreCase(sqlName)) { return c; } } return null; } public Column getRequiredColumnBySqlName(String sqlName) { if(getColumnBySqlName(sqlName) == null) { throw new IllegalArgumentException("not found column with sqlName:"+sqlName+" on table:"+getSqlName()); } return getColumnBySqlName(sqlName); } /** * 忽略过滤掉某些关键字的列,关键字不区分大小写,以逗号分隔 * @param ignoreKeywords * @return */ public List<Column> getIgnoreKeywordsColumns(String ignoreKeywords) { List results = new ArrayList(); for(Column c : getColumns()) { String sqlname = c.getSqlName().toLowerCase(); if(StringHelper.contains(sqlname,ignoreKeywords.split(","))) { continue; } results.add(c); } return results; } /** * This method was created in VisualAge. */ public void initImportedKeys(DatabaseMetaData dbmd) throws java.sql.SQLException { // get imported keys a ResultSet fkeys = dbmd.getImportedKeys(catalog,schema,this.sqlName); while ( fkeys.next()) { String pktable = fkeys.getString(PKTABLE_NAME); String pkcol = fkeys.getString(PKCOLUMN_NAME); String fktable = fkeys.getString(FKTABLE_NAME); String fkcol = fkeys.getString(FKCOLUMN_NAME); String seq = fkeys.getString(KEY_SEQ); Integer iseq = new Integer(seq); getImportedKeys().addForeignKey(pktable,pkcol,fkcol,iseq); } fkeys.close(); } /** * This method was created in VisualAge. */ public void initExportedKeys(DatabaseMetaData dbmd) throws java.sql.SQLException { // get Exported keys ResultSet fkeys = dbmd.getExportedKeys(catalog,schema,this.sqlName); while ( fkeys.next()) { String pktable = fkeys.getString(PKTABLE_NAME); String pkcol = fkeys.getString(PKCOLUMN_NAME); String fktable = fkeys.getString(FKTABLE_NAME); String fkcol = fkeys.getString(FKCOLUMN_NAME); String seq = fkeys.getString(KEY_SEQ); Integer iseq = new Integer(seq); getExportedKeys().addForeignKey(fktable,fkcol,pkcol,iseq); } fkeys.close(); } /** * @return Returns the exportedKeys. */ public ForeignKeys getExportedKeys() { if (exportedKeys == null) { exportedKeys = new ForeignKeys(this); } return exportedKeys; } /** * @return Returns the importedKeys. */ public ForeignKeys getImportedKeys() { if (importedKeys == null) { importedKeys = new ForeignKeys(this); } return importedKeys; } public String toString() { return "Database Table:"+getSqlName()+" to ClassName:"+getClassName(); } String catalog = TableFactory.getInstance().getCatalog(); String schema = TableFactory.getInstance().getSchema(); private String tableAlias; private ForeignKeys exportedKeys; private ForeignKeys importedKeys; public static final String PKTABLE_NAME = "PKTABLE_NAME"; public static final String PKCOLUMN_NAME = "PKCOLUMN_NAME"; public static final String FKTABLE_NAME = "FKTABLE_NAME"; public static final String FKCOLUMN_NAME = "FKCOLUMN_NAME"; public static final String KEY_SEQ = "KEY_SEQ"; }