1. 程式人生 > >Mybatis呼叫Postgres自定義函式實現批量更新的解決方案

Mybatis呼叫Postgres自定義函式實現批量更新的解決方案

前言

如題,提供批量更新的一種解決方案,不一定最優,僅僅是一種解決問題的思路,廢話不多說下面具體看一下應用場景和詳細的解決步驟~

應用場景

如下圖所示,是一個資訊編輯頁面:


可以這是一個標準的批量修改的功能,當用戶點選“修改”按鈕時候頁面的資料變為可編輯狀態,可以修改1個或多個數據項,點選儲存後資料同步更新到DB。不知道各位看到這種功能時的第一思路是什麼呢?下面就從資料表設計開始談談我的思路和方案。

資料表設計

觀察上圖不難發現基本編輯項都為一些系統引數項,所以這種介面適用於不經常變化的一些引數或資料的維護,而且操作也較為簡單。既然是引數型別的資料,為了通用起見,我們肯定要設計成縱表的形式,如下圖所示:


很簡單,唯一關注一下abbr_name(拼音簡寫)這個欄位,由於在介面上我們的資料不是以列表的形式展示的,而是固定的、提前安排好哪個位置放什麼樣的資料,所以我們就需要挨個去指定<input/>文字框的name屬性,這裡我們定義一條規則:name屬性和表中的abbr_name保持一致,這樣做有兩個關鍵的好處。

第一,我們決定用pg的自定義函式來處理這個批量更新,思路就是給函式傳一個字串陣列作為引數,在函式內部進行loop,獲取陣列的每一個元素進行分割,獲取到update語句需要的引數值。這個陣列的每一個元素是“引數名+分隔符+引數值”的一個字串,例如“nwdz#8.8.8.8”,我就是以井號作為分隔符,前面串接引數名,後面串接引數值,這樣當這個字串傳入函式的時候,我再通過pg的字串函式進行分割,就直接得到了需要update set所需要的param_value和where條件中的所需要的abbr_name。
第二,方便顯示。我們的顯示介面明顯不是一個可用foreach標籤迴圈的List,而且當資料量較大時候如何顯示?一個一個查,很麻煩不可取,所以這時abbr_name和<input/>的name一致的好處就體現出來了:我們依然在後臺查詢返回一個List,資料傳到頁面後轉換成json陣列,通過js去遍歷的時候我們可以通過jquery的$(input[name='xxx']).val(xxx)

來實現頁面資料的填充,有點js基礎的話應該可以想來是如何實現的,再貼一小段參考程式碼:

             success:function(data){
                var ulistJosn = getStrJson(data);
                for ( var i = 0; i < ulistJosn.length; i++) {
                   var abbrname = ulistJosn[i].abbrname;
                   var paramvalue = ulistJosn[i].paramvalue;
                   $("input[name="+abbrname+"]").val(paramvalue);
                }
             }

最後來看一下批量更新的自定義函式:

CREATE OR REPLACE FUNCTION func_update_basic_param(arr text[])
  RETURNS void AS
  $body$ 
	declare 
	    arrLength integer;
	    rownum integer := 0; 
	    elementStr text;
	    elementPartOne text;
	    elementPartTwo text;
        BEGIN  
	   arrLength = array_length(arr,1);
	   -- begin loop
	   while rownum < arrLength LOOP 
              -- rebuild string
              elementStr:=arr[rownum];
              elementPartOne:=split_part(elementStr,'%',1);
              elementPartTwo:=split_part(elementStr,'%',2);
              -- do update
              update t_sys_param_settings set param_value = elementPartTwo where abbr_name = elementPartOne;
	   rownum := rownum + 1; 
	   END LOOP;
	   RETURN;
        END;  
        $body$ LANGUAGE 'plpgsql'; 

用到幾個簡單的pg內建函式,例如:array_length(anyarray,int) 返回陣列指定維度的長度,split_part(str,del,field)根據del分割str返回生成的第field個子字串。寫這個函式的目的也就是為了減少連線資料庫的次數,通過一次呼叫完成批量操作。

總結

本篇僅僅記錄了一種較為簡單的批量更新的實現方式,順便學習一下postgresql自定義函式的基本語法,整體和oracle的procedure還是很類似的,如果有錯誤的地方和更好的建議歡迎批評指正,The End。

相關推薦

Mybatis呼叫Postgres定義函式實現批量更新解決方案

前言 如題,提供批量更新的一種解決方案,不一定最優,僅僅是一種解決問題的思路,廢話不多說下面具體看一下應用場景和詳細的解決步驟~ 應用場景 如下圖所示,是一個資訊編輯頁面: 可以這是

求兩個整數的最大公約數和最小公倍數(通過呼叫定義函式實現

>#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int yue(int x, int y); //int yue_2(int

關於jpa的Specification定義函式,實現oracle的decode;以及如何在靜態方法中呼叫注入的service

如何在靜態方法中呼叫注入的service Public class ClassA{  public static ClassA classA;  @Resource  private Service service;   //原理時在工程啟動時載入,在靜態方法前載入,這樣就可以在靜態方法中呼叫注入的

定義函式實現百度搜索關鍵字在網頁中匹配字元高亮顯示效果

    自定義函式實現類似百度搜索關鍵字在網頁中匹配字元高亮顯示效果。完全用php來實現簡單但很有趣的效果。函式如下: <?php /**     * @param $wd 搜尋的詞語

Postgres定義函式返回記錄集(虛擬表結構)

CREATE OR REPLACE FUNCTION fun_get_real_inv_qty(pvOrderId varchar) RETURNS SETOF record AS $BODY$b

Oracle定義函式實現動態引數複製表(使用了定義type以及pipelined)

(作者:陳玓玏) 之前試了一下,想用自定義函式及遊標實現動態傳入引數,確實可以,但是輸出結果總是不能成表格。 查了一圈,Oracle自定義函式好像是不能直接在SQL語句中寫create as select和insert into這些功能的,但是後來的版本中提供了

mysql函式的建立以及hibernate呼叫mysql定義函式以及資料對比功能,模仿中關村線上

系統業務有這樣一個需求,每次版本進行變更時間,則需要建立新的記錄,而不是在原來的基礎上更替舊版本。 基於這樣一個小小的需求,所有在資料庫的設計時間,進行了表的自連線,當然這個只是假象的自連線,沒有進行表自身的外來鍵的對映;當有了很多的資料之後,需要加這個外來鍵已經提示無法進

python定義函式實現一個數的三次方計算

python自定義函式在執行時,最初只是存在記憶體中,只有呼叫時才會觸發執行。def cube_count(a): if is_number(a): return a**3

Spring+SpringMVC+Mybatis 利用AOP定義註解實現可配置日

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 5

Spring Boot入門系列(十七)整合Mybatis,建立定義mapper 實現多表關聯查詢!

之前講了Springboot整合Mybatis,介紹瞭如何自動生成pojo實體類、mapper類和對應的mapper.xml 檔案,並實現最基本的增刪改查功能。mybatis 外掛自動生成的mapper 實現了大部分基本、通用的方法,如:insert、update、delete、select 等大概20個左右

vue2中元件間傳遞資料時,在monted中呼叫method中的函式提示未定的解決方案

一、最近在使用vue2開發時需要在monted中接收兄弟元件傳遞的事件,然後執行method中的函式。這裡說依稀思路及當時遇到的問題。 二、元件之間傳遞可以用$emit和$on來進行操作,具體如下:        在A元件中寫一個事件(click,change...)在事

vue 定義data屬性報錯解決方案

需要:介面返回的資料有中文和英文,我們用的的iview裡面的 CheckboxGroup 我們現在是每一項顯示的中文,然後需要選中的專案組成的陣列是一個包含返回中另一個引數的陣列。所以需要給另外一個引數自定義一個屬性: 程式碼:  html: <Checkb

IONIC定義動態高度SubHeader的解決方案

IONIC subheader是我們常用的一個css 屬性,但是這個subheader的高度是固定的,當然也是可以改變的,但是如果改了subheader的告訴,還要更改content的top值,稍微有些麻煩,如果是動態告訴的subheader就麻煩了,還需要動態

整個網路可能最完善的 Android 定義鍵盤 問題彙總以及解決方案

        系統自帶的鍵盤,鍵值太多,不符合客戶的需求,需要自定義鍵盤,如下圖:       分別是字母和數字的鍵盤,感謝很多前輩提供的例子,朋友們可以到這個連結下載資源:前輩android 自定義鍵盤詳解講的非常清楚,我下了他的程式碼,在這基礎上進行修改,

Cocos2d-x 專案新建定義類後編譯錯誤:打不開定義標頭檔案錯誤解決方案

現在Cocos2dx新建工程需要執行Python指令碼來建立,不再提供Cocos2dx模板。一般我們使用VS2010編譯完Cocos2dx後,可以開始使用Cocos2dx目錄下\tools\project-creator\create_project.py來建立工程。 命

MongoDB 帶JSON類 序列化定義物件為Json字串解決方案

今天在使用MongoDB時,需要將自定義的POJO類通過mongoDB自帶的JSON.serialize序列化成一個Json格式的字串,但一直報json don't serialize object異常,又不想使用第三方的jar包,網上到處搜沒搜到。最後看api文件實現Ob

MongoDB自動增長id實現定義函式呼叫、與Spring整合

昨天同事問實現MongoDB主鍵自動增長有什麼好的辦法,雖然喜歡MongoDB客戶端驅動程式自動生成的id,不過還是來測試了一下,僅僅是測試哦 廢話少說 1、建立專案,新增依賴 <dependencies> <dependen

除錯經驗——使用定義函式在Oracle中實現類似LISTAGG函式的行轉列(字串連線)功能

問題描述: LISTAGG函式是一個很實用的函式,但僅在Oracle 11.2以後的版本中才有。 生產環境中有個資料庫是Oracle 11.1,需要行轉列,但並不能使用LISTAGG函式。 解決方法: 參考以下文章: https://oracle-base.com/artic

Pig-使用java實現使用者定義函式編譯pig.jar包錯誤

從SVN庫中匯出程式碼建立本地的pig.jar檔案時報錯: 建立命令: svn co http://svn.apache.org/repos/asf/pig/trunk cd trunk ant 執行 ant 時報如下錯誤: BUILD FAILED /home/hadoo

Mybatis定義註解實現DAO層--實現DAO層介面

  Java新增自定義註解:https://www.cnblogs.com/0xcafedaddy/p/6095187.html 1、自定義一個註解@MybatisRepository用作dao掃描 /** * @author cao * @description 前沿my