解析【.mdb】文件
有一些项目用的是微软的access软件,这里面存放数据用的是mdb结尾的文件
有的时候,客户想开发一个新的系统,但是数据需要从这些文件中获取,因此得解析这些文件,来提取数据
一、解析时用到的依赖
1.在项目的pom.xml文件里面添加该依赖
点击查看代码
<!--测试解析.mdb文件-->
<dependency>
<groupId>net.sf.ucanaccess</groupId>
<artifactId>ucanaccess</artifactId>
<version>5.0.1</version>
</dependency>
二、一共用到三个方法
1.解析.mdb文件中的所有表名并组装成list返回
代码如下:
点击查看代码
/**
* 1.该方法解析.mdb文件中的所有表名并组装成list返回
* @param
* @return
*/
public List<String> getAllTables(File file,String password) {
List<String> list=new ArrayList<>();
try {
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
String dbURL = "jdbc:ucanaccess://" + file;
Properties prop = new Properties();
prop.put("charSet", "UTF-8");
prop.put("user", "");//用户名可以是空字符串
prop.put("password", password);//必须使用密码
Connection conn = DriverManager.getConnection(dbURL, prop);
System.out.println(conn);
DatabaseMetaData metadata = conn.getMetaData();
ResultSet tables = metadata.getTables(null, null, "%", null);
while (tables.next()) {
String table = tables.getString(3);
list.add(table);
}
System.out.println(list);
tables.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
2.根据sql语句解析指定数据表中的数据并返回
代码如下:
点击查看代码
/**
* 2.该方法根据sql语句解析指定数据表中的数据并返回
* @param
* @param mdbSql
* @param username
* @param password
* @return
* @throws Exception
*/
public Map<String, Object> resolverMdb(File file, String mdbSql, String username, String password) throws Exception {
if (file.exists() || mdbSql.isEmpty()) {
throw new Exception("mdb文件路径不能为空或者SQL语句不能为空或者返回字段列表不能为空");
}
Map<String, Object> mdbEntityList = new HashMap<>();
Properties prop = new Properties();
//设置编码
prop.put("charSet", "UTF-8");
prop.put("user", username);//用户名可以是空字符串
prop.put("password", password);//必须使用密码
//数据地址
String dbUrl = "jdbc:ucanaccess://" + file;
//引入驱动
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
try {
//连接数据库资源
Connection conn = DriverManager.getConnection(dbUrl, prop);
//建立查询事务
Statement statement = conn.createStatement();
//执行查询
ResultSet result = statement.executeQuery(mdbSql);
ResultSetMetaData metaData = result.getMetaData();
int count = metaData.getColumnCount();
List<String> mdbColumnList = new ArrayList<String>(count);
//动态解析字段名
for (int i = 1; i <= count; i++) {
mdbColumnList.add(metaData.getColumnName(i));
}
//解析执行结果
while (result.next()) {
StringBuffer sb = new StringBuffer();
for (String col : mdbColumnList) {
sb.append(col + "==" + result.getObject(col)).append("\t");
mdbEntityList.put(col, result.getObject(col));
}
}
} catch (Exception e) {
e.printStackTrace();
}
//返回数据
return mdbEntityList;
}
3.对上面两个方法进行了封装,用户只需提供.mdb文件+文件密码即可查询出数据
代码如下:
点击查看代码
/**
* 3.该方法对上面两个方法进行了封装,用户只需提供.mdb文件+文件密码即可查询出数据
* @param
* @return 测试文件密码----【hp2730】
* @throws Exception
*/
@PostMapping("/mdb_list")
@ApiOperation("解析mdb文件")
public List<Map<String, Object>> getResultList(@RequestParam("file") MultipartFile multipartFile,@RequestParam("password") String password) throws Exception {
List<Map<String, Object>> resultList = new ArrayList<>();
//MultipartFile转file
File file = null;
try {
String originalFilename = multipartFile.getOriginalFilename();
String[] filename = originalFilename.split("\\.");
file=File.createTempFile(filename[0], filename[1] + ".");
multipartFile.transferTo(file);
file.deleteOnExit();
} catch (IOException e) {
e.printStackTrace();
}
List<String> allTables = this.getAllTables(file,password);
if (allTables.size()>0){
for (String table:allTables) {
Map<String, Object> map;
String mdbSql="SELECT * FROM "+table;
map= this.resolverMdb(file, mdbSql, "", password);
//把map中为null的数据赋值
map.forEach((key,value)->{
if (value==null){
map.put(key,"");
}
});
map.put("table",table);
resultList.add(map);
//数据存库--这块根据实际情况来写,这里只是示例
//int count=mdbDataDao.getCountByTable(table);
//if (count>0){
// mdbDataDao.deleteByTable(table);
//}
//String json = JSON.toJSONString(map);
//MdbDataEntity mdbDataEntity = new MdbDataEntity();
//mdbDataEntity.setData(json);
//mdbDataEntity.setDataly(table);
//mdbDataEntity.setCreateDate(new Date());
//mdbDataDao.insert(mdbDataEntity);
//log.info("数据存库成功!");
}
}
log.info("解析集合"+resultList);
return resultList;
}
4.完整代码
点击查看代码
package cn.itCast.manor.modules.test;
import cn.itCast.manor.modules.test.xmljx.Dom4JUtils;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.dom4j.DocumentException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.sql.*;
import java.util.Date;
import java.util.*;
/**
* @Classname ceshi1
* @Description:
* @Date: 2022/12/13 0013 12:02
* @AUTHOR: 无泪之城
* @Version 1.0
*/
@RestController
@RequestMapping("test")
@Api(tags="mdb文件解析")
@Slf4j
public class ceshi2 {
private MdbDataDao mdbDataDao;
@Autowired
public void setMdbDataDao(MdbDataDao mdbDataDao) {
this.mdbDataDao = mdbDataDao;
}
/**
* 1.该方法解析.mdb文件中的所有表名并组装成list返回
* @param
* @return
*/
public List<String> getAllTables(File file,String password) {
List<String> list=new ArrayList<>();
try {
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
String dbURL = "jdbc:ucanaccess://" + file;
Properties prop = new Properties();
prop.put("charSet", "UTF-8");
prop.put("user", "");//用户名可以是空字符串
prop.put("password", password);//必须使用密码
Connection conn = DriverManager.getConnection(dbURL, prop);
System.out.println(conn);
DatabaseMetaData metadata = conn.getMetaData();
ResultSet tables = metadata.getTables(null, null, "%", null);
while (tables.next()) {
String table = tables.getString(3);
list.add(table);
}
System.out.println(list);
tables.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* 2.该方法根据sql语句解析指定数据表中的数据并返回
* @param
* @param mdbSql
* @param username
* @param password
* @return
* @throws Exception
*/
public Map<String, Object> resolverMdb(File file, String mdbSql, String username, String password) throws Exception {
if (file.exists() || mdbSql.isEmpty()) {
throw new Exception("mdb文件路径不能为空或者SQL语句不能为空或者返回字段列表不能为空");
}
Map<String, Object> mdbEntityList = new HashMap<>();
Properties prop = new Properties();
//设置编码
prop.put("charSet", "UTF-8");
prop.put("user", username);//用户名可以是空字符串
prop.put("password", password);//必须使用密码
//数据地址
String dbUrl = "jdbc:ucanaccess://" + file;
//引入驱动
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
try {
//连接数据库资源
Connection conn = DriverManager.getConnection(dbUrl, prop);
//建立查询事务
Statement statement = conn.createStatement();
//执行查询
ResultSet result = statement.executeQuery(mdbSql);
ResultSetMetaData metaData = result.getMetaData();
int count = metaData.getColumnCount();
List<String> mdbColumnList = new ArrayList<String>(count);
//动态解析字段名
for (int i = 1; i <= count; i++) {
mdbColumnList.add(metaData.getColumnName(i));
}
//解析执行结果
while (result.next()) {
StringBuffer sb = new StringBuffer();
for (String col : mdbColumnList) {
sb.append(col + "==" + result.getObject(col)).append("\t");
mdbEntityList.put(col, result.getObject(col));
}
}
} catch (Exception e) {
e.printStackTrace();
}
//返回数据
return mdbEntityList;
}
/**
* 3.该方法对上面两个方法进行了封装,用户只需提供.mdb文件+文件密码即可查询出数据
* @param
* @return 测试文件密码----【hp2730】
* @throws Exception
*/
@PostMapping("/mdb_list")
@ApiOperation("解析mdb文件")
public List<Map<String, Object>> getResultList(@RequestParam("file") MultipartFile multipartFile,@RequestParam("password") String password) throws Exception {
List<Map<String, Object>> resultList = new ArrayList<>();
//MultipartFile转file
File file = null;
try {
String originalFilename = multipartFile.getOriginalFilename();
String[] filename = originalFilename.split("\\.");
file=File.createTempFile(filename[0], filename[1] + ".");
multipartFile.transferTo(file);
file.deleteOnExit();
} catch (IOException e) {
e.printStackTrace();
}
List<String> allTables = this.getAllTables(file,password);
if (allTables.size()>0){
for (String table:allTables) {
Map<String, Object> map;
String mdbSql="SELECT * FROM "+table;
map= this.resolverMdb(file, mdbSql, "", password);
//把map中为null的数据赋值
map.forEach((key,value)->{
if (value==null){
map.put(key,"");
}
});
map.put("table",table);
resultList.add(map);
//数据存库
int count=mdbDataDao.getCountByTable(table);
if (count>0){
mdbDataDao.deleteByTable(table);
}
String json = JSON.toJSONString(map);
MdbDataEntity mdbDataEntity = new MdbDataEntity();
mdbDataEntity.setData(json);
mdbDataEntity.setDataly(table);
mdbDataEntity.setCreateDate(new Date());
mdbDataDao.insert(mdbDataEntity);
log.info("数据存库成功!");
}
}
log.info("解析集合"+resultList);
return resultList;
}
解析【.mdb】文件的更多相关文章
- java解析XML文件
dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源 ...
- Android 解析XML文件和生成XML文件
解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...
- CSharpGL(9)解析OBJ文件并用CSharpGL渲染
CSharpGL(9)解析OBJ文件并用CSharpGL渲染 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...
- Jsoup系列学习(2)-解析html文件
解析html文件 1.当我们通过发送http请求时,有时候返回结果是一个html格式字符串,你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 使用 Jsoup ...
- JAVA使用SAX解析XML文件
在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...
- JAVA中使用DOM解析XML文件
XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...
- CSharpGL(5)解析3DS文件并用CSharpGL渲染
CSharpGL(5)解析3DS文件并用CSharpGL渲染 我曾经写过一个简单的*.3ds文件的解析器,但是只能解析最基本的顶点.索引信息,且此解析器是仿照别人的C++代码改写的,设计的也不好,不方 ...
- php解析.csv文件
public function actionImport() { //post请求过来的 $fileName = $_FILES['file']['name']; $fileTmpName = $_F ...
- java中采用dom4j解析xml文件
一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...
- 使用XStream解析MXL文件用到的jar包---xpp3_min-1.1.3.4.O.jar和xstream-1.3.1.jar
使用XStream解析MXL文件用到的jar包---xpp3_min-1.1.3.4.O.jar和xstream-1.3.1.jar
随机推荐
- PAT (Basic Level) Practice 1021 个位数统计 分数 15
给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1>0),请编写程序统计每种不同的个位数字出现的次数.例如:给定 N= ...
- 我的 Kafka 旅程 - 性能调优
Producer 于 config/producer.properties 配置文件中的项 # 序列化数据压缩方式 [none/gzip/snappy/lz4/zstd] compression.ty ...
- 「国产系统」Tubian 0.3,兼容Windows和Android的GNU/Linux系统!
0.4版已发布:https://www.cnblogs.com/tubentubentu/p/16741197.html Sourceforge.net主页(提供下载):https://sourcef ...
- 洛谷U81904 【模板】树的直径
有负边权,所以用树形DP来找树的直径. 1 //树形DP求树的直径 2 #include<bits/stdc++.h> 3 using namespace std; 4 const int ...
- 记一次 .NET 某电子病历 CPU 爆高分析
一:背景 1.讲故事 前段时间有位朋友微信找到我,说他的程序出现了 CPU 爆高,帮忙看下程序到底出了什么情况?图就不上了,我们直接进入主题. 二:WinDbg 分析 1. CPU 真的爆高吗? 要确 ...
- 使用 Apache Hudi 实现 SCD-2(渐变维度)
数据是当今分析世界的宝贵资产. 在向最终用户提供数据时,跟踪数据在一段时间内的变化非常重要. 渐变维度 (SCD) 是随时间推移存储和管理当前和历史数据的维度. 在 SCD 的类型中,我们将特别关注类 ...
- 9.MongoDB系列之创建副本集(二)
1. 如何设计副本集 大多数:选取主节点时需要由大多数决定,主节点只有在得到大多数支持时才能继续作为主节点,写操作被复制到大多数成员时就是安全的写操作.这里的大多数定义为"副本集中一半以上的 ...
- Dapr v1.9.0 版本已发布
Dapr是一套开源.可移植的事件驱动型运行时,允许开发人员轻松立足云端与边缘位置运行弹性.微服务.无状态以及有状态等应用程序类型.Dapr能够确保开发人员专注于编写业务逻辑,而不必分神于解决分布式系统 ...
- 使用 etcdadm 快速、弹性部署 etcd 集群
Etcd 是一个可靠的分布式键值存储, 常用于分布式系统关键数据的存储:而 etcdadm 是一个用于操作 etcd 集群的命令行工具,它可以轻松创建集群.向现有集群添加成员.从现有集群中删除成员等操 ...
- windows下cmd补全键注册表修改
1:使用win+r打开 运行 控制台 2:输入 regedit 打开注册表 3:进入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\ ...