java實現根據 表索引 批量新增或更新數據信息

目的

? ? ? ? 通過數據庫名、表名實現動態添加活更新數據。添加或更新由唯一索引判斷。

實現

? ? ? ? 思路

? ? ? ? ? ? ? ??查詢數據庫表的唯一索引-CSDN博客

? ? ? ? ? ? ? ? 根據數據庫表名動態查詢表字段-CSDN博客

? ? ? ? ? ? ? ? 達夢數據庫根據唯一索引批量新增或更新數據-CSDN博客

? ? ? ? ? ? ? ? 將數據轉換為sql語句需要的格式

? ? ? ? ? ? ? ? 完善代碼,實現功能

? ? ? ? 實現代碼

????????????????將數據轉換為sql語句需要的格式

    /*** 將數據轉換為sql語句需要的格式** @param tableName   表名* @param dataList    接受到的數據* @param uniqueIndex 索引列* @param <T>         泛型類* @return 轉換后的數據*/public static <T> Map<String, Object> cvtDataTypeByTable2(String tableName, List<T> dataList, List<String> uniqueIndex) {//根據表名查詢字段列表Map<String, List<String>> columnsByTable = QueryColumnsByTableName.queryColumnsByTableName(tableName);//創建存儲返回信息的retMapMap<String, Object> retMap = new LinkedHashMap<>();//獲取所有的表字段List<String> columns = columnsByTable.get(tableName);//獲取需要更新的字段,即索引字段外的其它所有字段List<String> updateColumns = columns.stream().filter(column -> !uniqueIndex.contains(column)).collect(Collectors.toList());//處理傳入的數據List<List<Map<String, Object>>> columnsValueList = dataList.stream().map(data -> {List<Map<String, Object>> singleColumnValue = columns.stream()//對數據列表進行流式處理.map(column -> { // 對每個列進行映射操作try {//將列名轉換為駝峰式或小寫String columnName = Convert2CamelCaseOrLowerCase.convertToCamelCaseOrLowerCase(column);//根據列名獲取數據對象的值Object columnValue = getValueByFieldName(data, columnName);return  new LinkedHashMap<String, Object>() {{//將列名作為鍵,列名作為值放入Map中put("name", column);// 將列值作為鍵,列值作為值放入Map中put("value", columnValue);}};} catch (NoSuchFieldException | IllegalAccessException e) {// 處理異常,例如記錄日志或拋出更具體的異常e.printStackTrace();return null; // 或者拋出異常}}).collect(Collectors.toList());//將映射結果收集為Listreturn singleColumnValue; //返回單個列的值列表}).collect(Collectors.toList());//將映射結果收集為ListretMap.put("columns", columns);retMap.put("uniqueIndex", uniqueIndex);retMap.put("data", columnsValueList);retMap.put("updateColumns", updateColumns);return retMap;}

? ? ? ? service層代碼

package org.springblade.modules.system.service;import org.apache.poi.ss.formula.functions.T;import java.util.List;public interface I類名{/*** 更新或新增第三方傳入數據** @param dataName  數據庫名* @param tableName 表名* @param dataList  傳入數據* @return 是否成功*/<T> boolean updateOrSaveDsfData(String dataName, String tableName, List<T> dataList);}

? ? ? ? serevice實現類代碼

????????

package org.springblade.modules.system.service.impl;import lombok.extern.slf4j.Slf4j;
import org.springblade.modules.system.helper.CvtDataTypeByTable;
import org.springblade.modules.system.mapper.DataBodyMapper;
import org.springblade.modules.system.service.IDsfSjCcService;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;
import java.util.Map;/*** 存儲第三方傳入信息 實現類*/
@Service
@Slf4j
public class 類名 implements I類名 {@Resourceprivate DataBodyMapper dataBodyMapper;@Overridepublic <T> boolean updateOrSaveDsfData(String dataName, String tableName, List<T> dataList) {if (dataList == null || dataList.isEmpty()) {// 返回 false,并且不拋出異常,而是將異常處理交給調用者return false;}try {// 查詢唯一索引List<String> unique = dataBodyMapper.selectUniqueIndex_DM(dataName, tableName);List<String> uniqueIndex = new ArrayList<>();if (unique != null && !unique.isEmpty()) {for (String row : unique) {uniqueIndex.addAll(Arrays.asList(row.split(",")));}}//將收到的數據轉為存儲所需格式Map<String, Object> formattedDataMap = CvtDataTypeByTable.cvtDataTypeByTable2(tableName, dataList, uniqueIndex);//從Map中獲取正確的類型,避免強制類型轉換List<Object> data = (List<Object>) formattedDataMap.get("data");List<String> uniqueIndexList = (List<String>) formattedDataMap.get("uniqueIndex");List<String> columns = (List<String>) formattedDataMap.get("columns");List<String> updateColumns = (List<String>) formattedDataMap.get("updateColumns");// 執行批量插入或更新操作dataBodyMapper.batchInsertOrUpdate(tableName, data, uniqueIndexList, columns, updateColumns);} catch (Exception e) {// 可以考慮記錄日志而不是打印堆棧跟蹤e.printStackTrace();return false;}return true;}}

? ? ? ? mapper層代碼

package org.springblade.modules.system.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springblade.modules.system.entity.DataBodyEntity;import java.util.List;/*** 數據主體 Mapper 接口** @author BladeX* @since 2022-12-12*/
public interface DataBodyMapper extends BaseMapper<DataBodyEntity> {/*** 插入或更新** @param tableName     表名* @param dataList      表數據* @param uniqueIndex   索引字段* @param columns       表字段* @param updateColumns 更新字段*/// @InterceptorIgnore(tenantLine = "true")void batchInsertOrUpdate(String tableName, List<Object> dataList, List<String> uniqueIndex, List<String> columns, List<String> updateColumns);
}

? ? ? ? mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.modules.system.mapper.DataBodyMapper"><insert id="batchInsertOrUpdate" parameterType="java.util.List">MERGE INTO ${tableName} dstUSING(<foreach collection="dataList" item="data" open="(" separator=" UNION ALL " close=")">SELECT<foreach collection="data" item="dt" separator=",">#{dt.value} AS ${dt.name}</foreach>FROM dual</foreach>)srcON<foreach collection="uniqueIndex" item="unique_index_column" open="(" separator=" and" close=")">dst.${unique_index_column} = src.${unique_index_column}</foreach>WHEN MATCHED THENUPDATE SET<foreach collection="updateColumns" item="column" separator=",">dst.${column} = src.${column}</foreach>WHEN NOT MATCHED THENINSERT<foreach collection="columns" item="field" open="(" separator="," close=")">${field}</foreach>VALUES<foreach collection="columns" item="column" open="(" separator="," close=")">src.${column}</foreach></insert></mapper>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/710876.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/710876.shtml
英文地址,請注明出處:http://en.pswp.cn/news/710876.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

maven常用打包命令

1.背景 2.代碼 1 mvn常用命令 一般情況下對于一個maven項目&#xff0c;cd切換到當前項目路徑下&#xff0c;執行如下示例命令即可對項目進行打包。 mvn clean install mvn -U clean package -Dmaven.test.skiptrue mvn clean package -Dmaven.test.skiptrue -P prod mvn cle…

JavaScript數組操作指南:20個精通操作技巧指南

splice、 slice、 pop 和 shift。數組的排序方法是穩定且非原地算法的嗎&#xff1f;要記住所有 JavaScript 數組方法以及它們之間的區別并不容易。它們的名稱相似&#xff0c;就好像直接從同義詞詞典中提取一樣。 這個數組速查表列出了 JavaScript 中通常需要的所有數組方法&…

Gson使用Object接收長數字問題

近期發現公司同事在使用Gson對數字進行反序列列化時出現丟失精度的問題&#xff0c;在這里搬運一下&#xff0c;做個記錄~ 現象 使用Gson反序列化長Long數字(大于16位),如果用Object類型來接收則會丟失精度。 Gson會將數字反序列化為double類型,double類型本身就容易丟精度。…

小程序基礎

小程序基礎 1. 認識什么是小程序 什么是微信小程序 微信小程序是一種運行在微信內部的 輕量級 應用程序。 在使用小程序時 不需要下載安裝&#xff0c;用戶 掃一掃 或 搜一下 即可打開應用。它也體現了 “用完即走” 的理念&#xff0c;用戶不用關心安裝太多應用的問題。它…

weak的實現原理

iOS 在運行時維護著一個全局的弱引用表&#xff0c;該表是一個 hash 表&#xff0c;hash表的 key 是 對象本身&#xff0c;value 是指向該對象的所有 weak 指針的地址數組。 /**全局的弱引用表&#xff0c;本質是一個hash結構&#xff0c;對象本身作為key, 存儲weak修飾的指…

大模型訓練經驗

1.模型訓練好后預測全是起始符號。 解決辦法&#xff1a;訓練數據的輸入輸出去掉起始符號。 2.模型訓練后學不到有效信息。 加大epoch&#xff0c;我加大到了1000。 3.模型訓練后預測沒有結束符&#xff0c;暫時未解&#xff0c;另外&#xff0c;發現當訓練不足時&#xff…

Metasploit安裝及使用教程(非常詳細)從零基礎入門到精通,看完這一篇就夠了。

通過本篇文章&#xff0c;我們將會學習以下內容&#xff1a; 1、在Windows上安裝Metasploit 2、在Linux和MacOS上安裝Metasploit 3、在Kali Linux中使用 Metasploit 4、升級Kali Linux 5、使用虛擬化軟件構建滲透測試實驗環境 6、配置SSH連接 7、使用SSH連接Kali 8、配…

如何學習自然語言處理之語言模型

自然語言處理&#xff08;NLP&#xff09;是一種人工智能技術&#xff0c;它使計算機能夠理解和處理人類語言。而語言模型是NLP中的一個重要概念&#xff0c;主要是用來估測一些詞的序列的概率&#xff0c;即預測p(w1, w2, w3 … wn)&#xff0c;其中一個應用就是句子的生成。 …

JVM運行流程

? 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主頁&#xff1a;小胡_不糊涂的個人主頁 &#x1f4c0; 收錄專欄&#xff1a;JavaEE &#x1f496; 持續更文&#xff0c;關注博主少走彎路&#xff0c;謝謝大家支持 &#x1f496; JVM 1. 運行流程2. 運行時數據區2.1 堆&am…

ubuntu新建ap熱點并分享

測試環境ubuntu16,只有一臺筆記本電腦&#xff0c;不插網線&#xff0c;無線網卡既連wifi&#xff0c;又作為熱點 1.方法1 直接手動新建ap熱點 參考https://jingyan.baidu.com/article/ea24bc39b03fc6da62b331f0.html https://jingyan.baidu.com/article/363872ecd8f35d6e4ba…

機試指南:Ch5:線性數據結構 Ch6:遞歸與分治

文章目錄 第5章 線性數據結構1.向量 vector2.隊列 queue(1)隊列的特點、應用(2)基本操作(3)例題例題1&#xff1a;約瑟夫問題2 &#xff08;難度&#xff1a;中等&#xff09; (4)習題習題1&#xff1a;排隊打飯 &#xff08;難度&#xff1a;中等&#xff09; 3.棧 stack(1)棧…

前端 JS 經典:Content-type 詳解

1. 什么是 Content-Type Content-Type 是 HTTP 協議中的一個請求頭或響應頭字段&#xff0c;用于指示發送或接收的實體的媒體類型&#xff0c;告訴服務器或客戶端如何解析和處理請求或響應的主體部分。 2. Content-Type 的構成 Content-Type 由兩部分組成&#xff1a;媒體類型…

視頻在線壓縮

video2edit 一款免費的在線視頻編輯軟件&#xff0c;可以進行視頻合并、視頻剪輯、視頻壓縮以及轉換視頻格式等。 鏈接地址&#xff1a;在線視頻編輯器和轉換器 - 編輯&#xff0c;轉換和壓縮視頻文件 打開視頻壓縮頁面&#xff0c;上傳想要壓縮視頻&#xff0c;支持MP4&…

收入穩步增長 助力持續發展 尼康發布截至2024年3月財年第三季度財報

近日&#xff0c;尼康截至2024年3月財年的第三季度&#xff08;2023年10月1日-2023年12月31日&#xff09;財報正式發布。數據顯示&#xff0c;尼康集團第三財季銷售收入共計1977億日元&#xff0c;較去年同期上漲300億日元&#xff0c;漲幅約17.9%。其中影像業務領域&#xff…

Java面試題:解釋Java內存模型中的內存順序規則,Java中的線程組(ThreadGroup)的工作原理,Java中的FutureTask的工作原理

引言 在Java開發領域&#xff0c;內存模型、多線程和并發是三個至關重要的概念&#xff0c;它們直接影響到程序的性能、穩定性和可擴展性。作為面試官&#xff0c;考察候選人對這些概念的理解和應用能力是評估其技術水平的重要手段。本文將提供三道涉及這些核心知識點的面試題…

視頻記錄儀_基于聯發科MT6762的智能4G記錄儀方案

智能記錄儀采用聯發科強勁八核處理器&#xff0c;12nm制程工藝的記錄儀具便是滿足這些需求的理想選擇。搭載4GB32GB內存&#xff0c;并運行Android 11.0操作系統&#xff0c;這款記錄儀具展現出強勁的性能表現。 首先&#xff0c;這款記錄儀具具備優秀的視頻錄制功能。它能完整…

WPS如何共享文件和文件夾

1 WPS共享單個文件 用WPS打開要分享的文件&#xff0c;點擊右上角的“分享”鍵&#xff0c;選擇上傳到云端。 之后點擊“創建并分享”&#xff0c;即可分享該文檔。 2 WPS創建共享文件夾 2.1 如何共享文件夾 首先打開WPS&#xff0c;點擊左上角的首頁。在首頁欄中&#…

Ubuntu系統下DPDK環境搭建

目錄 一.虛擬機配置1.添加一個網卡(橋接模式)2.修改網卡類型3.修改網卡名稱4.重啟虛擬機5.查看網卡信息6.dpdk配置內存巨型頁 三 DPDK源代碼下載和編譯1.下載源代碼2.解壓源代碼3.安裝編譯環境4.編譯5.設置dpdk的環境變量6.禁止多隊列網卡7.加載igb_uio模塊8.網卡綁定9.驗證測試…

Vue3自定義文章列表組件

一、Vue3的代碼展示 <template><div><div v-for"article in articles" :key"article.id" class"article-card"><div class"author-info"><img :src"article.avatar" alt"Author Avatar&qu…

Android 驗證啟動模式

文章目錄 Android 驗證啟動模式查看任務棧launchModestandardsingleTopsingleTasksingleInstance Intent標記FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK 和 FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP Android 驗證啟動模式 查看任務棧 可…