应用开发中数据字典项设计实现方案

应用开发中数据字典项设计实现方案

在 应用开发中,总会遇到许多数据字典项,比如对象状态、对象类型等等,这些项一般都是固定的若干可选值选项,比如对象状态可能有新建、修改、删除等状态,这 些数据字典项一旦定义完毕改动的频率非常低;在应用开发中,为了处理方便,一般要对这些数据字典项值选项进行数字编码(例如: 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;

}

第四步,提供数据字典项编码转换方法类:

public class DataDictionaryUtils {

public DataDictionaryUtils() {

}

/**

* 根据数据项名称转换为数据项编码

* @param groupName String

* @param itemName String

* @return String  数据项编码

*/

public static String getItemCode(String groupName, String itemName)

{

String code = "-1";

DataDictionaryItems dataItems = XMLDDItemParser.getDataDictionaryItems(groupName);

java.util.ArrayList items = dataItems.getDataDictioanryItems();

if(items != null)

{

DataDictionaryItem item;

for(int i = 0; i < items.size(); i++)

{

item = (DataDictionaryItem) items.get(i);

if(item != null)

{

String name = item.getName();

if(name.equals(itemName))

{

code = item.getCode();

break;

}

}

}

}

return code;

}

/**

* 根据数据项编码转换为数据项名称

* @param groupName String

* @param itemCode String

* @return String

*/

public static String getItemName(String groupName, String itemCode)

{

String name = "未知";

DataDictionaryItems dataItems = XMLDDItemParser.getDataDictionaryItems(groupName);

java.util.ArrayList items = dataItems.getDataDictioanryItems();

if (items != null)

{

DataDictionaryItem item;

for (int i = 0; i < items.size(); i++)

{

item = (DataDictionaryItem) items.get(i);

if (item != null)

{

String code = item.getCode();

if (code.equals(itemCode))

{

name = item.getName();

break;

}

}

}

}

return name;

}

至此,我们已经完成了该方案的设计。使用xml文件,增加删除数据字典项等只需要更新xml文件即可,不涉及java文件的更新。

Xml可以根据应用的具体需要进行扩展设计。这里仅仅抛砖引玉,提供一种思路。

三、使用数据库表

上一种方法我们使用xml文件定义数据字典项,现在我们把数据字典项定义在数据库表中,下面我们来详细介绍实现方式:

第一步:定义数据字典项数据表结构

根据前面xml文件定义,这里我们定义两张表,一张是数据字典分组信息表,一张是数据字典项详细信息表。如下:

drop table datadic_groups;
create table datadic_groups(
    group_code varchar2(20) primary key,
    group_name varchar2(50)
);

drop table datadic_items;
create table datadic_items(
    dataitem_code varchar2(20) primary key,
    dataitem_name varchar2(50),
    group_code varchar2(20)
);

alter table datadic_items
add constraint dataitem_foreignkey foreign key (group_code)
references datadic_groups(group_code);

这两张表可以根据应用的具体需求进行扩充,这里不再赘述。

第二步:根据定义的数据字典表结构定义数据字典实体类。

(请参照二、在xml文件中定义的第二步)

第三步:实现数据库表中数据字典项的查询功能

/**

* 实现从数据库查询数据字典项

* @param gName String

* @return DataDictionaryItems

*/

public static DataDictionaryItems getFromDB(String gName)

{

dataItems = new DataDictionaryItems();

try

{

//获取数据连接

java.sql.Connection conn = getConnection();

if(conn != null)

{

//查询数据库,根据组名称查询组编号,根据组编号获取该组内数据字典项信息

String
strSql = "select items.dataitem_code, items.dataitem_name,
items.group_code, dgroups.group_name from datadic_items items,
datadic_groups dgroups where items.group_code = dgroups.group_code and
dgroups.group_name=‘"+gName+"‘";

java.sql.Statement stmt = conn.createStatement();

java.sql.ResultSet rs = stmt.executeQuery(strSql);

while(rs.next())

{

String dataitem_code = rs.getString(1);

String dataitem_name = rs.getString(2);

dataItems.setDataDictionaryItem(dataitem_name, dataitem_code);

String group_code = rs.getString(3);

String group_name = rs.getString(4);

dataItems.setGroupCode(group_code);

dataItems.setGroupName(group_name);

}

}

}

catch(Exception ex)

{

ex.printStackTrace();

}

return dataItems;

}

第四步:提供数据字典项编码转换方法类:

(请参照二、在xml文件中定义的第四步)

四、进一步完善

1、两种方式都可以提供数据字典项维护界面,直接在维护界面上操作数据字典项,避免由于误操作导致xml文件或数据库数据错误。具体的实现也是比较简单,不再详细说明。

2、
使用数据库表方式时,如果想减少频繁查询数据库,可以将数据字典项信息在系统启动后第一次访问时加载内存中,如果数据字典项数据量比较大,可实现一自维护
线程,采用最近最少使用算法,将频繁使用的数据字典项驻留内存,将长期不用的数据字典项从内存中删除,每次自动检查内存中的数据字典项,如果存在则从内存
中读取,如果不存在则查询数据库,替换内存中最少使用的数据字典项。

3、增加运行日志记录,可以使用log4J来记录运行日志

时间: 2024-12-20 14:12:09

应用开发中数据字典项设计实现方案的相关文章

数据库开发中的一些设计以及命名规范

数据库开发中的一些设计以及命名规范 2011-03-21 13:41 大白鲨来了 博客 字号:T | T 数据库的开发涉及到很多方面的内容,本文将为大家介绍一部分,希望大家能从中收获您需要的. AD:51CTO 网+首届APP创新评选大赛火热启动——超百万资源等你拿! 之前已经为大家介绍了一部分有关数据库开发过程中规范,即数据库开发规范详细介绍(一),下文将继续为大家介绍更多有关数据库开发中的规范要求. 一. 其他设计 1.避免使用触发器 触发器的功能通常可以用其他方式实现.在调试程序时触发器可

面向对象开发中的七大设计原则和23种设计模式

一.面向对象开发中的七大设计原则 软件开发中最核心的思想就是"高内聚,低耦合",主要的目的也是为了方便后期的维护和变更.下面的设计原则也是依靠这个核心思想衍生出来的. 1.单一职责原则[SINGLE RESPONSIBILITY PRINCIPLE]:单一职责原则想表达的核心思想就是"高内聚",一个模块只完成一项功能.在面向对象设计中,一个类只应该负责一项职责,如果同时承担太多职责,就等于把这些职责耦合在了一起. 后面很可能因为某项职责的变更而导致其他职责的削弱或者

项目开发中自定义字段设计原则

在开发系统过程中,做到自定义字段策略设置,目前这种功能是很多系统的标准配置,这样子可以简化后续增加字段的难度,并对自定义字段做管理. 自定义字段功能要注意到以下几点: 1.批量规划好要自定义字段的数据表.2.对自定义字段存放的表字典表做设计3.对自定义字段做不同的属性设计4.自定义字段的扩展设计 1.明确是哪个表需要自定义字段.如果是开发一套易用的系统,做开发的时候对用到的主表做统一的自定义字段设计.这样子方便在以后的开发应用中直接操作自定义功能就能增加字段.很多程序员在初写程序的时候,增加字段

【游戏开发】浅谈游戏开发中常见的设计原则

俗话说得好:“设计模式,常读常新~”.的确,每读一遍设计模式都会有些新的体会和收获.马三不才,才读了两遍设计模式(还有一遍是在学校学的),属于菜鸟级别的.这次准备把阅读设计模式的想法记录下来,并且把设计模式应用在Unity游戏开发上,做些小案例. 什么是设计模式 每一种模式都在说明某种一再出现的问题,并描述解决方法的核心,之后让你能够举一反三,从而解决数个类似的问题.每一种设计模式除了按照“面向对象的设计原则”加以分析设计之外,还满足:”解决一再出现的问题“.”解决问题的方案和问题核心的关键点“

讨论Android开发中的MVC设计思想

最近闲着没事,总是想想做点什么.在时间空余之时给大家说说MVC设计思想在Android开发中的运用吧! MVC设计思想在Android开发中一直都是一套比较好的设计思想.很多APP的设计都是使用这套方案完成架构设计的. 谈到MVC我想分为以下几个点分点突进. 1.什么是MVC框架. 2.MVC如何工作 3.MVC的缺点 4.Android之MVC设计模式. 一.什么是MVC框架. MVC英文即Model-View-Controller,即把一个应用的输入.处理.输出流程按照Model.View.

Hibernate+Spring+Struts2整合开发中的一个分页显示方案(转载)

分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流. 1.DAO层接口的设计,在MemberDao接口中定义了如下两个方法: public interface MemberDao{        //省略了其他的代码        /**     * 分页查询     * @

多人语音直播系统开发中聊天室功能实现方案?

"直播+"不仅是视频.直播平台的尝试方向,也成为众多音乐平台的创新业务,而语音直播正是其中一种尝试.语音直播的用户更偏向年轻化,多为追求新鲜感的90后群体,他们有自己的行为处事方式,喜欢把孤独和无聊的时间用声音的方式宣泄.对于喜爱声音的这类群体来说,语音直播系统开发既保护了他们的隐私又让他们倍感亲切.那么从技术层面讲,多人语音直播系统开发中聊天室的功能实现需要特别注意哪些呢?一.语音直播系统开发的优势是什么?想必有人会问语音直播和传统的电台有什么不同呢?语音直播也有着自己的优势主要有以

软件项目开发中需求分析与设计时间和开发时间的比例分配的问题

从毕业到现在做开发已经有近7年了,大大小小的项目也经历了几十个了.在项目开发的过程中很少有项目在设计阶段投入很多时间的, 有很多情况下,甚至都没有怎么做设计就直接开始编码了,处于一种边开发边设计到状态,还有些时候,设计就是完成一些文档来应付下,很 少有认认真真做设计,然后就直接开始编码,如果遇到需求上问题,再确认.还有些时候,是一边确认需求,一边开始做原型,然后再进入开 发,这种方式倒是比较好,至少可以在前期发现很多问题,避免后续的重大问题出现的几率. 其实从我个人的角度来观察,很多时候我们重开

项目开发中关于权限的实现方案简单描述(帮助以后回忆)

最近一直在研究权限,今天终于把权限搞定了以后准备自己写个商城,对以后的帮助非常大的.下面简单谈谈关于权限的实现. 权限主要分为以下三个类: 用户.角色.权限表 权限主要分为三个步骤: 1.安装(初始化数据) 管理员:(超级管理员)一个拥有所有权限的用户,这个用户在程序安装时就要初始化, 权限数据:这个表主要存储权限的名字和url,这个权限主要有两个作用,一个是菜单的显示,其中一级菜单没有url只是分类的作用. 2.权限的分配: 权限的分配主要是针对某个角色和权限建立管理,权限表和角色表是多对多的