1 背景
最近公司要求将Access数据库中导出的.mdb文件数据转储到Sqlserver数据库中,想着用命令去实现,奈何查找相关资料没有什么进展,于是就想着先将.mdb文件中的数据读取出来,再保存到Sqlserver中。
2 Access介绍
提到.mdb文件就要先说一下Access,它是由微软
发布的关系数据库
管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。
3 代码实现
3.1 引入jar包依赖
<dependency>
<groupId>net.sf.ucanaccess</groupId>
<artifactId>ucanaccess</artifactId>
<version>5.0.1</version>
</dependency>
这里最好是直接在pom文件中引入,自动下载对应的jar包及依赖包,如果自己手动导入,那么你还需要导入以下jar包,不然程序会报错。
3.2 读取.mdb文件
/**
* 读取.mdb文件
* @param mdbPath mdb文件地址
* @param username 用户名
* @param password 密码
*/
public static List<Map<String, Object>> resolverMdb(String mdbPath, String username, String password) throws Exception {
List<Map<String,Object>> list = new ArrayList<>();
Properties Prop = new Properties();
//设置编码
prop.put("charSet","UTF-8");
prop.put("user", username);
prop.put("password", password);
//数据地址
String dbUrl = "jdbc:ucanaccess://"+ mdbPath;
//引入驱动
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
Connection conn null;
ResultSet tables = null;
Preparedstatement preparedStatement = null;
ResultSet rs = null;
try {
//连接数据库资源
conn = DriverManager.getConnection(dbUrl, prop);
tables= conn.getMetaData().getTables(mdbPath, null, null, new String[]{"TABLE"});
//遍历获取多张表数据
while(tables.next()) {
Map<String, Object>tableMap = new HashMap<>(16);
Set<String> columnList = new HashSet<>();
List<Map<String,String> dataList = new ArrayList<>();
String tableName = tables.getString(3);
preparedStatement = conn.prepareStatement("select * from "+ tableName);
rs = preparedStatement.executeQuery();
ResultSetMetaData data = rs.getMetaData();
while(rs.next()) {
Map<String,String> map = new HashMap<>();
for (int i = 1; i <= data.getColumnCount(); i++) {
//列名
String columnName = data.getColumnName(i);
map.put(columnName,rs.getString(i));
columnList.add(columnName);
}
dataList.add(map);
}
tableMap.put("name",tableName) ;
tableMap.put("column",columnList);
tableMap.put("data",dataList);
list.add(tableMap);
} catch(Exception e) {
logger.error("resolverMdb is error!!!", e);
} finally {
closeA11(conn, preparedStatement, tables, rs);
}
return list;
}
/**
* 关闭所有的资源链接
* @param conn 连接
* @param preparedStatement 初始化 执行语句
* @param tables 结果集
* @param rs 结果集
*/
private static void closeA1l(Connection conn, PreparedStatement preparedStatement, ResultSet tables, ResultSet rs) {
try {
if (null != rs) {
rs.close();
}
if (null!= tables) {
tables.close();
}
if (null != preparedStatement) {
preparedStatement.close();
}
if (null != conn) {
conn.close();
}
} catch (Exception ignore) {}
}
3.3 测试
public static void main(String[] args) throws Exception {
String mdbPath = "D:\\testdata\\2021-10-sum.mdb";
List<Map<String,Object>> list = resolverMdb(mdbPath, "", "");
System.out.println(list);
}
4 总结
上面的这种利用ucanaccess
方式可以轻松实现读取.mdb文件内容,还有一种方式是利用jdbc.odbc
去实现,不过这种方式必须要求JDK版本是1.8以下
,如果需要的可以参考:使用jdbc.odbc驱动读取.mdb文件
大家如果有更好的方法,欢迎留言交流!!!