J2EE项目数据字典设计
歡迎轉載,轉載請注明出處http://blog.csdn.net/wklken/archive/2011/05/07/6402557.aspx?
?
這里的數據字典并非是數據庫的數據字典,而是在項目編碼過程中涉及到一些類似字典查詢的操作。
?
?
?
需求:
???? 在項目開發中,一些變量需要在多個地方使用,但這些變量的值是在某一范圍內,且每一個值對應一個翻譯的字面量。
?? 若是使用數據庫存儲,因為變量值是固定的,多余的數據庫訪問沒有必要;
?? 若是直接硬編碼到代碼中,若是需要進行修改的時候,造成維護困難;
?? 若是以常量方式書寫到類中并在使用時引用,你將發現你的常量類Constants里面內容龐雜,命名和使用都極其困難。
?
常見此類鍵值對:
???? 1.省代碼表,省編碼對應一個描述信息
????????? 2.XX類型,例如操作類型,包裝類型
?
這類鍵值對特點:在庫中存儲的是數字或字母編碼,但在展示的時候使用的卻是其翻譯
?
處理方式:
1.?????? 將鍵值對內容書寫到XML文件中;
2.?????? 系統啟動時讀取加載入內存;
3.?????? 使用時直接調用翻譯。
?
?XML文檔結構設計:【dtd晚點補上,一些細節優點模糊了】
<?xml version="1.0" encoding="UTF-8" ?> <dics><table id="BUSSINESS"><field id="TYPE"><row><value><!--[CDATA[01]]></value><desc><![CDATA[空運進口]]></desc></row><row><value><![CDATA[02]]></value><desc><![CDATA[空運出口]]></desc></row></field><field id="AB"><row><value><![CDATA[1]]></value><desc><![CDATA[進口]]></desc></row><row><value><![CDATA[2]]></value><desc><![CDATA[出口]]></desc></row></field></table><table id="TRADE"><field id="TYPE"><row><value><![CDATA[11]]></value><desc><![CDATA[一般貿易]]></desc></row><row><value><![CDATA[12]]></value><desc><![CDATA[易貨貿易]]--></desc></row></field></table></dics>
?
然后是在內存中存儲形式:
數據結構
使用LinkedHashMap【你有可能需要將其按序展現在下拉列表中】
LinkedHashMap<String,LinkedHashMap<String,LinkedHashMap<String,String> > > sysDic;
?
囧,是不是有點混亂,畫個圖吧
?
?
?
然后,在系統加載的時候讀入內存
?
根據個人偏好吧,可以使用JDK自帶的,或者JDOM,個人偏好Dom4j
使用Dom4j,然后根據xpath進行節點選取,代碼少,并且簡介
?
以下是逐層讀取的函數代碼
/*** 初始化數據字典*/public static void initSysDic() {try {SAXReader reader = new SAXReader();Document document = reader.read(new File("src/main/resources/system/sysDic.xml"));LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>> sysDic = buildSysDic(document);SysDicUtil.setSysDic(sysDic);} catch (Exception e) {e.printStackTrace();}}@SuppressWarnings("unchecked")public static LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>> buildSysDic(Document document) {String xpath = "dics/table";List<Node> tables = document.selectNodes(xpath);return handleTables(tables);}/*** 處理一組table* * @param tables* @return*/private static LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>> handleTables(List<Node> tables) {LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>> tableMap = new LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>>();Node table = null;String id = null;LinkedHashMap<String, LinkedHashMap<String, String>> field = null;for (int i = 0, len = tables.size(); i < len; i++) {table = tables.get(i);id = table.selectSingleNode("@id").getText();System.out.println(id);field = handleFields(table.selectNodes("field"));tableMap.put(id, field);}return tableMap;}/*** 處理一組field* * @param fields* @return*/private static LinkedHashMap<String, LinkedHashMap<String, String>> handleFields(List<Node> fields) {LinkedHashMap<String, LinkedHashMap<String, String>> fieldMap = new LinkedHashMap<String, LinkedHashMap<String, String>>();Node field = null;String id = null;LinkedHashMap<String, String> row = null;for (int i = 0, len = fields.size(); i < len; i++) {field = fields.get(i);id = field.selectSingleNode("@id").getText();System.out.println(id);row = handleRows(field.selectNodes("row"));fieldMap.put(id, row);}return fieldMap;}/*** 處理一組row* * @param rows* @return*/private static LinkedHashMap<String, String> handleRows(List<Node> rows) {LinkedHashMap<String, String> rowMap = new LinkedHashMap<String, String>();Node row = null;String key = null;String value = null;for (int i = 0, len = rows.size(); i < len; i++) {row = rows.get(i);key = row.selectSingleNode("value").getText();value = row.selectSingleNode("desc").getText();rowMap.put(key, value);System.out.println(key + " " + value);}return rowMap;}
?
最后,是獲取及使用
import java.util.LinkedHashMap; /*** 數據字典工具類,獲取數據字典相關信息* @author ken**/ public class SysDicUtil {private static LinkedHashMap<String,LinkedHashMap<String,LinkedHashMap<String,String> > > sysDic;private SysDicUtil() {// TODO Auto-generated constructor stub}public static void setSysDic(LinkedHashMap<String,LinkedHashMap<String,LinkedHashMap<String,String>> > aSysDic){sysDic = aSysDic;}/*** 獲取某一數據字典所有 值-描述 * @param tableName* @param fieldName* @return*/public static LinkedHashMap<String,String> getAllFields(String tableName,String fieldName){if(sysDic.containsKey(tableName)){LinkedHashMap<String,LinkedHashMap<String,String> > subDic = sysDic.get(tableName);if(subDic.containsKey(fieldName)){return subDic.get(fieldName);}else{return null;}}else{return null;}}/*** 獲取某個數據字典某個域 值對應的描述* @param tableName* @param fieldName* @param value* @return*/public static String getFieldDesc(String tableName,String fieldName,String value){if(sysDic.containsKey(tableName)){if(sysDic.get(tableName).containsKey(fieldName)){return sysDic.get(tableName).get(fieldName).get(value);}else{return value;}}else{return value;}} }
?
使用:
獲取單個值對應描述:SysDicUtil.getFieldDesc("OP", "TYPE", 值)
【其實這里方法可以加個重載的,參數("A.B",值)】
獲取一整個列表:SysDicUtil.getAllFields("OP", "TYPE")
 
總結
以上是生活随笔為你收集整理的J2EE项目数据字典设计的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 我的软考之路——软考心得
- 下一篇: asp.net 使用my97 datep
