日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

J2EE项目数据字典设计

發(fā)布時(shí)間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 J2EE项目数据字典设计 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

歡迎轉(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。