解析【.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
随机推荐
- vscode展示子文件夹
取消勾选设置-功能-compact Folders
- ATT&CK系列一 知识点总结
一.环境搭建1.环境搭建测试2.信息收集二.漏洞利用3.漏洞搜索与利用4.后台Getshell上传技巧5.系统信息收集6.主机密码收集三.内网搜集7.内网--继续信息收集8.内网攻击姿势--信息泄露9 ...
- [题解] Codeforces 1268 D Invertation in Tournament 结论,兰道定理
题目 本题需要用到的结论: 一.兰道定理 二.如果\(n\geq4\),那么\(n\)个点的强连通竞赛图存在\(n-1\)个点的强连通子图. 证明: 现在有一个n-1个点的竞赛图(不一定强连通,称其为 ...
- 【.NET 6+Loki+Grafana】实现轻量级日志可视化服务功能
前言:日志功能是几乎所有程序或系统都必备的一个功能.该文章通过使用Loki+Grafana来实现日志记录与可视化查询,欢迎围观. 有关环境: 操作系统:WIN 10 .NET环境:.NET 6 开发环 ...
- acwing1782 Dynamic Rankings (整体二分)
和整体二分的模板相比,多了修改操作. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10,INF=1 ...
- SpringSecurity 在 SSM架构中的使用
SpringSecurity - SSM SpringSecurity 对比 Shiro SpringSecurity的特点: 能和 Spring无缝贴合 能实现全面的权限控制 专门为 Web开发而设 ...
- Sqoop 之 安装
Sqoop 之 安装 前言 安装 Sqoop 的前提是已经具备 Java 和 Hadoop 的环境. 一.下载并解压 1) 下载地址:http://mirrors.hust.edu.cn/apache ...
- python批量加密文件
1.文件名的加密与解密 #coding:utf-8 from docx import Document import os,sys from docx.oxml.ns import qn def fi ...
- python的微积分运算
import sympy sympy.init_printing() from sympy import I, pi, oo import numpy as np 求函数的导数 x = sympy.S ...
- SQL--Case When.. Then.. end的使用
Case When.. Then.. end的使用场景 当字段有不同的值,根据不同的值表示不同的内容 use [数据库名] go if exists( select * from sys.views ...