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;
}
}