Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。
JDK1.8增加了很多新特性,但不再包含access桥接驱动,因此在连接Access数据库时有所变化[和JDK1.6相比]. 所以需要我们自己 创建连接方式
1、UCanAccess是一个纯Java JDBC驱动程序,它允许我们在不使用ODBC的情况下读取和写入Access数据库。它使用另外两个软件包Jackcess和HSQLDB来执行这些任务。以下是如何设置它的简要概述。
选项1:使用Maven
如果您的项目使用Maven,则可以通过以下坐标简单包含UCanAccess:
groupId: net.sf.ucanaccess
artifactId: ucanaccess
net.sf.ucanaccess
ucanaccess
4.0.4
选项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 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、详细的解决方案
1. 在ClassPath下存一个空的blank.mdb. (也就是在你的项目中包含一个空白的.mdb文件)
2. 将项目中的blank.mdb另存到新的路径. (可能是用户选择要导出mdb文件的保存路径)
代码
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包
————————————————
版权声明:本文为CSDN博主「hengliang_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hengliang_/article/details/80496538