在不使用ODBC的情况下从Java操作Access数据库


114

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

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

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

(也有人建议最好的方法来使用Java访问Access数据库。)


戈德,我想与您联系。电子邮件地址,可以吗?干杯
bonCodigo 2014年

您也可以在jre8中使用来自jre7的jdbc odbc类-请参见stackoverflow.com/a/34617075/2110961
Frank M.

Answers:


160

UCanAccess是一个纯Java JDBC驱动程序,它使我们无需使用ODBC即可读写Access数据库。它使用另外两个软件包JackcessHSQLDB来执行这些任务。以下是有关如何进行设置的简要概述。

 

选项1:使用Maven

如果您的项目使用Maven,则可以通过以下坐标简单地包含UCanAccess:

groupId: net.sf.ucanaccess
工件 ID ucanaccess

以下是摘录pom.xml,您可能需要更新<version>以获得最新版本:

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

 

选项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构建路径应如下所示:

BuildPath.png

NetBeans:展开项目的树状视图,右键单击“库”文件夹,然后选择“添加JAR /文件夹...”,然后浏览到JAR文件。

nbAddJar.png

添加所有五(5)个JAR文件后,“库”文件夹应如下所示:

nbLibraries.png

IntelliJ IDEA的:选择File > Project Structure...主菜单。在“库”窗格中,单击“添加”(+)按钮,然后添加五(5)个JAR文件。完成后,项目应如下所示:

IntelliJ.png

 

而已!

现在,使用这样的代码,“ U Can Access” .accdb和.mdb文件中的数据

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

 

揭露

在撰写本问答时,我没有参与或与UCanAccess项目有任何关系。我刚用过 此后,我成为该项目的贡献者。


2
您与此图书馆有任何隶属关系吗?如果这样做,可能值得披露。
2014年

您可以使用它连接到Java 8中的Excel工作簿(.xlsx)吗?
steinbitur 2014年

2
@sємsєм驾驶员级别是net.ucanaccess.jdbc.UcanaccessDriver
Gord Thompson

1
@GordThompson这是一个很好的答案。我的整个班级都被这个问题困扰,认为它是文件系统特权错误。帮我负载,并花了挖掘,实现与甲骨文在Java 8的JDBC-ODBC桥废除数量惊人的
wilbomc

1
如何通过Hibernate和Spring将UcanAcces数据源集成到JPA?
沃伦·诺科斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.