1. 程式人生 > >java web操作Access資料庫

java web操作Access資料庫

Microsoft Office Access是由微軟釋出的關係資料庫管理系統。它結合了 MicrosoftJet Database Engine 和 圖形使用者介面兩項特點,是 Microsoft Office 的系統程式之一。

JDK1.8增加了很多新特性,但不再包含access橋接驅動,因此在連線Access資料庫時有所變化[和JDK1.6相比]. 所以需要我們自己 建立連線方式

1、UCanAccess是一個純Java JDBC驅動程式,它允許我們在不使用ODBC的情況下讀取和寫入Access資料庫。它使用另外兩個軟體包JackcessHSQLDB來執行這些任務。以下是如何設定它的簡要概述。

選項1:使用Maven

如果您的專案使用Maven,則可以通過以下座標簡單包含UCanAccess:

groupId: net.sf.ucanaccess 

artifactId: ucanaccess

<dependency>
   <groupId>net.sf.ucanaccess</groupId>
   <artifactId>ucanaccess</artifactId>
   <version>4.0.4</version>
</dependency>

選項2:手動將JAR新增到您的專案中

如上所述,UCanAccess需要Jackcess和HSQLDB。

Jackcess又有它自己的依賴關係所以要使用UCanAccess,您需要包含以下元件:

UCanAccess(ucanaccess-xxxjar)
HSQLDB(hsqldb.jar,版本2.2.5或更新版本)
Jackcess(jackcess-2.xxjar)
commons-lang(commons-lang-2.6.jar或更新的2.x版本
commons-logging( commons-logging-1.1.1.jar或更新的1.x版本

幸運的是,UCanAccess在其分發檔案中包含了所有必需的JAR檔案。當你解壓縮它時,你會看到類似的東西

ucanaccess-4.0.1.jar  
  /lib/
    commons-lang-2.6.jar  
    commons-logging-1.1.1.jar  
    hsqldb.jar  
    jackcess-2.1.6.jar

您只需將所有五(5)個 JAR新增到您的專案中即可。

注意:不要loader/ucanload.jar,如果要新增其他五(5)JAR檔案到您的構建路徑。UcanloadDriver課程僅在特殊情況下使用,需要不同的設定。請參閱相關的答案在這裡瞭解詳情。

Eclipse:在Package Explorer中右鍵單擊專案並選擇Build Path > Configure Build Path...單擊“新增外部JAR ...”按鈕以新增五(5)個JAR中的每一個。當你完成你的Java Build Path應該看起來像這樣

BuildPath.png

NetBeans:展開專案的樹檢視,右鍵單擊“Libraries”資料夾並選擇“Add JAR / Folder ...”,然後瀏覽至JAR檔案。

nbAddJar.png

新增所有五(5)個JAR檔案後,“Libraries”資料夾應該如下所示:

nbLibraries.png

IntelliJ IDEA的:選擇File > Project Structure...主選單。在“庫”窗格中單擊“新增”(+)按鈕並新增五(5)個JAR檔案。一旦完成,該專案應該看起來像這樣:

IntelliJ.png

而已!

現在使用這樣的程式碼在.accdb和.mdb檔案中“U可以訪問”資料

// assumes...
//     import java.sql.*;
Connection conn=DriverManager.getConnection(
        "jdbc:ucanaccess://C:/__tmp/test/zzz.accdb");
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("SELECT [LastName] FROM [Clients]");
while (rs.next()) {
    System.out.println(rs.getString(1));
}
2、詳細的解決方案
  • 1. 在ClassPath下存一個空的blank.mdb. (也就是在你的專案中包含一個空白的.mdb檔案)
  • 2. 將專案中的blank.mdb另存到新的路徑. (可能是使用者選擇要匯出mdb檔案的儲存路徑)

    程式碼

public class AccessUtil {
    private Connection connection;
private Statement statement;
// 需要儲存到的新的mdb檔案路徑和名
private String savedMdbFilePathAndName = defaultSavedMdbFilePath + defaultSavedMdbFileName;
// 新mdb檔案路徑
public static final String defaultSavedMdbFilePath = "C://";
// 新mdb檔名
public static final String defaultSavedMdbFileName = "data.mdb";
// 標準的單件模式
private static AccessUtil instance = new AccessUtil();
private AccessUtil() {
    }
    public static AccessUtil getInstance() {
        return instance;
}
    /**
     *
     Description: 設定待儲存的新的mdb檔案路徑和名
     */
public void setSavedFilePathAndName(String newFilePathAndName) {
        this.savedMdbFilePathAndName = newFilePathAndName;
}
    /**
     *
     Description: 刪除已經存在的mdb檔案
     */
public void deleteOldMdbFile() throws Exception {
        File oldTargetFile = new File(savedMdbFilePathAndName);
if (oldTargetFile.exists()) {
            oldTargetFile.delete();
}
    }
    /**
     *
     Description: 將空白mdb檔案拷貝到特定目錄
     */
public void copyBlankMdbFile() throws Exception {
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("static/ERPDATA.mdb");
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: 開啟對mdb檔案的jdbc-odbc連線
     */
public void connetAccessDB() throws Exception {
        /*Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + savedMdbFilePathAndName.trim() + ";DriverID=22;READONLY=true}";
        connection = DriverManager.getConnection(database, "", "");*/
connection=DriverManager.getConnection(
                "jdbc:ucanaccess://D:/data.mdb");
statement = connection.createStatement();
/*ResultSet rs = statement.executeQuery("SELECT  [DATA1] FROM [TABLE]");
        while (rs.next()) {
            System.out.println(rs.getString(1));
        }*/
}
    /**
     *
     Description: 執行特定sql語句
     */
public void executeSql(String sql) throws Exception {
         statement.execute(sql);
}
    /**
     *
     Description: 關閉連線
     */
public void closeConnection() throws Exception {
        statement.close();
connection.close();
}




}

測試類

public class Test {
    public static void main(String[] args) {
        AccessUtil accessUtil = AccessUtil.getInstance();
accessUtil.setSavedFilePathAndName("D://data.mdb");
try {
            accessUtil.copyBlankMdbFile();
} catch (Exception e) {
            e.printStackTrace();
}
        try {
            accessUtil.connetAccessDB();
} catch (Exception e) {
            e.printStackTrace();
}
        try {
            accessUtil.executeSql("INSERT INTO [TABLE] ([DATA1],[DATA2],[DATA3]) VALUES('1','2','3')");
} catch (Exception e) {
            e.printStackTrace();
}
        try {
            accessUtil.closeConnection();
} catch (Exception e) {
            e.printStackTrace();
}

    }
}

如果你是Maven專案 記得新增上面的依賴

如果不是的話,記得手動匯入jar包