Manipulando um banco de dados Access de Java sem ODBC

114

Quero manipular um banco de dados do Microsoft Access (arquivo .accdb ou .mdb) do meu projeto Java. Não quero usar a ponte JDBC-ODBC e o driver ODBC do Access da Microsoft porque:

  • a ponte JDBC-ODBC foi removida do Java SE 8 e não é suportada (ref: aqui ),
  • a ponte JDBC-ODBC não funciona corretamente com o driver ODBC do Access quando o texto inclui caracteres Unicode com pontos de código acima de U + 00FF (ref: aqui ), portanto, tal configuração não seria capaz de lidar com caracteres como grego, russo, chinês , Árabe, etc.,
  • o driver ODBC do Access da Microsoft só funciona no Windows, e
  • existem versões separadas de 32 e 64 bits do Access Database Engine (e do driver ODBC) que podem ser um incômodo para a implantação.

Já vi outras respostas mencionando um driver JDBC para bancos de dados do Access chamado UCanAccess . Como posso configurar meu projeto Java para usar essa abordagem?

(Respostas sugerindo melhores maneiras de trabalhar com bancos de dados Access de Java também seriam bem-vindas.)

Gord Thompson
fonte
Gord, gostaria de entrar em contato com você. Endereço de email, é possível? Saúde
bonCodigo
Você pode usar classes odbc jdbc de jre7 também em jre8 - consulte stackoverflow.com/a/34617075/2110961
Frank M.

Respostas:

160

UCanAccess é um driver Java JDBC puro que nos permite ler e gravar em bancos de dados do Access sem usar ODBC. Ele usa dois outros pacotes, Jackcess e HSQLDB , para realizar essas tarefas. A seguir está uma breve visão geral de como configurá-lo.

 

Opção 1: usando Maven

Se o seu projeto usa Maven, você pode simplesmente incluir UCanAccess através das seguintes coordenadas:

groupId: net.sf.ucanaccess
artifactId: ucanaccess

A seguir está um trecho de pom.xml, pode ser necessário atualizar o <version>para obter a versão mais recente:

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

 

Opção 2: adicionar manualmente os JARs ao seu projeto

Como mencionado acima, UCanAccess requer Jackcess e HSQLDB. O Jackcess, por sua vez, tem suas próprias dependências . Portanto, para usar o UCanAccess, você precisará incluir os seguintes componentes:

UCanAccess (ucanaccess-xxxjar)
HSQLDB (hsqldb.jar, versão 2.2.5 ou mais recente)
Jackcess (jackcess-2.xxjar)
commons-lang (commons-lang-2.6.jar, ou versão 2.x mais recente )
commons-logging ( commons-logging-1.1.1.jar ou versão 1.x mais recente )

Felizmente, o UCanAccess inclui todos os arquivos JAR necessários em seu arquivo de distribuição. Ao descompactar, você verá algo como

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

Tudo o que você precisa fazer é adicionar todos os cinco (5) JARs ao seu projeto.

NOTA: Você não adicionar loader/ucanload.jarao seu caminho de construção se você está adicionando os outros arquivos de cinco (5) JAR. A UcanloadDriverclasse é usada apenas em circunstâncias especiais e requer uma configuração diferente. Veja a resposta relacionada aqui para detalhes.

Eclipse: clique com o botão direito do mouse no projeto no Package Explorer e escolha Build Path > Configure Build Path.... Clique no botão "Adicionar JARs externos ..." para adicionar cada um dos cinco (5) JARs. Quando você terminar, seu caminho de construção Java deve ser parecido com este

BuildPath.png

NetBeans: Expanda a visualização em árvore do seu projeto, clique com o botão direito na pasta "Bibliotecas" e escolha "Adicionar JAR / Pasta ..." e navegue até o arquivo JAR.

nbAddJar.png

Depois de adicionar todos os cinco (5) arquivos JAR, a pasta "Bibliotecas" deve ter a seguinte aparência:

nbLibraries.png

IntelliJ IDEA: Escolha File > Project Structure...no menu principal. No painel "Bibliotecas", clique no botão "Adicionar" ( +) e adicione os cinco (5) arquivos JAR. Uma vez feito isso, o projeto deve ser parecido com isto:

IntelliJ.png

 

É isso aí!

Agora "Você pode acessar" dados em arquivos .accdb e .mdb usando um código como este

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

 

Divulgação

No momento em que escrevi este Q&A, eu não tinha envolvimento ou afiliação com o projeto UCanAccess; Eu apenas usei. Desde então, tornei-me um contribuidor do projeto.

Gord Thompson
fonte
2
Você tem alguma afiliação com esta biblioteca? Pode valer a pena divulgar se o fizer.
Joe
Você pode usar isso para se conectar a uma pasta de trabalho do Excel (.xlsx) no Java 8?
steinbitur
2
@ sємsєм A classe de motorista énet.ucanaccess.jdbc.UcanaccessDriver
Gord Thompson
1
@GordThompson Essa é uma ótima resposta. Minha turma inteira estava presa a esse problema, acreditando ser um erro de privilégio do sistema de arquivos. Me ajudou muito e precisei de uma quantidade surpreendente de escavação para perceber que o Oracle acabou com a ponte JDBC-ODBC do Java 8.
wilbomc
1
Que tal integrar a fonte de dados UcanAcces ao JPA com Hibernate e Spring?
Warren M. Nocos,