java实现读取.mdb文件数据

1 背景

最近公司要求将Access数据库中导出的.mdb文件数据转储到Sqlserver数据库中,想着用命令去实现,奈何查找相关资料没有什么进展,于是就想着先将.mdb文件中的数据读取出来,再保存到Sqlserver中。

2 Access介绍

提到.mdb文件就要先说一下Access,它是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft Office 的系统程序之一。

3 代码实现

3.1 引入jar包依赖

>
  >net.sf.ucanaccess>
  >ucanaccess>
  >5.0.1>
>

这里最好是直接在pom文件中引入,自动下载对应的jar包及依赖包,如果自己手动导入,那么你还需要导入以下jar包,不然程序会报错。
java实现读取.mdb文件数据_第1张图片

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文件

大家如果有更好的方法,欢迎留言交流!!!

你可能感兴趣的:(Java学习,java,sqlserver,jar,access)