java odbc 实现access连接并导出mdb格式文件
文章目錄
- 一、前言
- 二、概述
- 三、具體實現
- 1、思路
- 2、access數據庫連接
- 3、環境搭建(如果jdk版本低于8,可以直接跳過)
- 4、代碼
- 四、總結
一、前言
知識是偉大的,奉獻知識的人更是偉大的!
java生成Access數據庫文件
https://community.yellowfinbi.com/knowledge-base/article/moving-the-jdbc-odbc-bridge-from-java-7-to-java-8
java連接access數據庫的三種方式
從以上博客中深受啟發。
二、概述
|配置|版本|
| 系統 | win10 |
| access | access 97 |
| jdk | jdk8 |
三、具體實現
1、思路
大致思路如下:
- 導出模板:服務端必須存在一個空白的access數據庫mdb格式文件(且該文件必須在本機上可以打開,總結里會提到)
- 服務器將mdb模板復制到本地指定的某個路徑下,如C:\data.mdb(作為數據庫/源)
- 當前端用戶發起請求后,后臺從postgre數據庫中獲取相應的數據保存到內存
- 代碼嘗試連接該數據庫,然后將內存中的數據添加到數據庫中
- 讀取寫完之后的data.mdb文件,返回給前端進行下載
2、access數據庫連接
要實現將數據寫到mdb文件中,與word、pdf或者txt文件格式不同,mdb本身是數據格式文件,其中包括有access數據庫的模式、表格、字段等格式限制,需要根據相對應的字段來填入相應的數據。所以我們應該如使用oracle、mysql或者postgre一樣,使用sql語言來進行操作。
- 連接access數據庫,網上的內容有很多,但是都比較雜亂,不具有針對性。沒有特別細致的介紹,所以筆者打通了其中一種方法,供后來者參考。
- 現在網上存在的三種方法分別如下:
① 電腦配置數據源結合java實現
② 純java代碼實現
③ 使用RmiJdbc.jar(遠程連接的方法)
本文主要針對第二種方法進行實現。
3、環境搭建(如果jdk版本低于8,可以直接跳過)
要通過JDBC-ODBC橋接器的方式,連接access數據庫只能使用jdk1.8以下的版本,因為JDK1.8已經在JDK包里去除了這個類,所以系統找不到該類,將會出現以下錯誤。
但是如果要將jdk版本還原到1.7版本,顯然是不可能的。
幸運的是,我們找到了解決辦法
其中的jdbc.jar包,可以到網上下載,亦或使用Tomcat中lib文件中的jdbc.jar包,其實是一樣的。
環境配置好之后,剩下的就是擼代碼了!!!!
4、代碼
可以將與access數據庫的連接封裝成一個工具類,方便后期調用。
/*** @Description:Access數據庫連接類* @author:Yex* @data: 2019年12月9日 下午2:53:36*/ class ConnectionAccessDB {private static Connection connection = null; private static java.sql.Statement statement;private static String blankMdbFilePath; //空白mdb文件路徑// 新mdb文件路徑 public static String defaultSavedMdbFilePath = "C:\\data.mdb"; // 新mdb文件名 //public static final String defaultSavedMdbFileName = "data.mdb"; // mdb文件后綴 public static final String defaultSavedMdbFileExtension = ".mdb"; // 需要保存到的新的mdb文件路徑和名 private static String savedMdbFilePathAndName = defaultSavedMdbFilePath; public ConnectionAccessDB() {}public ConnectionAccessDB(String blankMdbFilePath) {this.blankMdbFilePath = blankMdbFilePath;}public ConnectionAccessDB(String blankMdbFilePath, String defaultSaveMdbFilePath) {this.blankMdbFilePath = blankMdbFilePath;this.defaultSavedMdbFilePath = defaultSaveMdbFilePath;}/*** 外部連接數據庫* @throws SQLException */public Connection connected() throws SQLException{try {//獲取xml配置數據庫連接屬性Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //+ ";DriverID=22;READONLY=true}"String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + savedMdbFilePathAndName.trim() ; Properties pro = new Properties(); pro.setProperty("charSet","GB2312"); connection = DriverManager.getConnection(database, pro); statement = connection.createStatement(); } catch (ClassNotFoundException e) {e.printStackTrace();}return connection;}/*** @Description: 設置需要拷貝空白mdb所到的文件位置和名稱* @author: Yex* @date: 2019年12月9日 下午2:49:43*/public void setSavedFilePathAndName(String newFilePathAndName) { this.savedMdbFilePathAndName = newFilePathAndName; } /*** @Description: 刪除產生的文件* @author: Yex* @date: 2019年12月9日 下午2:50:36*/public void deleteOldMdbFile() throws Exception { File oldTargetFile = new File(savedMdbFilePathAndName); if (oldTargetFile.exists()) { oldTargetFile.delete(); } } /*** @Description: 將空白路徑 拷貝到 指定的特定路徑下,并作為數據源* @author: Yex* @date: 2019年12月9日 下午2:52:26*/public void copyBlankMdbFile() throws Exception { FileInputStream is = new FileInputStream(blankMdbFilePath);OutputStream out = new FileOutputStream(savedMdbFilePathAndName); byte[] buffer = new byte[1024]; int numRead; while ((numRead = is.read(buffer)) != -1) { out.write(buffer, 0, numRead); } is.close(); out.close(); }/*** @Description: 執行sql語句* @author: Yex* @date: 2019年12月9日 下午2:52:50*/public void executeSql(String sql) throws Exception { statement.execute(sql); } /*** @Description: 關閉連接* @author: Yex* @date: 2019年12月9日 下午2:53:05*/public void closeConnection() throws Exception { statement.close(); connection.close(); } /*** @Description: 數據庫-插入語句* @author: Yex* @data: 2019年12月10日 下午3:54:35*/public void Insert(String tableName,String column, String values) throws SQLException {String sql = "INSERT INTO " + tableName + " (" + column + ")" + " values" + "(" + values + ")";statement.execute(sql);}/*** @Description: 數據庫-刪除語句* @author: Yex* @data: 2019年12月10日 下午4:02:42*/public void Delete(String tableName, String condition) throws SQLException {String sql = "DELETE FROM " + tableName + " WHERE" + condition;statement.execute(sql);} }注意!!!!!!!!!!!!!!!!!
- 主要與access連接的代碼是:
Driver={Microsoft Access Driver (*.mdb, .accdb)}就是你的驅動名稱,這個必須和你本地所存在的驅動對應起來,是同一個東西。
其中,.mdb, *.accdb中逗號后面必須帶有空格!!!!!!!!!!
DBQ=數據庫文件名稱。
如果本地不存在上述驅動,那么會報錯 *[Microsoft][ODBC 驅動程序管理器] 未發現數據源名稱并且未指定默認驅動程序時。
查看系統數據源: 搜索 “管理工具” -> 進入 ODBC數據源 ->系統DSN -> 添加
理應如圖所示,如果彈出的頁面中無法找到數據源,請使用 AccessDatabaseEngine試試。
四、總結
由于項目要求,導出的格式必須為access97版本的數據庫格式,但是access 97版本的文件只有03年以前的office版本才能打開,其他任何版本的access均會提示“access無法打開應用程序較早版本”,所以導致java代碼也無法正常連接access數據庫。最后筆者忍痛下載了office 2000。如果對導出的數據庫版本沒有要求,應該不會存在該問題。
總結
以上是生活随笔為你收集整理的java odbc 实现access连接并导出mdb格式文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python统计套利_基于python的
- 下一篇: 公共基础知识:生活常识之垃圾分类