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

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



在应用开发中,总会遇到许多数据字典项,比如对象状态、对象类型等等,这些项一般都是固定的若干可选值选项,比如对象状态可能有新建、修改、删除等状态,这些数据字典项一旦定义完毕改动的频率非常低;在应用开发中,为了处理方便,一般要对这些数据字典项值选项进行数字编码(例如: 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来记录运行日志
深入解析“PROJ: proj_create_from_database: Cannot find proj.db”错误:从环境配置到打包实战 本文深入解析了“PROJ: proj_create_from_database: Cannot find proj.db”错误的根源与解决方案,涵盖环境配置、PyInstaller打包及跨平台兼容性处理。通过详细分析PROJ库路径问题及GDAL依赖关系,提供动态路径设置、资源文件打包等实战技巧,帮助开发者高效解决地理数据处理中的常见错误。 阅读详情

相关推荐

DDoS攻击--Syn_Ack/Ack_Flood等攻击防护详解(TCP)

前言 Syn_Ack/Ack_Flood攻击属于TCP攻击,在了解Syn_Ack/Ack_Flood攻击之前,可以先看看TCP攻击详解。 Syn_Ack Flood 攻击: syn_ack报文出现在连接建立的第2个报文,用来确认第一次握手的syn包。 当服务器收到syn_ack报文后会在系统里查询是否属于3次握手的范畴。如果属于则回复ack,并将连接设为连接状态。若没有查到相关信息,则回复...

一只IT小小鸟 1万+

springboot 数据字典设计思路:字典表+字典枚举 两者兼故方案

springboot 数据字典设计思路:字典表+字典枚举 两者兼故方案,查询返回结果在controller方法上添加注解进行字典翻译

mxskymx的专栏 9619

第八篇 永磁同步电机控制-MTPA、MTPV

MTPA 的全称是 Maximum Torque Per Ampere,即 最大转矩电流比控制。核心思想:在输出特定转矩时,通过控制定子电流的幅值和相位(即d轴和q轴电流的分量),使得所需要的定子电流幅值最小。通俗理解:就是用“最省电”的方式产生所需要的力矩。就像开车时,找到一个最合适的油门和档位配合,使得在输出相同动力时,油耗最低。

深耕汽车电子:AUTOSAR、电机控制,助力数字汽车 1874

数据库设计之数据字典的使用与设计

如何使用数据字典 使用场景 : 在平时开发的过程中,特别是在遇到表单时候,我们经常需要为前端提供一些下拉选项的信息,这时候我们需要为前端提供下拉菜单的信息,让前端进行渲染。同时我们在数据库中存储的只可能是对应的编码,例子如下: 这里我们可以看到在搜索栏中,有一个下拉菜单。如果前端直接将value值写死在前端代码中,那么就破坏了低耦合原则,如果未来清查状态有增加或者管理员想要修改,那么需要修改前端代码,会带来非常大的麻烦 解决方案 : 简单解决: 对字段值比较稳定,不存在比较大的变动,同时对应的分

weixin_43180484的博客 4万+

基于AutoDL复现A-LOAM

Ceres solver 是谷歌开发的一款用于非线性优化的库,在谷歌的开源激光雷达slam项目cartographer中被大量使用。在autodl上面租服务器,地区我租的重庆A区的,GPU我选择的是RTX4090,基础镜像选择的是Miniconda / conda3 / 3.8(ubuntu20.04)/11.6。在AutoDL中我使用的方式是先将该数据集先下载到自己的电脑上,然后再上传到虚拟机中。用MobaXterm解决该问题!搜到的一个解决方式:该问题属于ceres版本问题,将A-LOAM下的。

m0_61281610的博客 1943

自适应粒子群优化(Adaptive Particle Swarm Optimization,APSO

下面是一个关于自适应粒子群优化(Adaptive Particle Swarm Optimization,APSO)的博客,希望可以帮助您。提示:以下是本篇文章正文内容,下面案例可供参考在上面的代码中,表示粒子的数量,表示解空间的维度,表示迭代次数,表示优化的目标函数。在__init__方法中,我们初始化了粒子群的位置和速度,并将每个粒子的位置作为其最优解,将其适应度值初始化为正无穷。我们还初始化了学习因子和惯性权重的参数。在run方法中,我们迭代了次,计算每个粒子的适应度值和最优解。

weixin_52026057的博客 9916

关于数据字典的理解与设计

数据字典 数据字典是一种通用的程序设计方法。可以认为,不论什么程序,都是为了处理一定的主体,这里的主体可能是人员、商品(超子)、网页、接口、数据库表、甚至需求分析等等。当主体有很多的属性,每种属性有很多的取值,而且属性的数量和属性取值的数量是不断变化的,特别是当这些数量的变化很快时,就应该考虑引入数据字典的设计方法。 数据字典有两种形式 一、把主体的属性代码化放入独立的表中,不是和主体放在一起,主体中只保留属性的代码。这里属性的数量是不变的...

D先生的博客 4977

关于示波器测485串口波特率的使用方法总结

之前没有用过示波器,更不知道怎么来测试串口的波特率,结果遇到一客户说我们产品的波特率达不到9600,只有9100,为了验证这一说法,我们只能自己测试一下。说明:产品通过485接电脑,用串口调试助手接收都是没有问题的,用客户的设备接收就有问题。 下面说一下示波器测波特率的方法步骤: 显示高低跳变的情况: 1.先把示波器表笔的地线(夹子)夹485B,表笔夹485A。 2.往串口发送数据:如发送

lianxue1986的专栏 3万+

设计 - 数据字典

文档分类 写文档目的 你有没有遇到过开晨会、周会的时候某个问题已经讨论的很清晰。 但是几天后或者临近周末的时候再说这个问题的时候,团队中有的童鞋会说:“我不知道,没有说过这个问题或者这个方案”,因此而造成的BB事很伤神费心。 为了避免出现问题后的瞎 BB,特需要形成文字记录下来。 1)、好记忆不如烂笔头,我们讨论很好的方案,有时候只是灵光一闪,尽快记录下来会留住灵感。 2)、追根溯源。口头开会的时候,大家各抒己见,貌似已经讨论出方案。但实际每个人的理解各有不同,会后及时形成文档...

猫猫聚会ing ~ 的 博客 4885

DisplayPort 1.4扰码原理与16位并行LFSR实现

DisplayPort物理层信号完整性依赖于数据扰码技术,其本质是通过线性反馈移位寄存器(LFSR)对传输数据进行伪随机化处理,以改善频谱分布、抑制低频能量堆积、提升时钟恢复能力并降低EMI辐射。该技术广泛应用于高速串行接口如DP、PCIe和USB,核心在于确定性伪随机序列生成与收发端同步。DisplayPort 1.4强制要求符合ANSI X3.230标准的16级LFSR,并在8b/10b编码后执行扰码;而传统串行实现难以满足21.6Gbps速率下的时序约束,必须采用并行展开结构——将16拍移位压缩为单周

weixin_29192211的博客 313

华为面试手撕真题【判断是ipv4还是ipv6地址】

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。

MISAYAONE的博客 1万+

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

应用开发中数据字典项设计实现方案在 应用开发中,总会遇到许多数据字典项,比如对象状态、对象类型等等,这些项一般都是固定的若干可选值选项,比如对象状态可能有新建、修改、删除等状态,这 些数据字典项一旦定义完毕改动的频率非常低;在应用开发中,为了处理方便,一般要对这些数据字典项值选项进行数字编码(例如:0表示新建,1表示修改,2表示删除等),以方便应用程序中使用。而UI显示对象信息时不能显示对象状态等...

weixin_35554273的博客 4116

高通SDX55平台:5G速率问题排查分析方法

和大家分享一下高通5G平台5G速率问题排查分析方法。

四儿家的小祖宗的博客 5220

数据字典项设计实现方案

最近被安排做数据字典的设计,本人一头雾水啊,没弄过啊,网上搜索一下,这个老兄写的很好,原文链接:http://blog.youkuaiyun.com/stevene/article/details/575142?reload 在应用开发中,总会遇到许多数据字典项,比如对象状态、对象类型等等,这些项一般都是固定的若干可选值选项,比如对象状态可能有新建、修改、删除等状态,这些数据字典项一旦定义完毕改动的频率

leo_pcx 2万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数据字典项 设计实现方案

最近被安排做数据字典的设计,本人一头雾水啊,没弄过啊,网上搜索一下,这个老兄写的很好,原文链接:http://blog.youkuaiyun.com/stevene/article/details/575142?reload 在应用开发中,总会遇到许多数据字典项,比如对象状态、对象类型等等,这些项一般都是固定的若干可选值选项,比如对象状态可能有新建、修改、删除等状态,这些数据字典项一旦定义完毕改动的频率

星空之旅1995 1718

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数据字典项实现方案

在应用开发中,总会遇到许多数据字典项,比如对象状态、对象类型等等,这些项一般都是固定的若干可选值选项,比如对象状态可能有新建、修改、删除等状态,这些数据字典项一旦定义完毕改动的频率非常低...

XMEHB的博客 257

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数据字典设计

在应用开发中,总会遇到许多数据字典项,比如对象状态、对象类型等等,这些项一般都是固定的若干可选值选项,比如对象状态可能有新建、修改、删除等状态,这些数据字典项一旦定义完毕改动的频率非常低;在应用开发中,为了处理方便,一般要对这些数据字典项值选项进行数字编码(例如: 0表示新建,1表示修改,2表示删除等),以方便应用程序中使用。而UI显示对象信息时不能显示对象状态等的编码,对于编码值设计人员知道代表什么意思,但用户就不明白了,所以需要进行编码转换,从编码转换为文字描述(名称),也就是需要把状态编码0转换为“新

追风天涯的博客 2万+
上一篇: 常用正则表达式
下一篇: Selenium 中文API
junjunbest
博客等级 码龄19年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值