最近项目需要做一个字典表加载的模块,一开始就将一些不会变更的东西加载到内存当中以便存放,一开始进行程序开发的时候采用的是每一张字典表逐步加载的方式来进行的,当字典表的数量还算稀少的时候,运用这种方法简单明了,但是一旦字典表的数量激增,使用这种方式可维护性就太差了。后来跟项目组讨论过后因为字典表的命名很规范也有一定的规律可行,所以就采用批量处理的方式来进行字典表的加载。
下面说一下我们字典表的命名规范,表名称一律以 _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<tb_name,hashmap<code,name>>
*/
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<String,String> singleDicMap = new ConcurrentHashMap<String,String>(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();
}
}
}