博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JDBC ORACLE 动态获得表名列名并进行字典表加载
阅读量:6220 次
发布时间:2019-06-21

本文共 2543 字,大约阅读时间需要 8 分钟。

  hot3.png

最近项目需要做一个字典表加载的模块,一开始就将一些不会变更的东西加载到内存当中以便存放,一开始进行程序开发的时候采用的是每一张字典表逐步加载的方式来进行的,当字典表的数量还算稀少的时候,运用这种方法简单明了,但是一旦字典表的数量激增,使用这种方式可维护性就太差了。后来跟项目组讨论过后因为字典表的命名很规范也有一定的规律可行,所以就采用批量处理的方式来进行字典表的加载。

下面说一下我们字典表的命名规范,表名称一律以 _DICT 结尾,字典列名字典键KEY 使用 _CODE 进行结尾,字典列名值 VALUE 使用 _NAME 进行结尾,比如性别表的建表语句如下

/*==============================================================*//* Table: MDM_SEX_DICT                                          *//*==============================================================*/CREATE TABLE MDM_SEX_DICT (   SEX_CODE             VARCHAR2(2)          NOT NULL,   SEX_NAME             VARCHAR2(2),   CONSTRAINT PK_MDM_SEX_DICT PRIMARY KEY (SEX_CODE));

所以根据如上的规律我们便有了采用批量处理的前提,如何不能保证有相应的规律可行的话,维护这些字典表会是一项不可能完成的任务。

基本思路是这样的

S1 查询用户所有后缀为 DICT 的表名称

S2 遍历所有表名称,将每一张表的列名查询出来

S3 根据列名将表当中的数据提取出来放入 MAP 当中,KEY 为 CODE 值,VALUE 为 NAME 值

S4 再以 TABLENAME 为 KEY ,字典 MAP 为 VALUE 存入 一张大MAP 当中

代码如下:

/** * 初始化方法,加载所有字典表 * hashmap
> */private static void init(){ Connection conn=null; try{ conn=dataSource.getConnection(); ResultSet rs=conn.createStatement().executeQuery(" SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE '%DICT'"); while(rs.next()){ String tableName = rs.getString("TABLE_NAME"); //根据 TABLENAME 查询相关的列名称 String codeSql = "select COLUMN_NAME from user_tab_columns where table_name = '" + tableName + "' and COLUMN_NAME like '%_CODE'"; String nameSql = "select COLUMN_NAME from user_tab_columns where table_name = '" + tableName + "' and COLUMN_NAME like '%_NAME'"; String codeParam = ""; String nameParam = ""; ResultSet columnRs=conn.createStatement().executeQuery(codeSql); ResultSet nameRs=conn.createStatement().executeQuery(nameSql); while(columnRs.next()){ codeParam = columnRs.getString("COLUMN_NAME"); } while(nameRs.next()){ nameParam = nameRs.getString("COLUMN_NAME"); } //根据列名称进行 SQL 拼接查询相应的字典表,并将相应的字典表存入 singleDicMap中 ConcurrentHashMap
singleDicMap = new ConcurrentHashMap
(200,.75f); String dictSql = "select " + codeParam + "," + nameParam + " from " + tableName; ResultSet dictRs=conn.createStatement().executeQuery(dictSql); while(dictRs.next()){ singleDicMap.put(dictRs.getString(codeParam), dictRs.getString(nameParam)); } //最后将 singleDicMap 再放到相应表名称对应的 MAP 当中 dictsMap.put(tableName, singleDicMap); } }catch (Exception e) { e.printStackTrace(); }finally{ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } }}

转载于:https://my.oschina.net/sanji/blog/176094

你可能感兴趣的文章
JQuery Easy Ui dataGrid 数据表格
查看>>
利用kseq.h parse fasta/fastq 文件
查看>>
LabVIEW串口通信
查看>>
JavaScript变量和作用域
查看>>
深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)
查看>>
ConEmu配置task的脚本
查看>>
iOS——多线程编程详细解析
查看>>
MySQL mysqlbinlog解析出的SQL语句被注释是怎么回事
查看>>
JAVA中String.format的用法 转16进制,还可以补0
查看>>
.NET Core的依赖注入[1]: 控制反转
查看>>
hive 提取用户第一次浏览/购买 某商品的 时间
查看>>
[ARCH] 1、virtualbox中安装archlinux+i3桌面,并做简单美化
查看>>
MVVM模式下关闭窗口的实现
查看>>
程序员晋级CTO之路的8大准则
查看>>
linux curl 命令详解,以及实例
查看>>
CentOS7 下 keepalived 的安装和配置
查看>>
R绘图 第七篇:绘制条形图(ggplot2)
查看>>
Perl输出复杂数据结构:Data::Dumper,Data::Dump,Data::Printer
查看>>
安装Cloudera manager Server步骤详解
查看>>
Windows 10原版ISO下载地址(持续更新)
查看>>