任何应用程序、系统的数据库中或多或少都会有一些静态表用来存放系统中一些默认的值,比如说界面上的一些field信息、一些数据模板、界面上的选项设置等等。我们不可能把这些东西都hard code到代码中去,所以必然需要这些静态的数据表来存放这些信息。
可能你会觉得手动去维护这些静态表就挺好,但是我认为在任何情况下我们都不应该手动的去修改数据库中的数据,这样可能会导致脏数据或者其他未知问题。设想一下,如果你的系统有开发和测试两个数据库,又同时需要支持SQL-SERVER和ORACLE两种数据库,那么你就需要维护四个数据库,当数据库数量增加手动维护明显是不可能的一件事情。
我认为可以通过将静态数据表中的数据保存在一些文件中,然后通过一些工具将这些文件导入到各个数据库中,同时还可以将这些文件放在版本控制库里,这样就可以追踪到每一个对静态表的修改。我设想了一下这个简单的模型。
如上图所示,更新工具去读配置文件,然后根据配置文件将静态表文件中的数据更新到指定的一些数据库中去。静态表文件中包含了静态表的一些基本数据,数据库配置包含了一些数据库的链接信息。而配置文件则是关键,它包含了一些静态表文件和数据库配置文件,同时也应该包含静态表文件与数据库中表的映射关系。
我觉得通过这种方式可以比较好的控制数据库中静态表,如果是应用程序,在部署的时候只要配置一些数据库和数据库文件,应该就能很快的将静态数据导入数据库表。
下面就一个web应用中的相关案例记录:
1、这里是通过一个类文件保存相关程序使用到得常量:
package com.xiaoli.util;
public final class ActionUrlManage {
//公共action
public final static String COM_LOGOUT="logout.action";
public final static String COM_LOGIN="login.action";
public final static String COM_PAGEREDIRECT="pageRedirect.action";
普通用户,按权限分类,以便权限过滤器处理
///
//普通用户公用
public final static String COM_GETMEETINROOMSGRESOURCE = "getMeetingRoomsResource.action";//获取会议室资源
//我的会议
public final static String APP_GETUSERMEETINGS = "getUsermeetings.action";//获取个人申请的会议
//会议审核
public final static String Audit_GETUSERMEETINGS="getUserMeetings.action";//获取个人将要审核的会议
//会议维护
public final static String MAIN_GETCONFLEVEL="getConfLevel.action";//获取会议的级别
//会议统计
public final static String COUNT_GETMEETINGCOUNTS="getMeetingCounts.action";//获取会议统计
//会议准备
public final static String PRE_GETALLPREMEETINGS="getAllPreMeetings.action"; //获取所有要准备的会议
}
2、通过一个服务器启动时自动执行的servlet将常量配置写入相应数据库或文件(以下是写入文件):
package com.xiaoli.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.lang.reflect.Field; import java.util.Locale; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; public class CreateActionJS extends HttpServlet{ /** * */ private static final long serialVersionUID = 1L; public void init() throws ServletException { new ActionQuanXian(); createFile(Locale.CHINA); } public void createFile(Locale local){ File file_com = new File(this.getServletContext().getRealPath("/") + ".//inc//hidden_com.js"); File file_os = new File(this.getServletContext().getRealPath("/") + ".//inc//hidden_os.js"); File file_org = new File(this.getServletContext().getRealPath("/") + ".//inc//hidden_org.js"); File file_ord = new File(this.getServletContext().getRealPath("/") + ".//inc//hidden_ord.js"); if(file_com.exists()){ file_com.delete(); } if(file_os.exists()){ file_os.delete(); } if(file_org.exists()){ file_org.delete(); } if(file_org.exists()){ file_ord.delete(); } StringBuilder sb_com = new StringBuilder(); StringBuilder sb_os = new StringBuilder(); StringBuilder sb_org = new StringBuilder(); StringBuilder sb_ord = new StringBuilder(); try { file_com.createNewFile();//创建文件 Class<ActionUrlManage> c=ActionUrlManage.class; Field[] fs=c.getFields(); for (int i = 0; i < fs.length; i++) { try { String v = (String) fs[i].get(fs[i].getName()); if(fs[i].getName().startsWith("COM")){ sb_com.append(" var "+fs[i].getName()+" = '"+v+"';\n"); }else if(fs[i].getName().startsWith("OS")){ sb_os.append(" var "+fs[i].getName()+" = '"+v+"';\n"); }else if(fs[i].getName().startsWith("ORG")){ sb_org.append(" var "+fs[i].getName()+" = '"+v+"';\n"); }else if(fs[i].getName().startsWith("ORD")){ sb_ord.append(" var "+fs[i].getName()+" = '"+v+"';\n"); } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } OutputStreamWriter printStream_com = new OutputStreamWriter(new FileOutputStream(file_com),Function.getPageEncoding()); OutputStreamWriter printStream_os = new OutputStreamWriter(new FileOutputStream(file_os),Function.getPageEncoding()); OutputStreamWriter printStream_org = new OutputStreamWriter(new FileOutputStream(file_org),Function.getPageEncoding()); OutputStreamWriter printStream_ord = new OutputStreamWriter(new FileOutputStream(file_ord),Function.getPageEncoding()); printStream_com.write(sb_com.toString()); printStream_os.write(sb_os.toString()); printStream_org.write(sb_org.toString()); printStream_ord.write(sb_ord.toString()); printStream_com.close(); printStream_os.close(); printStream_org.close(); printStream_ord.close(); } catch (IOException e) { e.printStackTrace(); }finally{ } } }
也可以写入数据库中静态表记录,以后程序中也可以使用静态表中使所有操作一致