傳統 CMP Entity Bean、Struts ActionForm、Hibernate 映射文件均假設「持久化字段名、數量、類型」在編譯期確定(固定字段假設)。一旦客戶需求導致字段變更,或多客戶部署需不同字段集,便產生大量代碼分支與版本樹,維護成本極高。
將字段三屬性(名、類型、數量)與代碼分離,引入「數據容器 + 解析執行器」模式:
核心技術棧:字典集合 (Map) + 數據庫元數據 (JDBC DatabaseMetaData) + XML/JMS + 動態編譯 (過渡)。
PersonHtmlActionreqHashNameValue (Map<String,String>)targetHashNameType (Map<String,Class>):DatabaseMetaData.getColumns()finalHashNameValue:僅保留表中存在的字段,按類型轉換值。
public class PersonHtmlAction extends HtmlAction {
private Connection conn;
private Map reqHashNameValue;
private Map targetHashNameType;
private Map finalHashNameValue;
protected Map getReqHashNameValue() {
Map map = new HashMap<>();
Enumeration names = request.getParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
map.put(name, request.getParameter(name));
}
return map;
}
protected Map getTargetHashNameType() {
Map map = new HashMap<>();
ResultSet cols = metaData.getColumns(null, schema, "person_table", null);
while (cols.next()) {
String colName = cols.getString("COLUMN_NAME");
int sqlType = cols.getInt("DATA_TYPE");
map.put(colName, sqlTypeToJavaClass(sqlType));
}
return map;
}
protected Map getFinalHashNameValue() {
Map map = new HashMap<>();
for (Map.Entry e : reqHashNameValue.entrySet()) {
Class targetType = targetHashNameType.get(e.getKey());
if (targetType != null) {
map.put(e.getKey(), convert(e.getValue(), targetType));
}
}
return map;
}
protected void insert() {
StringBuilder sql = new StringBuilder("insert into person_table (");
StringBuilder vals = new StringBuilder(")");
List
XMLPersonHtmlAction:請求參數 → XML 文檔 → JMS 發送至臨時回覆隊列。PersonMDB (Message-Driven Bean):onMessage() 接收 XML → 解析為 XMLHashNameValue → 同方案一流程持久化 → JMS 回覆結果。| 技術 | 優勢 | 適用場景 |
|---|---|---|
| Map + 元數據 | 簡單、同步、零額外依賴 | 中小型應用、單體部署、快速迭代 |
| XML + JMS + MDB | 分布式、異步、標準化 | 大型系統、跨系統集成、高併發寫入 |
| 動態編譯 (XSLT→Java) | 極致性能、靜態類型 | 字段變更頻率低、對吞吐極度敏感 |
DatabaseMetaData 查詢較慢,應用啟動時加載緩存,定時刷新。Map<Class, Converter> 統一處理 String→Date/Number/Enum 等轉換。created_by、created_at 由框架層注入,不依賴前端傳遞。「不定字段假設」將字段變更從「風險」轉化為「可配置需求」。以 Map/元數據為核心的同步方案構建簡單,XML/JMS 異步方案擴展性強。現代架構中,配合動態表單引擎、低代碼平台,可進一步賦能業務自助構建,實現真正的「字段級多租戶」與敏捷交付。