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

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

  • JDBC-ODBC Bridge已从Java SE 8中删除,不支持(ref: here ),
  • 当文本包含代码点高于U + 00FF(ref: here )的Unicode字符时,JDBC-ODBC Bridge无法正常使用Access ODBC驱动程序,因此这样的设置将无法处理希腊语,俄语,中文,阿拉伯语等等,
  • 来自Microsoft的Access ODBC驱动程序只能在Windows和
  • 有Access数据库引擎(和ODBC驱动程序)的单独的32位和64位版本,这可能是一个讨厌的部署。

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

(解决schemebuild议更好的方法来处理来自Java的Access数据库也将是最受欢迎的。)

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

选项1:使用Maven

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

groupId: net.sf.ucanaccess
artifactId: ucanaccess

选项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添加到您的项目中。

注:如果要添加其他五(5)个JAR文件,请勿将loader/ucanload.jar添加到构buildpath。 UcanloadDriver类仅用于特殊情况下,需要不同的设置。 详情请参阅相关的答案。

Eclipse:右键单击Package Explorer中的项目,然后selectBuild Path > Configure Build Path... 单击“添加外部JAR …”button以添加五(5)个JAR中的每一个。 当你完成你的Java构buildpath应该看起来像这样

BuildPath.png

NetBeans:展开项目的树视图,右键单击“Libraries”文件夹并select“Add JAR / Folder …”,然后浏览到JAR文件。

nbAddJar.png

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

nbLibraries.png

IntelliJ IDEA:从主菜单中select“ File > Project Structure... ”。 在“库”窗格中单击“添加”( + )button并添加五(5)个JAR文件。 一旦完成,项目应该看起来像这样:

IntelliJ.png

而已!

现在“U可以访问”.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项目或参与其中。 我只是用它。 我从那以后就成为这个项目的贡献者。