最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot實(shí)現(xiàn)解析.mdb文件的實(shí)戰(zhàn)指南

 更新時間:2026年02月04日 08:33:17   作者:修己xj  
這篇文章主要為大家詳細(xì)介紹了如何在SpringBoot項(xiàng)目中解析舊版Microsoft Access的.mdb文件,文中提供完整的Maven依賴配置、核心工具類封裝及使用示例,幫助開發(fā)者快速完成遺留系統(tǒng)數(shù)據(jù)遷移,希望對大家有所幫助

最近在做一個數(shù)據(jù)遷移項(xiàng)目,需要從老舊的.mdb(Microsoft Access)文件中提取數(shù)據(jù)。雖然Access數(shù)據(jù)庫現(xiàn)在用得不多,但在一些遺留系統(tǒng)中還能見到。網(wǎng)上查了一圈,發(fā)現(xiàn)UCanAccess這個神器,結(jié)合AI的幫助,很快就完成了需求開發(fā)。

以下是UCanAccess的文檔地址ucanaccess.sourceforge.net/site.html

引入Maven依賴

首先,我們需要在pom.xml中添加UCanAccess的依賴:

<!-- 添加UCanAccess依賴 -->
<dependency>
    <groupId>net.sf.ucanaccess</groupId>
    <artifactId>ucanaccess</artifactId>
    <version>5.0.1</version>
</dependency>

核心工具類實(shí)現(xiàn)

下面是我封裝的MdbJdbcUtil.java工具類,可以直接復(fù)制使用:

import java.sql.*;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class MdbJdbcUtil {
    private static final String DRIVER_CLASS = "net.ucanaccess.jdbc.UcanaccessDriver";
    private static final String URL_PREFIX = "jdbc:ucanaccess://";
    private static final String URL_MEMORY = ";memory=false";

    /**
     * 私有構(gòu)造方法,防止實(shí)例化
     */
    private MdbJdbcUtil() {
        throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
    }
    /**
     * 靜態(tài)初始化塊,加載數(shù)據(jù)庫驅(qū)動
     */
    static {
        try {
            Class.forName(DRIVER_CLASS);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException("Failed to load UCanAccess JDBC driver", e);
        }
    }

    /**
     * 創(chuàng)建數(shù)據(jù)庫連接
     *
     * @param mdbPath MDB文件路徑
     * @return 數(shù)據(jù)庫連接
     * @throws SQLException 如果連接失敗
     */
    public static Connection getConnection(String mdbPath) throws SQLException {
        if (mdbPath == null || mdbPath.trim().isEmpty()) {
            throw new IllegalArgumentException("MDB file path cannot be null or empty");
        }

        Properties props = new Properties();
        props.put("charSet", "UTF-8");

        String dbUrl = URL_PREFIX + mdbPath + URL_MEMORY;
        return DriverManager.getConnection(dbUrl, props);
    }
    /**
     * 執(zhí)行帶參數(shù)的查詢并返回List<Map<String, Object>>結(jié)果
     *
     * @param mdbPath MDB文件路徑
     * @param sql SQL查詢語句
     * @param params 查詢參數(shù)列表
     * @return 查詢結(jié)果列表,每個Map代表一行數(shù)據(jù)
     * @throws SQLException 如果查詢失敗
     */
    public static List<Map<String, Object>> queryForList(String mdbPath, String sql, Object... params) throws SQLException {
        validateParameters(mdbPath, sql);

        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;

        try {
            conn = getConnection(mdbPath);
            stmt = conn.prepareStatement(sql);

            // 設(shè)置查詢參數(shù)
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    stmt.setObject(i + 1, params[i]);
                }
            }

            rs = stmt.executeQuery();
            return convertResultSetToList(rs);

        } finally {
            closeResources(rs, stmt, conn);
        }
    }

    /**
     * 驗(yàn)證參數(shù)有效性
     *
     * @param mdbPath MDB文件路徑
     * @param sql SQL語句
     */
    private static void validateParameters(String mdbPath, String sql) {
        if (mdbPath == null || mdbPath.trim().isEmpty()) {
            throw new IllegalArgumentException("MDB file path cannot be null or empty");
        }
        if (sql == null || sql.trim().isEmpty()) {
            throw new IllegalArgumentException("SQL statement cannot be null or empty");
        }
    }

    /**
     * 關(guān)閉數(shù)據(jù)庫資源
     *
     * @param rs ResultSet對象
     * @param stmt Statement對象
     * @param conn Connection對象
     */
    private static void closeResources(ResultSet rs, Statement stmt, Connection conn) {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            // 記錄日志但不拋出異常
            System.err.println("Failed to close ResultSet: " + e.getMessage());
        }

        try {
            if (stmt != null) {
                stmt.close();
            }
        } catch (SQLException e) {
            System.err.println("Failed to close Statement: " + e.getMessage());
        }

        try {
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException e) {
            System.err.println("Failed to close Connection: " + e.getMessage());
        }
    }

    /**
     * 將ResultSet轉(zhuǎn)換為List<Map<String, Object>>
     *
     * @param rs ResultSet對象
     * @return 轉(zhuǎn)換后的列表
     * @throws SQLException 如果轉(zhuǎn)換失敗
     */
    private static List<Map<String, Object>> convertResultSetToList(ResultSet rs) throws SQLException {
        List<Map<String, Object>> resultList = new ArrayList<>();

        if (rs == null) {
            return resultList;
        }

        ResultSetMetaData metaData = rs.getMetaData();
        int columnCount = metaData.getColumnCount();

        // 獲取列名列表
        List<String> columnNames = IntStream.rangeClosed(1, columnCount)
                .mapToObj(i -> {
                    try {
                        return metaData.getColumnLabel(i);
                    } catch (SQLException e) {
                        throw new RuntimeException("Failed to get column name", e);
                    }
                })
                .collect(Collectors.toList());

        // 遍歷結(jié)果集
        while (rs.next()) {
            Map<String, Object> row = new LinkedHashMap<>();
            for (String columnName : columnNames) {
                row.put(columnName, rs.getObject(columnName));
            }
            resultList.add(row);
        }

        return resultList;
    }
}

如何使用工具類

public class Example {
    public static void main(String[] args) throws SQLException {
        String sql = "select * from UserInfo";
        String mdbPath = "D:\mdb\mdbtest.mdb";
        List<Map<String, Object>> resultList = MdbJdbcUtil.queryForList(mdbPath,sql);
        System.out.println("查詢結(jié)果數(shù)量"+resultList.size());
        for (Map<String, Object> row : resultList) {
            System.out.println(row);
        }
    }
}

運(yùn)行上面的代碼,你會看到如下輸出:

查詢結(jié)果數(shù)量: 2
{UserNO=1, UserID=Admin, UserName=管理員Admin, UserPassword=123456}
{UserNO=2, UserID=Xiuji, UserName=管理員Xiuji, UserPassword=123456789}

注意事項(xiàng)

1.memory設(shè)置

在處理大型數(shù)據(jù)庫并使用默認(rèn)的"memory"設(shè)置(即驅(qū)動屬性memory=true)時,建議用戶通過-Xms和-Xmx選項(xiàng)為JVM分配足夠的內(nèi)存。否則,必須將驅(qū)動的"memory"屬性設(shè)置為"false"

2.ignoreCase設(shè)置

ignoreCase:此屬性用于禁用(ignoreCase=true)或啟用(ignoreCase=false)文本比較的區(qū)分大小寫功能。默認(rèn)值=true。

總結(jié)

通過UCanAccess庫,我們可以輕松地在SpringBoot項(xiàng)目中解析.mdb文件,無需依賴Windows環(huán)境或ODBC驅(qū)動。這個方案特別適合:

  • 臨時數(shù)據(jù)提取任務(wù)
  • 遺留系統(tǒng)數(shù)據(jù)遷移

到此這篇關(guān)于SpringBoot實(shí)現(xiàn)解析.mdb文件的實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)SpringBoot解析mdb文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java猜數(shù)字小游戲?qū)崿F(xiàn)辦法與詳解

    Java猜數(shù)字小游戲?qū)崿F(xiàn)辦法與詳解

    Java猜數(shù)字游戲是一款簡單的命令行游戲,玩家需要在1到100之間猜測一個由計(jì)算機(jī)隨機(jī)生成的數(shù)字,這篇文章主要介紹了Java猜數(shù)字小游戲?qū)崿F(xiàn)辦法與詳解的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • SpringBoot整合Spring?Data?JPA的詳細(xì)方法

    SpringBoot整合Spring?Data?JPA的詳細(xì)方法

    JPA全稱為Java Persistence API(Java持久層API),是一個基于ORM的標(biāo)準(zhǔn)規(guī)范,在這個規(guī)范中,JPA只定義標(biāo)準(zhǔn)規(guī)則,不提供實(shí)現(xiàn),本文重點(diǎn)給大家介紹SpringBoot整合Spring?Data?JPA的相關(guān)知識,感興趣的朋友一起看看吧
    2022-02-02
  • Hadoop運(yùn)行時遇到j(luò)ava.io.FileNotFoundException錯誤的解決方法

    Hadoop運(yùn)行時遇到j(luò)ava.io.FileNotFoundException錯誤的解決方法

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Hadoop運(yùn)行時遇到j(luò)ava.io.FileNotFoundException錯誤展開,文中有非常詳細(xì)的解決方法,需要的朋友可以參考下
    2021-06-06
  • 使用Java編寫一個文件批量重命名工具

    使用Java編寫一個文件批量重命名工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Java編寫一個文件批量重命名工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • Mybatis-plus通用查詢方法封裝的實(shí)現(xiàn)

    Mybatis-plus通用查詢方法封裝的實(shí)現(xiàn)

    本文主要介紹了Mybatis-plus通用查詢方法封裝的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 基于springboot創(chuàng)建mybatis的完整步驟

    基于springboot創(chuàng)建mybatis的完整步驟

    MyBatis是一款優(yōu)秀的數(shù)據(jù)庫持久層框架,相比Hibernate我更喜歡使用MyBatis,看的到SQL還是讓人更安心點(diǎn),這篇文章主要給大家介紹了關(guān)于基于springboot創(chuàng)建mybatis的完整步驟,需要的朋友可以參考下
    2024-03-03
  • Java經(jīng)典算法之快速排序詳解

    Java經(jīng)典算法之快速排序詳解

    這篇文章主要給大家介紹了關(guān)于Java經(jīng)典算法之快速排序的相關(guān)資料,需快速排序是一種分治法的排序算法,其基本思想是通過一趟排序?qū)⒋判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有元素均比另一部分的元素小,然后分別對這兩部分繼續(xù)進(jìn)行排序,需要的朋友可以參考下
    2024-07-07
  • java單例模式實(shí)現(xiàn)面板切換

    java單例模式實(shí)現(xiàn)面板切換

    這篇文章主要為大家詳細(xì)介紹了java單例模式實(shí)現(xiàn)面板切換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java程序包不存在的3種解決方法總結(jié)

    Java程序包不存在的3種解決方法總結(jié)

    包存在的,但是啟動項(xiàng)目的時候提示包不存在,所以解決下,這篇文章主要給大家介紹了關(guān)于Java程序包不存在的3種解決方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • 詳解SpringBoot如何開啟異步編程

    詳解SpringBoot如何開啟異步編程

    本文主要介紹了詳解SpringBoot如何開啟異步編程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04

最新評論

湾仔区| 大港区| 宝清县| 德化县| 土默特右旗| 密山市| 伊金霍洛旗| 通渭县| 威宁| 墨玉县| 金阳县| 梅州市| 湖北省| 鹤峰县| 若羌县| 桑日县| 银川市| 景泰县| 水城县| 扬州市| 高密市| 南澳县| 五家渠市| 中牟县| 泽普县| 临邑县| 邢台县| 万载县| 九龙城区| 鄄城县| 贵德县| 平利县| 镇远县| 五华县| 睢宁县| 庆阳市| 莲花县| 滁州市| 古浪县| 贵南县| 宾阳县|