有一些项目用的是微软的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. nsis插件nsisSlideshow.dll更新

    更新至1.7版本,作者wiz0u已解决关于ie9的兼容问题.Good 下载地址: http://wiz0u.free.fr/prog/nsisSlideshow/latest.php

  2. [题解] Atcoder Regular Contest ARC 147 A B C D E 题解

    点我看题 A - Max Mod Min 非常诈骗.一开始以为要观察什么神奇的性质,后来发现直接模拟就行了.可以证明总操作次数是\(O(nlog a_i)\)的.具体就是,每次操作都会有一个数a被b取 ...

  3. String简介

    String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String实现了Serializable接口:表示字符串是支持序列化的.实现了 ...

  4. React + Springboot + Quartz,从0实现Excel报表自动化

    一.项目背景 企业日常工作中需要制作大量的报表,比如商品的销量.销售额.库存详情.员工打卡信息.保险报销.办公用品采购.差旅报销.项目进度等等,都需要制作统计图表以更直观地查阅.但是报表的制作往往需要 ...

  5. 齐博x1如何调试查找全站的表单提交接口参数

    H5.PC.WAP端的所有提交POST表单操作都是可以当作接口来用的. 比如我们通过PC或WAP浏览器打开相应要修改的界面,然后浏览器进入开发者模式,就可以追踪到所提交的变量参数.你在APP里边只要指 ...

  6. 齐博软件 著名的老牌CMS开源系统 X1.0基于thinkphp开发的高性能免费开源PHP开放平台齐博x1.0基于thinkphp框架开发的高性能免费开源系统 主推圈子 论坛 预定拼团分销商城模块

    齐博X1--标签变量大全 1.网站名称: {$webdb.webname} 2.网址: {$webdb[www_url]} {:get_url('home')} 3.网站SEO关键词: 首页:{$we ...

  7. AIR32F103(三) Linux环境基于标准外设库的项目模板

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

  8. C#--String.Substring方法

    第一种:String.SubString(int start,int length)    截取指定长度的字符串 这里有两个int型的参数  string表示字符串截取的起始位置,length表截取的 ...

  9. Java安全之Tomcat6 Filter内存马

    Java安全之Tomcat6 Filter内存马 回顾Tomcat8打法 先回顾下之前Tomcat789的打法 这里先抛开 7 8之间的区别, 在8中,最后add到filterchain的都是一个fi ...

  10. 51单片机-独立按键控制led矩阵的左移和右移

    51单片机学习 独立按键 控制led灯光矩阵的左移和右移 开发板采用的是普中的A2学习开发板,具体的代码如下: typedef unsigned int u16; void delay(u16 tim ...