Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。
JDK1.8增加了很多新特性,但不再包含access桥接驱动,因此在连接Access数据库时有所变化[和JDK1.6相比]. 所以需要我们自己 创建连接方式
1、UCanAccess是一个纯Java JDBC驱动程序,它允许我们在不使用ODBC的情况下读取和写入Access数据库。它使用另外两个软件包Jackcess和HSQLDB来执行这些任务。以下是如何设置它的简要概述。
如果您的项目使用Maven,则可以通过以下坐标简单包含UCanAccess:
groupId: net.sf.ucanaccess
artifactId: ucanaccess
net.sf.ucanaccess ucanaccess 4.0.4
如上所述,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 Build Path应该看起来像这样
NetBeans:展开项目的树视图,右键单击“Libraries”文件夹并选择“Add JAR / Folder ...”,然后浏览至JAR文件。
添加所有五(5)个JAR文件后,“Libraries”文件夹应该如下所示:
IntelliJ IDEA的:选择File > Project Structure...
主菜单。在“库”窗格中单击“添加”(+
)按钮并添加五(5)个JAR文件。一旦完成,该项目应该看起来像这样:
现在使用这样的代码在.accdb和.mdb文件中“U可以访问”数据
// 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));
}
2、详细的解决方案
代码
public class AccessUtil { private Connection connection; private Statement statement; // 需要保存到的新的mdb文件路径和名 private String savedMdbFilePathAndName = defaultSavedMdbFilePath + defaultSavedMdbFileName; // 新mdb文件路径 public static final String defaultSavedMdbFilePath = "C://"; // 新mdb文件名 public static final String defaultSavedMdbFileName = "data.mdb"; // 标准的单件模式 private static AccessUtil instance = new AccessUtil(); private AccessUtil() { } public static AccessUtil getInstance() { return instance; } /** * Description: 设置待保存的新的mdb文件路径和名 */ public void setSavedFilePathAndName(String newFilePathAndName) { this.savedMdbFilePathAndName = newFilePathAndName; } /** * Description: 删除已经存在的mdb文件 */ public void deleteOldMdbFile() throws Exception { File oldTargetFile = new File(savedMdbFilePathAndName); if (oldTargetFile.exists()) { oldTargetFile.delete(); } } /** * Description: 将空白mdb文件拷贝到特定目录 */ public void copyBlankMdbFile() throws Exception { InputStream is = this.getClass().getClassLoader().getResourceAsStream("static/ERPDATA.mdb"); OutputStream out = new FileOutputStream(savedMdbFilePathAndName); byte[] buffer = new byte[1024]; int numRead; while ((numRead = is.read(buffer)) != -1) { out.write(buffer, 0, numRead); } is.close(); out.close(); } /** * Description: 打开对mdb文件的jdbc-odbc连接 */ public void connetAccessDB() throws Exception { /*Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + savedMdbFilePathAndName.trim() + ";DriverID=22;READONLY=true}"; connection = DriverManager.getConnection(database, "", "");*/ connection=DriverManager.getConnection( "jdbc:ucanaccess://D:/data.mdb"); statement = connection.createStatement(); /*ResultSet rs = statement.executeQuery("SELECT [DATA1] FROM [TABLE]"); while (rs.next()) { System.out.println(rs.getString(1)); }*/ } /** * Description: 执行特定sql语句 */ public void executeSql(String sql) throws Exception { statement.execute(sql); } /** * Description: 关闭连接 */ public void closeConnection() throws Exception { statement.close(); connection.close(); } }
测试类
public class Test { public static void main(String[] args) { AccessUtil accessUtil = AccessUtil.getInstance(); accessUtil.setSavedFilePathAndName("D://data.mdb"); try { accessUtil.copyBlankMdbFile(); } catch (Exception e) { e.printStackTrace(); } try { accessUtil.connetAccessDB(); } catch (Exception e) { e.printStackTrace(); } try { accessUtil.executeSql("INSERT INTO [TABLE] ([DATA1],[DATA2],[DATA3]) VALUES('1','2','3')"); } catch (Exception e) { e.printStackTrace(); } try { accessUtil.closeConnection(); } catch (Exception e) { e.printStackTrace(); } } }
如果你是Maven项目 记得添加上面的依赖
如果不是的话,记得手动导入jar包