1. 程式人生 > >執行mybatis資料庫中存放的SQL

執行mybatis資料庫中存放的SQL

專案中看到的一段比較神奇的思路,將SQL語句存放在了資料庫中,通過外來鍵KEY_ID來獲取製作一個合同需要用到的所有SQL,並依次迴圈執行

貼在此處,過幾天深入瞭解一下。

/**

     * 根據傳入的策略名(通常是檔名,會被大寫處理),讀取待填充資料
     *
     * @param key
     * @param params
     *            傳入的查詢,用keyset替換查詢SQL中的關鍵字${key}
     * @return
     */
    @SuppressWarnings("unchecked")
    public HashMap getFills(String key, Map params) {
        HashMap fills = new HashMap();
        fills.put("填充策略", key);
        BaseDao<HashMap> baseDao = BaseDao.newInstance();
        // 準備填充策略
        logger.debug(key.toUpperCase());
        List<HashMap> lstSQL = baseDao.selectForList("SRV_AIF.getSQL", key.toUpperCase());
        for (HashMap mSQL : lstSQL) {
            logger.info("Sequence-" + mSQL.get("SEQUENCE") + "-" + mSQL.get("ID") + " : " + mSQL.get("SQL"));
            if (mSQL.get("SQL") == null) {
                fills.put("錯誤資訊", "填充SQL為空");
                logger.error("\tSQL不能為空");
                return fills;
            }

            // 準備待執行的SQL,用params中的key進行替代${key}
            HashMap map = new HashMap();
            String sql = mSQL.get("SQL").toString();
            map.put("sql", sql);
            for (Object mk : params.keySet()) {
                if (mk != null) {
                    String akey = mk.toString();
                    String aval = params.get(akey).toString();
                    if (sql.contains("{" + akey + "}")) {

                        sql = sql.replaceAll("\\{" + akey + "\\}", aval);
                        // sql.replaceAll("{" + akey + "}", aval);
                        map.remove("sql");
                        map.put("sql", sql);
                    }
                }
            }
            logger.debug(sql + "-----------------");
            logger.debug("\texecute:" + map);
            logger.debug("引數-----" + map);
            List<HashMap> lstFillData = baseDao.selectForList("System.pdf.execute", map);
            List<HashMap> lstMappers = baseDao.selectForList("SRV_AIF.getMappers", Integer.parseInt(mSQL.get("ID").toString()));
            logger.debug("lstFillData=" + lstFillData);
            if (lstFillData.size() > 0) {
                logger.debug("\t\t獲取結果集,記錄數:" + lstFillData.size());

                int iCnt = 0;
                for (HashMap fillData : lstFillData) {
                    logger.debug("\t\t處理第" + iCnt + "條記錄:" + fillData);
                    logger.debug("\t\t\t準備進行SQL->PDF域名稱轉換");
                    for (HashMap mMapper : lstMappers) {
                        if (mMapper.get("FIELD_SQL") == null) {
                            fills.put("錯誤資訊", "FIELD_SQL不能為空,原始ID為:" + mMapper.get("ID"));
                            logger.error("FIELD_SQL不能為空,原始ID為:" + mMapper.get("ID"));
                            return fills;
                        }

                        // 如果FIELD_PDF為空,則用FIELD_SQL進行同名填充
                        if (mMapper.get("FIELD_PDF") == null) {
                            mMapper.put("FIELD_PDF", mMapper.get("FIELD_SQL"));
                        }

                        String field_sql = mMapper.get("FIELD_SQL").toString().toUpperCase();
                        String field_pdf = mMapper.get("FIELD_PDF").toString().toLowerCase();

                        logger.debug("\t\t\t待轉換域: " + field_sql + " -> " + field_pdf + "\t" + mMapper.get("MEMO"));
                        if (fillData != null && !"null".equals(fillData) && !fillData.isEmpty() && fillData.containsKey(field_sql)) {
                            // if (fillData.containsKey(field_sql)) {
                            logger.debug("fillData=" + fillData);
                            String[] lstFields = field_pdf.trim().toUpperCase().split(",");
                            if (lstFields.length > 0) {
                                for (String strPDFFieldName : lstFields) {
                                    String data = fillData.get(field_sql).toString();
                                    // 處理多條記錄的結果集
                                    if (iCnt > 0) {
                                        strPDFFieldName = strPDFFieldName + iCnt;
                                    }
                                    logger.debug("\t\t\t\t填充值: " + field_sql + ":" + data + " -> PDF域" + strPDFFieldName);
                                    fills.put(strPDFFieldName, data);
                                }
                            } else {
                                logger.error("\t\t\t\t轉換失敗,未找到要填充的PDF表單域");
                            }
                        }
                    }
                    iCnt++;
                }
            } else {
                fills.put("錯誤資訊", "查詢未獲取到任何資料,查詢引數:" + map);
                logger.error("查詢未獲取到任何資料,查詢引數:" + map);
                continue;
                // return fills;
            }
        }
        logger.debug("AIF填充值就緒");
        return fills;
    }

相關推薦

執行mybatis資料庫存放SQL

專案中看到的一段比較神奇的思路,將SQL語句存放在了資料庫中,通過外來鍵KEY_ID來獲取製作一個合同需要用到的所有SQL,並依次迴圈執行 貼在此處,過幾天深入瞭解一下。 /**      * 根據傳入的策略名(通常是檔名,會被大寫處理),讀取待填充資料      *  

php向資料庫匯入.sql檔案

<?php     function insert($file,$database,$name,$root,$pwd)//     {         //將表匯入資料庫      

mybatis xmlsql語句報錯: Error creating document instance. Cause: org.xml.sax.SAXPa

今天遇到了這個問題,感覺很奇怪,沒有什麼問題,但是還是會報錯。 在網上找了半天,用第二種方法解決了這個問題。第一種方法沒有嘗試。以此來記錄下。 感覺這個問題出現概率很大。要記著呢。 1、使用轉移字元替代 &lt; < &gt; &

1、用Workbench向MySQL資料庫匯入SQL檔案

一、點選workbench登入資料庫二、新建schema,自己命名三、可以看到新建的schema中table等均為空四、左上角選單欄file-Open SQL Script-選中要匯入的SQL檔案五、在開啟的SQL檔案中,找到除註釋外的第一行程式碼,在其前面加一句“use [

向MySQL資料庫匯入SQL檔案出錯,innodb

在MySQL資料庫中匯入SQL檔案,出現“Unsuccessful”的錯誤,執行效果如下圖所示: 將錯誤提示面板翻至頂端,可以看到資料庫給出的錯誤提示,如下圖: 根據錯誤提示可

sqlite資料庫sql語句大全

2010年SQLite學習筆記之一 一. 如何獲取SQLite最新版本 即如下頁面下載 二.Windows下的SQLite的原始碼是哪個軟體壓縮包? 三.Window下的SQLite命令列工具 四.Window下的SQLite開發庫,即動態連結庫以及DEF檔案 五.SQLite最新版本是:

oracle資料庫使用sql將clob轉化為字串

在oracle使用過程中,通常使用plsql進行簡單的資料檢視,但是如果一些資訊以clob的形式來展示,多條資料檢視很不方便,通過系統的dbms_lob.substr(欄位,長度,起始位置)方法將clob轉換為varchar2型別 sql語句中將clob轉化為varcha

資料庫存放json的欄位如何解析

JSONArray的格式:必須要求是以[]開始和結束的 資料庫中的資料格式是這樣的: para欄位中: [{paraName:"paraName",paraText:"最小火力",paraVal

mybatis xmlsql語句報錯: Error creating document instance. Cause: org.xml.sax.SAXParseException: The

最近專案折騰了老半天,找了資料才知道是這麼回事。。。 因為語句中有一個小於號“<”,在XML中,會被當成一個頁面元素來解析,不會處理為mysql的SQL語句的組成部分,修改如下: 1、在xml的sql語句中,不能直接用大於號、小於號要用轉義字元 如果用小於

mybatis傳參正常且直接執行sql能獲得正確結果但通過mybatis卻查詢不到結果的原因:oracle資料庫使用了char型別的欄位

問題: 在使用mybatis的過程中,多次檢驗傳參、sql語句等查詢條件,並未發現存在錯誤,直接執行後臺日誌中的sql也能夠查到正確結果,但是後臺mybatis返回的值一直是空。 原因: 經過測試發現是資料庫表結構中使用了char作為欄位型別,而引數的長度和char的長度不符。在oracle中如果cha

kylin調優,專案錯誤總結,知識點總結,kylin jdbc driver + 資料庫連線池druid + Mybatis專案的整合,shell指令碼執行kylin restapi 案例

關於本篇文章的說明: 本篇文章為筆者辛苦勞作用了一整天總結出來的文件,大家閱讀轉發的時候請不要吝嗇寫上筆者:塗作權 和 原文地址。 由於筆者所在環境沒有人用過kylin,筆者也是自學官網,閱讀書籍 將kylin用於實際專案,期間遇到了很多很多關於kylin使用的問題。為了讓後面的人在

pl/sql developer 匯出資料庫的表到可執行的.sql 指令碼檔案

PL/SQL自帶匯出資料庫中表到.sql指令碼檔案的工具。 1.在objects視窗中,選中表》右擊》Export Data 2.選》SQL Inserts 選擇:Create tables,其他選項看情況選擇。 3.Output file:選擇輸出路徑及檔名。 4

Mybatis程式執行和單獨執行同一條SQL出現結果不一致(部分資料沒有查詢出來)

1.mapper檔案如下所示: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybat

mybatis insert 插入資料,顯示執行成功,但未真正插入到資料庫

(1)通過mybatis插入資料庫,插入資料,顯示插入成功,查詢資料庫,發現並未插入成功。通過日誌可看到原因為:插入的語句回滾連線資料庫了,導致插入失敗。(2)應加入commit語句,手動執行提交事件,將資料提交到資料庫中,才真正成功插入到資料庫中。

mybatis。插入語句如何插入資料庫某一欄位最大值(純sql實現)

<insert id="inserts"> <selectKey keyProperty="ID" ORDER="BEFORE" resultType="java.lang.I

資料庫批量執行SQL並將結果記錄到檔案

         專案中有一個步驟:資料移植。資料移植要遷移很多的表,遷移完之後我們要看一下我們遷移的表的記錄數對不對。假如說有一百多張表,不可能每次都一張表一張表的去查詢然後記錄,這時候就得有一個指令碼可以自動執行。我在資料視覺化工具上怎麼試都不行,同時執行一百多個查詢語

無法在SQL 2005系統資料庫執行的T-SQL語句(XML處理)

表現:下面的程式碼, 在相容性級別90的所有使用者資料庫和tempdb庫中都能執行, 但無法在系統資料庫中執行, 執行會收到如下錯誤:Msg 4121, Level 16, State 1, Line 2Cannot find either column "dbo" or the user-defined

Mybatis在編譯器列印sql語句及執行後的結果

在mybatisconfig.xml中加入下列語句,mybatis會列印sql語句及執行後的結果 <!-- 列印查詢語句 --> <settings> <setting name="logImpl" value="STDOUT_L

如何優雅的將Mybatis日誌的Preparing與Parameters轉換為可執行SQL

原文連結 疫情期間大家宅在家裡是不是已經快憋出“病”了~~ ​ 公司給開了VPN,手機電腦都能連,手機裝上APP測試包,就能幹活了,所以walking從2020.02.01入京以來,已經窩在家裡11天了。​這兩天在家遠端辦公,預測下週也要在家辦公。。   最近在家隔離期間,其

Mybatis動態sqltrim標簽的使用

bat fix 打印 第一個 屬性 其中 紅色 span pre trim是一個格式化的標記,可以完成set或者where標記的功能。 trim屬性: prefix:前綴覆蓋並增加其內容 suffix:後綴覆蓋並增加其內容 prefixOverrides:前綴判斷的條件 s