Thao tác cơ sở dữ liệu Access từ Java mà không cần ODBC


114

Tôi muốn thao tác cơ sở dữ liệu Microsoft Access (tệp .accdb hoặc .mdb) từ dự án Java của mình. Tôi không muốn sử dụng JDBC-ODBC Bridge và trình điều khiển Access ODBC từ Microsoft vì:

  • Cầu JDBC-ODBC đã bị xóa khỏi Java SE 8 và không được hỗ trợ (tham khảo: tại đây ),
  • Cầu JDBC-ODBC không hoạt động đúng với trình điều khiển Access ODBC khi văn bản bao gồm các ký tự Unicode có điểm mã trên U + 00FF (tham khảo: tại đây ), vì vậy thiết lập như vậy sẽ không thể xử lý các ký tự như tiếng Hy Lạp, tiếng Nga, tiếng Trung. , Tiếng Ả Rập, v.v.,
  • trình điều khiển Access ODBC từ Microsoft chỉ hoạt động trong Windows và
  • có các phiên bản 32-bit và 64-bit riêng biệt của Access Database Engine (và trình điều khiển ODBC) có thể gây phiền toái cho việc triển khai.

Tôi đã thấy các câu trả lời khác đề cập đến trình điều khiển JDBC cho cơ sở dữ liệu Access có tên UCanAccess . Làm cách nào để thiết lập dự án Java của tôi để sử dụng phương pháp này?

(Các câu trả lời đề xuất cách tốt hơn để làm việc với cơ sở dữ liệu Access từ Java cũng sẽ được hoan nghênh nhất.)


Gord Tôi muốn liên hệ với bạn. Địa chỉ email, có được không? Cheers
bonCodigo

Bạn có thể sử dụng các lớp jdbc odbc từ jre7 cũng trong jre8 - xem stackoverflow.com/a/34617075/2110961
Frank M.

Câu trả lời:


160

UCanAccess là một trình điều khiển Java JDBC thuần túy cho phép chúng ta đọc và ghi vào cơ sở dữ liệu Access mà không cần sử dụng ODBC. Nó sử dụng hai gói khác, JackcessHSQLDB , để thực hiện các tác vụ này. Sau đây là tổng quan ngắn gọn về cách thiết lập nó.

 

Tùy chọn 1: Sử dụng Maven

Nếu dự án của bạn sử dụng Maven, bạn chỉ cần bao gồm UCanAccess thông qua các tọa độ sau:

groupId: net.sf.ucanaccess craftId
: ucanaccess

Sau đây là một đoạn trích từ pom.xml, bạn có thể cần phải cập nhật <version>để có được bản phát hành mới nhất:

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

 

Tùy chọn 2: Thêm JAR vào dự án của bạn theo cách thủ công

Như đã đề cập ở trên, UCanAccess yêu cầu Jackcess và HSQLDB. Đến lượt mình, Jackcess có những phụ thuộc riêng của nó . Vì vậy, để sử dụng UCanAccess, bạn sẽ cần bao gồm các thành phần sau:

UCanAccess (ucanaccess-xxxjar)
HSQLDB (hsqldb.jar, phiên bản 2.2.5 hoặc mới hơn)
Jackcess (jackcess-2.xxjar)
commons-lang (commons-lang-2.6.jar hoặc phiên bản 2.x mới hơn )
commons-logging ( commons-logging-1.1.1.jar hoặc phiên bản 1.x mới hơn )

May mắn thay, UCanAccess bao gồm tất cả các tệp JAR cần thiết trong tệp phân phối của nó. Khi bạn giải nén nó, bạn sẽ thấy một cái gì đó như

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

Tất cả những gì bạn cần làm là thêm tất cả năm (5) JAR vào dự án của mình.

LƯU Ý: Bạn không thêm loader/ucanload.jarđể xây dựng con đường của bạn nếu bạn đang thêm các tập tin năm (5) JAR khác. Các UcanloadDriverlớp học chỉ được sử dụng trong trường hợp đặc biệt và đòi hỏi một thiết lập khác nhau. Xem câu trả lời liên quan tại đây để biết chi tiết.

Eclipse: Nhấp chuột phải vào dự án trong Package Explorer và chọn Build Path > Configure Build Path.... Nhấp vào nút "Thêm JAR bên ngoài ..." để thêm từng JAR trong số năm (5) JAR. Khi bạn hoàn thành Đường dẫn xây dựng Java của bạn sẽ trông giống như thế này

BuildPath.png

NetBeans: Mở rộng chế độ xem dạng cây cho dự án của bạn, nhấp chuột phải vào thư mục "Thư viện" và chọn "Thêm JAR / Thư mục ...", sau đó duyệt đến tệp JAR.

nbAddJar.png

Sau khi thêm tất cả năm (5) tệp JAR, thư mục "Libraries" sẽ trông giống như sau:

nbLibraries.png

IntelliJ IDEA: Chọn File > Project Structure...từ menu chính. Trong ngăn "Thư viện", nhấp vào nút "Thêm" ( +) và thêm năm (5) tệp JAR. Sau khi hoàn thành, dự án sẽ trông giống như sau:

IntelliJ.png

 

Đó là nó!

Giờ đây, dữ liệu "U có thể truy cập" trong các tệp .accdb và .mdb bằng cách sử dụng mã như thế này

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

 

Tiết lộ

Tại thời điểm viết Q&A này, tôi không tham gia hoặc liên kết với dự án UCanAccess; Tôi mới sử dụng nó. Tôi đã trở thành một người đóng góp cho dự án.


2
Bạn có liên kết nào với thư viện này không? Có thể có giá trị tiết lộ nó nếu bạn làm.
Joe

Bạn có thể sử dụng điều này để kết nối với Sổ làm việc Excel (.xlsx) trong Java 8 không?
steinbitur

2
@ sємsєм Lớp lái xe lànet.ucanaccess.jdbc.UcanaccessDriver
Gord Thompson

1
@GordThompson Đó là một câu trả lời tuyệt vời. Toàn bộ lớp học của tôi đã bị mắc kẹt với sự cố này vì tin rằng đó là lỗi đặc quyền hệ thống tệp. Giúp tôi tải và phải mất một lượng đáng ngạc nhiên của đào bới để nhận ra Oracle thực hiện loại bỏ các cầu JDBC-ODBC từ Java 8.
wilbomc

1
Làm thế nào về việc tích hợp nguồn dữ liệu UcanAcces vào JPA với Hibernate và Spring?
Warren M. Nocos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.