資料字典項 設計實現方案
最近被安排做資料字典的設計,本人一頭霧水啊,沒弄過啊,網上搜索一下,這個老兄寫的很好,原文連結:http://blog.csdn.net/stevene/article/details/575142?reload
在應用開發中,總會遇到許多資料字典項,比如物件狀態、物件型別等等,這些項一般都是固定的若干可選值選項,比如物件狀態可能有新建、修改、刪除等狀態,這些資料字典項一旦定義完畢改動的頻率非常低;在應用開發中,為了處理方便,一般要對這些資料字典項值選項進行數字編碼(例如: 0表示新建,1表示修改,2表示刪除等),以方便應用程式中使用。而UI顯示物件資訊時不能顯示物件狀態等的編碼,對於編碼值設計人員知道代表什麼意思,但使用者就不明白了,所以需要進行編碼轉換,從編碼轉換為文字描述(名稱),也就是需要把狀態編碼0
下面介紹一下常用的實現方法:
實現方案:
一、在java檔案中定義資料字典項
我們習慣上把應用中遇到的資料字典項都定義到一個java檔案中,這是最常用的方法,實現起來比較簡單,但維護起來就非常繁瑣,特別是資料字典項比較多的情況下,相應的java檔案就會比較大,一旦資料字典項有更新那麼維護起來就比較費時費力。
在java檔案中定義資料字典項通常情況下定義為static,舉例來說,類ReportConstants中定義了以下資料字典項:
public static final int CODE_USERINF_TECHELEVEL_GJ = 1;
public static final String CODE_USERINF_TECHELEVEL_GJ_KEY = "高階";
public static final int CODE_USERINF_TECHELEVEL_ZJ = 2;
public static final String CODE_USERINF_TECHELEVEL_ZJ_KEY = "中級";
public static final int CODE_USERINF_TECHELEVEL_CJ = 3;
public static final String CODE_USERINF_TECHELEVEL_CJ_KEY = "初級";
public static final int CODE_USERINF_TECHELEVEL_WJ = 4;
public static final String CODE_USERINF_TECHELEVEL_WJ_KEY = "無職稱";
那麼我們在實現中就可以直接引用相應的資料字典項編碼及名稱,另外,一般情況下需要定義資料字典項編碼和名稱的轉換方法,比如:
public static String getCodeName(int lCode)
{
//初始化返回值
String strReturn = "未知";
switch (lCode)
{
case CODE_USERINF_TECHELEVEL_GJ :
strReturn = CODE_USERINF_TECHELEVEL_GJ_KEY;
break;
case CODE_USERINF_TECHELEVEL_ZJ :
strReturn = CODE_USERINF_TECHELEVEL_ZJ_KEY;
break;
case CODE_USERINF_TECHELEVEL_CJ :
strReturn = CODE_USERINF_TECHELEVEL_CJ_KEY;
break;
case CODE_USERINF_TECHELEVEL_WJ :
strReturn = CODE_USERINF_TECHELEVEL_WJ_KEY;
break;
}
return strReturn;
}
這個方法實現了通過資料字典項編碼獲得資料字典項名稱的功能。那麼還需要實現一個對應的方法,getCodeByName(String name),即通過資料字典項名稱獲取資料字典項編碼功能(程式碼這裡省略,請讀者自己完成)。這樣就可以實現資料字典項編碼和名稱的相互轉換。
但是一旦出現數據字典項名稱或編碼需要更改(“無職稱”項編碼需要由“4”改為“0”),或增加減少資料字典項,都需要更新java檔案程式碼。是否有簡便的方法在滿足上述需求的情況下又不更新java檔案程式碼?答案是肯定的。下面我們來介紹兩種實現方法:一中使用xml檔案,一種在資料庫定義。
二、在xml檔案中定義
第一種方案是應用xml配置檔案來定義資料字典項。使用xml配置檔案,以便最大限度的減小維護的工作量,避免java程式碼的頻繁修改。
下面我們分步驟詳細介紹一下使用xml配置檔案的實現方案
第一步:定義xml資料字典項配置檔案
首先新建一個xml檔案,命名為DataDictionaryConfig.xml(名字可以自己定義),把應用的用到的資料字典項分組定義到xml檔案中,舉例如下,我們定義了下列資料字典項:
<?xml version="1.0" encoding="GB2312"?>
<data-dictionaries>
<data-dictionary>
<group value = "0" name="ObjectStatus">
<option value="0" name="detached"/>
<option value="1" name="new"/>
<option value="2" name="updated"/>
<option value="3" name="deleted"/>
</group>
<group value = "1" name="ObjectTypes">
<option value="0" name="物件型別選項0"/>
<option value="1" name="物件型別選項1"/>
<option value="2" name="物件型別選項2"/>
<option value="3" name="物件型別選項3"/>
<option value="4" name="物件型別選項4"/>
</group>
</data-dictionary>
</data-dictionaries>
這個xml檔案可以根據需要進行擴充套件,滿足更復雜應用的需要。
第二步,定義資料字典項物件類和資料字典項分組物件類:
對於資料字典項這裡我們定義了一個數據字典項物件類,一組資料字典選項集我們定義了一個數據字典項分組物件類,如下:
(1)、資料字典項類:
public class DataDictionaryItem
{
public DataDictionaryItem()
{
}
private String code;
private String name;
public void setCode(String code)
{
this.code = code;
}
public String getCode()
{
return this.code;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
}
(2)、資料字典項分組類
public class DataDictionaryItems
{
public DataDictionaryItems()
{
}
//資料字典項分組編碼
private String groupCode;
//資料字典項分組名稱
private String groupName;
//資料字典項詳細
private java.util.ArrayList items;
public void setGroupCode(String code)
{
this.groupCode = code;
}
public String getGroupCoude()
{
return this.groupCode;
}
public void setGroupName(String name)
{
this.groupName = name;
}
public String getGroupName()
{
return this.groupName;
}
//設定資料字典項
public void setDataDictionaryItem(DataDictionaryItem item)
{
if(this.items == null)
this.items = new java.util.ArrayList();
this.items.add(item);
}
//設定資料字典項
public void setDataDictionaryItem(String itemName, String itemCode)
{
if(this.items == null)
this.items = new java.util.ArrayList();
DataDictionaryItem item = new DataDictionaryItem();
item.setCode(itemCode);
item.setName(itemName);
this.items.add(item);
}
//獲得資料字典項組物件
public java.util.ArrayList getDataDictioanryItems()
{
return this.items;
}
第三步,定義Xml資料字典項配置檔案解析類,這裡我們使用Dom4J,相應的jar可以在http://www.dom4j.org/上找到
import org.dom4j.*;
import org.dom4j.io.*;
import java.util.*;
public class XMLDDItemParser {
//資料字典項結構
public static DataDictionaryItems dataItems ;
private static String GROUP_NAME = "name";
private static String GROUP_CODE = "value";
private static String ITEM_NAME = "name";
private static String ITEM_CODE = "value";
public XMLDDItemParser() {
}
/**
* 獲得分組資料字典項集
* @param groupName String
* @return DataDictionaryItems
*/
public static DataDictionaryItems getDataDictionaryItems(String groupName)
{
if(dataItems == null)
dataItems = parseXML(groupName);
return dataItems;
}
/**
* 根據分組名稱解析xml檔案,獲得該分組下資料字典項集
* @param gName String
* @return DataDictionaryItems 資料字典項分組物件
*/
public static DataDictionaryItems parseXML(String gName)
{
try
{
org.dom4j.io.SAXReader saxReader = new org.dom4j.io.SAXReader();
Document document = saxReader.read("DataDictionaryConfig.xml");
dataItems = new DataDictionaryItems();
List list = document.selectNodes("//group");
Iterator iter = list.iterator();
while (iter.hasNext())
{
Node node = (Node) iter.next();
if (node instanceof Element)
{
//document
Element element = (Element) node;
String GroupName = element.attributeValue(GROUP_NAME);
String GroupValue = element.attributeValue(GROUP_CODE);
//設定分組名稱編碼
dataItems.setGroupName(GroupName);
dataItems.setGroupCode(GroupValue);
//取組內資料字典項
if (gName.equals(GroupName))
{
//取資料字典項名稱編碼
Iterator elemIter = element.elementIterator();
while (elemIter.hasNext())
{
Element elem = (Element) elemIter.next();
dataItems.setDataDictionaryItem(elem.attributeValue(ITEM_NAME), elem.attributeValue(ITEM_CODE));
}
}
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}
return dataItems;
}
第四步,提供資料字典項編碼轉換方法類: