问题

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

  • JDBC-ODBC Bridge已从Java SE 8中删除,不受支持(参考:此处),
  • 当文本包含代码点高于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 热门回答(135 赞)

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,或newer2.x版本)
commons-logging(commons-logging-1.1.1.jar,或newer1.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

你需要做的就是将all39075108 five(5)**JAR添加到你的项目中。

注意:如果要添加其他五(5)个JAR文件,请不要将loader / ucanload.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:**ChooseFile > 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项目或与之相关联;我刚用过它。从那以后,我成为该项目的贡献者。


原文链接