在没有ODBC的情况下从Java操作Access数据库

时间:2014-02-22 13:55:32

标签: java ms-access ucanaccess

我想从我的Java项目中操作Microsoft Access数据库(.accdb或.mdb文件)。我不想使用Microsoft的JDBC-ODBC Bridge和Access ODBC驱动程序,因为:

  • JDBC-ODBC Bridge已从Java SE 8中删除且不受支持(参考:here),
  • 当文本包含代码点高于U + 00FF(ref:here)的Unicode字符时,JDBC-ODBC Bridge无法与Access ODBC驱动程序一起正常工作,因此这样的设置将无法处理字符如希腊语,俄语,中文,阿拉伯语等,
  • Microsoft的Access ODBC驱动程序仅适用于Windows,
  • 存在单独的32位和64位版本的Access数据库引擎(和ODBC驱动程序),这可能会对部署造成麻烦。

我看到其他答案提到名为UCanAccess的Access数据库的JDBC驱动程序。如何设置我的Java项目以使用此方法?

(答案表明,从Java开始使用Access数据库的更好方法也是最受欢迎的。)

1 个答案:

答案 0 :(得分:150)

UCanAccess是一个纯Java JDBC驱动程序,它允许我们在不使用ODBC的情况下读取和写入Access数据库。它使用另外两个包JackcessHSQLDB来执行这些任务。以下是如何设置它的简要概述。

选项1:使用Maven

如果您的项目使用Maven,您只需通过以下坐标包含UCanAccess:

groupId: net.sf.ucanaccess
artifactId: ucanaccess

选项2:手动将JAR添加到项目中

如上所述,UCanAccess需要Jackcess和HSQLDB。 Jackcess又有自己的dependencies。因此,要使用UCanAccess,您需要包含以下组件:

UCanAccess(ucanaccess-x.x.x.jar)
HSQLDB(hsqldb.jar,版本2.2.5或更新版本)
Jackcess(jackcess-2.x.x.jar)
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添加到您的项目中。

  

注意:如果要添加其他五(5)个JAR文件,请loader/ucanload.jar添加到构建路径。 UcanloadDriver类仅在特殊情况下使用,需要不同的设置。有关详细信息,请参阅相关答案here

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 Can Access”数据
// 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));
}

披露

在撰写此Q& A时,我没有参与或关联UCanAccess项目;我刚刚用过它。从那以后,我成为该项目的贡献者。