有一些项目用的是微软的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】文件的更多相关文章

  1. java解析XML文件

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源 ...

  2. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

  3. CSharpGL(9)解析OBJ文件并用CSharpGL渲染

    CSharpGL(9)解析OBJ文件并用CSharpGL渲染 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo ...

  4. Jsoup系列学习(2)-解析html文件

    解析html文件 1.当我们通过发送http请求时,有时候返回结果是一个html格式字符串,你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 使用 Jsoup ...

  5. JAVA使用SAX解析XML文件

    在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...

  6. JAVA中使用DOM解析XML文件

    XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...

  7. CSharpGL(5)解析3DS文件并用CSharpGL渲染

    CSharpGL(5)解析3DS文件并用CSharpGL渲染 我曾经写过一个简单的*.3ds文件的解析器,但是只能解析最基本的顶点.索引信息,且此解析器是仿照别人的C++代码改写的,设计的也不好,不方 ...

  8. php解析.csv文件

    public function actionImport() { //post请求过来的 $fileName = $_FILES['file']['name']; $fileTmpName = $_F ...

  9. java中采用dom4j解析xml文件

    一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...

  10. 使用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

随机推荐

  1. kibana安装安装插件

    命令语法:bin/kibana-plugin install <package name or URL> 当您指定的插件名没有带 URL,插件工具将会尝试去下载 Elastic 官方插件. ...

  2. (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通

    一.注意要点 1:输入字符串的的编码双方保持统一,如:UTF8: 2:HASH计算输出结果 byte[] 数组转String 时,编码要统一,如:转16进制小写字符串.当然也可以转Base64. 3: ...

  3. IC入门课第五课作业:完善 Microblog 前端(1、显示发布者的名字;2、增加新UI、3、关注其他学员的 canister)

    上周完成了 IC 入门课程第五课的作业 现将答案贴出,欢迎同学们参考,禁止抄袭作业哦 课程作业 (完善 microblog 前端) 1. 显示消息的发布者名字 a. 给 Message 增加 auth ...

  4. WMS 相比于 ERP 系统有哪些优势?

    WMS与ERP系统是两个不同的系统,不存储优势的比较!WMS是仓库管理系统(Warehouse Management System) 的缩写,ERP是Enterprise Resource Plann ...

  5. Java之POI导出Excel(一):单sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现 用POI导出Excel表格. 一.pom引用 pom文件中,添加以下依赖 查看代码  <!-- ...

  6. P3402 可持久化并查集

    P3402 通过主席树维护不同版本的并查集,注意要采用按秩合并的方式,路径压缩可能会爆. 1 #include <bits/stdc++.h> 2 using namespace std; ...

  7. 使用MVC的实现登录注册功能

    文章目录 1.视图层(View)页面的编写: 1.1.登录页面 1.2.注册页面 2.控制层(Controller)的编写 2.1. 注册 2.2 .登录 2.3 .实体类 3.Model层(Mode ...

  8. 齐博x1APP要实现直播的关键两步

    大家务必要注意,缺少这两步,你的APP将不能实现直播, 也即点击直播按钮无法启动直播推流 https://www.maxdo.tech/

  9. P 算法与 K 算法

    P 算法与 K 算法 作者:Grey 原文地址: 博客园:P 算法与 K 算法 CSDN:P 算法与 K 算法 说明 P 算法和 K 算法主要用来解决最小生成树问题,即:不破坏连通性删掉某些边,使得整 ...

  10. 微服务组件--限流框架Spring Cloud Hystrix分析

    Hystrix的介绍 [1]Hystrix是springCloud的组件之一,Hystrix 可以让我们在分布式系统中对服务间的调用进行控制加入一些调用延迟或者依赖故障的容错机制. [2]Hystri ...