java生成Access数据库文件

  • 近日为客户做了一个将当前数据导出到桌面access数据库的功能
  • 思路是这样的:
  • 当客户端选中需要导出的数据发送到服务端
  • 服务端要有一个空白的access数据库,我将这个数据库名称定义为temp.mdb
  • 当服务端接收到请求的时候将这个temp.mdb复制到我指定的一个文件夹路径,复制后的名字使用当前的日期“年月日时分秒”例如:“20110628141646239.mdb”
  • 在这个20110628141646239.mdb文件中创建一个表
  • 向这个表中插入数据
  • 将插入数据后的文件发送到客户端,提示下载

下面的是我参考的一个方法:

  • 1. 在ClassPath下存一个空的blank.mdb. (也就是在你的项目中包含一个空白的.mdb文件)
  • 2. 将项目中的blank.mdb另存到新的路径. (可能是用户选择要导出mdb文件的保存路径)
  • 3. 将.mdb作为数据源, 用JDBC ODBC添加数据. 注: jdbc-odbc 在jre中是有的jre/lib/rt.jar. 也就是不需要引入额外的jar包.




注:



  • 步骤3中, 你可以执行CREATE Table的SQL语句.
  • 如果你已经知道了DB的SCHEMA, 那更简单了, 你直接在你的项目中包含一个带有SCHEMA的空的.mdb文件, 这样在步骤3的时候, 不需要再做表结构的创建, 只需要做数据插入即可.



Java代码



        publicclassAccessUtil {   

1.    privateConnection connection;   
2.    privateStatement statement;   
3.       
4.    // 空白mdb文件路径. 直接保存在src/cn/iwoo/dataexport/common/下.  
5.    privatefinalString blankMdbFilePath = "cn/iwoo/dataexport/common/";   
6.    // 空白mdb文件名  
7.    privatefinalString blankMdbFileName = "blank.mdb";   
8.    // 需要保存到的新的mdb文件路径和名  
9.    privateString savedMdbFilePathAndName = defaultSavedMdbFilePath + defaultSavedMdbFileName;   
10.    // 新mdb文件路径  
11.    publicstaticfinalString defaultSavedMdbFilePath = "C://";   
12.    // 新mdb文件名  
13.    publicstaticfinalString defaultSavedMdbFileName = "data.mdb";   
14.    // mdb文件后缀  
15.    publicstaticfinalString defaultSavedMdbFileExtension = ".mdb";   
16.       
17.    // 标准的单件模式  
18.    privatestaticAccessUtil instance = newAccessUtil();   
19.    privateAccessUtil() {   
20.    }   
21.    publicstaticAccessUtil getInstance() {   
22.        returninstance;   
23.    }   
24.       
25.       
26.     
27.    publicvoidsetSavedFilePathAndName(String newFilePathAndName) {   
28.        this.savedMdbFilePathAndName = newFilePathAndName;   
29.    }   
30.       
31.     
32.    publicvoiddeleteOldMdbFile() throwsException {   
33.        File oldTargetFile = newFile(savedMdbFilePathAndName);   
34.        if(oldTargetFile.exists()) {   
35.            oldTargetFile.delete();   
36.        }   
37.    }   
38.  
39.     
40.    publicvoidcopyBlankMdbFile() throwsException {   
41.        InputStream is = this.getClass().getClassLoader().getResourceAsStream(blankMdbFilePath + blankMdbFileName);   
42.        OutputStream out = newFileOutputStream(savedMdbFilePathAndName);   
43.        byte[] buffer = newbyte[1024];   
44.        intnumRead;   
45.        while((numRead = is.read(buffer)) != -1) {   
46.            out.write(buffer, 0, numRead);   
47.        }   
48.        is.close();   
49.        out.close();   
50.    }   
51.  
52.     
53.    publicvoidconnetAccessDB() throwsException {   
54.        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");   
55.        String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="+ savedMdbFilePathAndName.trim() + ";DriverID=22;READONLY=true}";   
56.        connection = DriverManager.getConnection(database, "", "");   
57.        statement = connection.createStatement();   
58.    }   
59.  
60.     
61.    privatevoidexecuteSql(String sql) throwsException {   
62.        statement.execute(sql);   
63.    }   
64.  
65.     
66.    publicvoidcloseConnection() throwsException {   
67.        statement.close();   
68.        connection.close();   
69.    }   
70.  
71. }


当然,最后我在将我事先准备好的mdb文件copy到我指定的文件夹的时候我用的是自己写的方法

**
   * 将一个空白的文件拷贝到指定的目录文件夹
   *
   * @param fileFrom空白文件的绝对路径
   * @param fileTo将文件复制到位置的绝对路径
   * @return
   */
 public static boolean copy(String fileFrom, String fileTo) {
   try {
    FileInputStream in = new FileInputStream(fileFrom);
    FileOutputStream out = new FileOutputStream(fileTo);
    byte[] bt = new byte[20480];
    int count;
    while ((count = in.read(bt)) > 0) {
     out.write(bt, 0, count);
    }
    in.close();
    out.close();
    return true;
   } catch (IOException ex) {
    return false;
   }
  }