J2EE项目数据字典设计
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處http://blog.csdn.net/wklken/archive/2011/05/07/6402557.aspx?
?
這里的數(shù)據(jù)字典并非是數(shù)據(jù)庫的數(shù)據(jù)字典,而是在項(xiàng)目編碼過程中涉及到一些類似字典查詢的操作。
?
?
?
需求:
???? 在項(xiàng)目開發(fā)中,一些變量需要在多個(gè)地方使用,但這些變量的值是在某一范圍內(nèi),且每一個(gè)值對應(yīng)一個(gè)翻譯的字面量。
?? 若是使用數(shù)據(jù)庫存儲(chǔ),因?yàn)樽兞恐凳枪潭ǖ?#xff0c;多余的數(shù)據(jù)庫訪問沒有必要;
?? 若是直接硬編碼到代碼中,若是需要進(jìn)行修改的時(shí)候,造成維護(hù)困難;
?? 若是以常量方式書寫到類中并在使用時(shí)引用,你將發(fā)現(xiàn)你的常量類Constants里面內(nèi)容龐雜,命名和使用都極其困難。
?
常見此類鍵值對:
???? 1.省代碼表,省編碼對應(yīng)一個(gè)描述信息
????????? 2.XX類型,例如操作類型,包裝類型
?
這類鍵值對特點(diǎn):在庫中存儲(chǔ)的是數(shù)字或字母編碼,但在展示的時(shí)候使用的卻是其翻譯
?
處理方式:
1.?????? 將鍵值對內(nèi)容書寫到XML文件中;
2.?????? 系統(tǒng)啟動(dòng)時(shí)讀取加載入內(nèi)存;
3.?????? 使用時(shí)直接調(diào)用翻譯。
?
?XML文檔結(jié)構(gòu)設(shè)計(jì):【dtd晚點(diǎn)補(bǔ)上,一些細(xì)節(jié)優(yōu)點(diǎn)模糊了】
<?xml version="1.0" encoding="UTF-8" ?> <dics><table id="BUSSINESS"><field id="TYPE"><row><value><!--[CDATA[01]]></value><desc><![CDATA[空運(yùn)進(jìn)口]]></desc></row><row><value><![CDATA[02]]></value><desc><![CDATA[空運(yùn)出口]]></desc></row></field><field id="AB"><row><value><![CDATA[1]]></value><desc><![CDATA[進(jìn)口]]></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[一般貿(mào)易]]></desc></row><row><value><![CDATA[12]]></value><desc><![CDATA[易貨貿(mào)易]]--></desc></row></field></table></dics>
?
然后是在內(nèi)存中存儲(chǔ)形式:
數(shù)據(jù)結(jié)構(gòu)
使用LinkedHashMap【你有可能需要將其按序展現(xiàn)在下拉列表中】
LinkedHashMap<String,LinkedHashMap<String,LinkedHashMap<String,String> > > sysDic;
?
囧,是不是有點(diǎn)混亂,畫個(gè)圖吧
?
?
?
然后,在系統(tǒng)加載的時(shí)候讀入內(nèi)存
?
根據(jù)個(gè)人偏好吧,可以使用JDK自帶的,或者JDOM,個(gè)人偏好Dom4j
使用Dom4j,然后根據(jù)xpath進(jìn)行節(jié)點(diǎn)選取,代碼少,并且簡介
?
以下是逐層讀取的函數(shù)代碼
/*** 初始化數(shù)據(jù)字典*/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; /*** 數(shù)據(jù)字典工具類,獲取數(shù)據(jù)字典相關(guān)信息* @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;}/*** 獲取某一數(shù)據(jù)字典所有 值-描述 * @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;}}/*** 獲取某個(gè)數(shù)據(jù)字典某個(gè)域 值對應(yīng)的描述* @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;}} }
?
使用:
獲取單個(gè)值對應(yīng)描述:SysDicUtil.getFieldDesc("OP", "TYPE", 值)
【其實(shí)這里方法可以加個(gè)重載的,參數(shù)("A.B",值)】
獲取一整個(gè)列表:SysDicUtil.getAllFields("OP", "TYPE")
總結(jié)
以上是生活随笔為你收集整理的J2EE项目数据字典设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的软考之路——软考心得
- 下一篇: 分享一个免费巨好用的shell工具