最近被安排做資料字典的設計,本人一頭霧水啊,沒弄過啊,網上搜索一下,這個老兄寫的很好,原文連結:http://blog.csdn.net/stevene/article/details/575142?reload

在應用開發中,總會遇到許多資料字典項,比如物件狀態、物件型別等等,這些項一般都是固定的若干可選值選項,比如物件狀態可能有新建、修改、刪除等狀態,這些資料字典項一旦定義完畢改動的頻率非常低;在應用開發中,為了處理方便,一般要對這些資料字典項值選項進行數字編碼(例如: 0表示新建,1表示修改,2表示刪除等),以方便應用程式中使用。而UI顯示物件資訊時不能顯示物件狀態等的編碼,對於編碼值設計人員知道代表什麼意思,但使用者就不明白了,所以需要進行編碼轉換,從編碼轉換為文字描述(名稱),也就是需要把狀態編碼0轉換為“新建”,把1轉換為“修改”,把2轉換為“刪除”等顯示給使用者,使用者才明白物件當前的狀態是什麼。

下面介紹一下常用的實現方法:

實現方案:

一、在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;

  }

第四步,提供資料字典項編碼轉換方法類: