有一些项目用的是微软的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. C++自学笔记 头文件 (header file)关于 #include 和.h

    头文件 在C++中定义Definition一个类的时候 要用分别的.h和.cpp文件去定义这个类 .h和.cpp成对出现 类的声明declaration和函数原型放在头文件里(.h) 定义这些函数的结 ...

  2. HDU2844 Coins(多重背包)

    多重背包就是每种物品有数量限制时求解最大价值. 如果一种物品数量和重量之积超过背包容量,可视为完全背包:其余情况通过二进制拆分,将几个数量的物品看成一个,转化为01背包求解. 按照这种思路代码是这样的 ...

  3. fileinput 的总结

    fileinput组件实战总结 fileinput是一个增强的基于Bootstrap3.x和HTML5的文件上传工具,具备多种格式文件的预览功能, 另外,它包含了基于AJAX的上传,拖拽和撤销文件,可 ...

  4. .NET 7 RC 2 发布,倒计时一个月发布正式版

    微软2022-10-22 发布了 .NET 7 RC 2,下一站是.NET 7正式发布,就在下个月Net Conf 2022(11月8日)期间正式发布. 经过长达一年时间的开发,.NET 7 规划的所 ...

  5. 使用python制作动图

    利用python制作gif图 引言 当写文章时候,多张图片会影响排版,可以考虑制作gif图 准备 pip install imageio 代码 # This is a sample Python sc ...

  6. Java注解(2):实现自己的ORM

    搞过Java的码农都知道,在J2EE开发中一个(确切地说,应该是一类)很重要的框架,那就是ORM(Object Relational Mapping,对象关系映射).它把Java中的类和数据库中的表关 ...

  7. JUC(11)各种锁的理解(公平锁、可重入锁、自旋锁、死锁)

    文章目录 1.公平锁.非公平锁 2.可重入锁 3.自旋锁 4.死锁 1.公平锁.非公平锁 公平锁:非常公平.不能插队.必须先来后到 非公平锁:非常不公平.可以插队.(默认非公平) 可以修改为公平锁 2 ...

  8. Vue中router路由的使用、router-link的使用(在项目中的实际运用方式)

    文章目录 1.先看router中的index.js文件 2.router-link的使用 3.实现的效果 前提:router已经安装 1.先看router中的index.js文件 import Vue ...

  9. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(29)-Fiddler如何抓取Android7.0以上的Https包-终篇

    1.简介 上一篇宏哥介绍的Xposed是一款可以在不修改APK的情况下影响程序运行的框架.可以编写并加载自己编写的插件app,实现对目标apk的注入.拦截等.一般研究移动安全的都会使用Xposed. ...

  10. C语言整人关机程序

    #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char input ...