當前位置: 妍妍網 > 碼農

一款 IDEA Mybatis外掛程式:極大提升 CRUD 效率,堪稱神器!

2023-01-01碼農

戳上方藍字「 哪咤編程 」關註我

mybatis-sql-viewer外掛程式主要提供能力:

將mybatis xml轉成真實SQL語句、參數mock、SQL規範檢查、SQL索引檢查、SQL執行、SQL壓測及Mybatis SQL語句掃描。

1. 簡介

雖然寫了很久的CRUD,但是依舊覺得寫好CRUD是一件非常難且麻煩的事情,以下的情況在開發過程中應該都遇到過:

SQL的編寫需要細心,寫錯了SQL欄位或者表名稱,修改完要重新開機(幾分鐘過去了)

SQL編寫好後進行測試時,造數據也好麻煩,特別是還存在表關聯的情況,數據內容不真實,還容易超出欄位長度,讓人抓狂

SQL好不容易能跑了,又會有以下的疑問

  • 符不符合SQL開發規範?

  • 是否能命中索引?又可能命中哪個索引?

  • 日常環境數據太少,如何模擬SQL在生產環境下執行的真實情況?

  • 效能怎麽樣,最大TPS可以達到多少?數量大時是否會存在慢SQL?

  • TP99/TP90、最大RT/平均RT、平均TPS是多少呢?

  • 對於使用Mybatis的開發者還會存在這些問題:

  • Mapper介面方法和XML標簽不對應,修改完要重新開機(又幾分鐘過去了)

  • XML中多寫了一個逗號或者分號,又沒有錯誤提示,介面測試呼叫時才發現,修改完又又要重新開機(好多個幾分鐘過去了)

  • 這個Mapper介面對應的是哪個XML檔?找找十幾秒過去了

  • 這個XMl檔對應的是哪個Mapper介面?找找十幾秒又過去了

  • 這個計畫中有多少個XML檔?有多少SQL語句?裏面是否存在慢SQL?是否都符合開發規範?

  • 按照這種開發模式,需要重新開機好多次套用,對於每次啟動都需要幾分鐘的套用來說開發體驗簡直就是災難。基於上述的問題,開發了mybatis-sql-viewer外掛程式,基於此外掛程式可以實作以下能力而不需要啟動套用:

    基於此外掛程式以上的問題在編碼階段即可解決:

    SQL的編寫好麻煩,寫錯了SQL欄位或者表名稱,修改完需要重新開機 --> 語法校驗

    SQL編寫好後進行測試時,造數據麻煩,特別是存在表關聯的情況,數據內容不真實,容易超出欄位長度報錯 --> 多種數據mock方式,自動關聯

    SQL好不容易跑起來了,又會有以下的疑問:

  • 符不符合SQL開發規範?--> SQL規範檢查

  • 是否能命中索引,可能命中哪個索引?--> SQL索引檢查&SQL執行計劃

  • 日常環境數據量太少,如何模擬SQL在生產環境下執行的真實情況?--> 支持大批次數據mock

  • 效能怎麽樣,最大TPS可以達到多少?數量大時是否會存在慢SQL?--> SQL語句壓測,結果一目了然

  • 基於此外掛程式可以提高CRUD的效率及SQL品質,開發流程可以轉換為如下模式:

    上述的規約均來自【阿裏巴巴Java開發手冊】中的MySQL資料庫章節。

    國內直接使用ChatGPT4o:

    用官方一半價格的錢,用跟官方 ChatGPT4.0 一模一樣功能的工具。

    國內直接使用 ChatGPT4o

    1. 1. 無需魔法,同時支持電腦、手機,瀏覽器直接使用

    2. 2. ChatGPT3.5永久免費

    3. 3. 支持 Chat GPT-4o文本對話、 Copi lot編程、DALL-E AI繪畫、論文外掛程式Consensus等

    長按辨識下方二維碼,備註ai, 發給你

    2. 安裝

    IDEA中安裝:

    Preferences(Settings) > Plugins > Marketplace > Search"mybatis sql viewer" > Install

    手動安裝:

    在releases頁面中下載最新版本的zip檔

    Preferences(Settings) > Plugins > ⚙️ > Install plugin from disk... -> 選擇下載的檔安裝

    3. 使用

    因為需要拉取資料庫表的後設資料資訊、執行SQL,所以使用前需要配置一下資料來源。

    支持多資料來源配置,點選 datasource 按鈕即可完成資料來源的建立、選擇、刪除、測試。

    1. 模式

    此外掛程式有兩種模式:mybatis模式和非mybatis模式。差別在於mybatis模式支持以下功能:

  • mapper介面方法參數mock

  • 隨機參數

  • 預設參數

  • 自訂參數

  • mapper介面/方法跳轉XML檔

  • XML檔跳轉mapper介面/方法

  • 基於mock參數將mapper介面方法的xml轉換成真實SQL

  • 按照檔/計畫維度掃描XML檔,並生成對應的真實SQL語句,並進行規約/索引相關校驗

  • 1. 非mybatis模式

    將mybatis mode的勾選框關閉即可使用非mybatis模式,然後在 statement Tab左欄手寫SQL即可。

    2. mybatis模式

    將mybatis mode的勾選框選中即可使用mybatis模式,mybatis模式主要添加了mapper介面方法參數mock、檔跳轉及mybatis檔掃描的功能。

    在mapper介面或XML檔中點選「sql」圖示,即可生成mapper方法參數隨機值,如果對生成的隨機不滿意或不滿足條件,可以手動修改進行自訂。然後點選 statement Tab即可使用該參數將mybatis的xml實作轉換成真實的SQL語句。

    2. mybatis sql掃描

    支持檔和計畫兩個維度掃描。

    檔維度掃描

    點選或者namespace對應的mapper介面旁邊的「sql」圖示即可完成檔維度mybatis sql的掃描

    計畫維度

    點選 mybatis sql scan 即可進行計畫維度mybatis sql的掃描

    掃描結果左側是mybatis檔的namespace(對於mapper介面名)及其下的方法名,點選具體的方法,右側產生其對應的SQL語句,並會對該SQL語句進行規約檢查、索引檢查並輸出此SQL語句的的執行計劃

    圖示說明
    計畫維度掃描
  • all: 所有語句

  • compliance with spec: 符合SQL規約要求的SQL語句

  • does not meet spec: 不符合SQL規約的要求的SQL語句

  • full table scan: 存在全表掃描的SQL語句

  • error: 存在錯誤的SQL語句,可能是SQL編寫錯誤,參數錯誤,資料庫連線錯誤等

  • 3. SQL語句

    1. 語法校驗&規約檢查

    對於「非mybatis模式」需要左欄編寫SQL語句,「mybatis」模式則需要在mapper介面或XML檔中點選「sql」圖示生成SQL,右欄自動進行語法校驗和規規約校驗

    1. SQL語法校驗

    2. 規約校驗

    2. SQL執行

    點選「result」tab後會自動執行「statement」Tab中的SQL語句。執行結果由3部份組成:執行資訊、執行計劃及執行結果。

  • 執行資訊包含: 執行的語句、執行該條語句的耗時、返回的記錄數及表中記錄總數

  • 執行計劃: EXPLAIN對應的結果

  • 執行結果: 結果表格,預設只返回100條記錄(只有SELECT語句有該資訊)

  • 3. SQL壓測

    點選「stress」Tab進行壓測配置,配置頁面如下:

    配置說明

    值型別由兩種方式組成:

  • use sql directly:表示直接使用「statement」Tab中的SQL語句進行壓測

  • configure parameters:表示對「statement」Tab中的SQL語句的條件進行參數配置。

  • 流量模型也是由兩種方式組成(與並行數有關):

  • increase in a constant rate:並行數按照固定速率增長,增長速率由「遞增時長」指定

  • fixed concurrent number:直接按照指定並行數進行壓測

  • 遞增時長: 指定並行數的增長速率,單位為秒

    並行數: 同時執行SQL語句的執行緒數

    壓測時長: 指定壓測時間,單位為分鐘,因為壓測的指標數據直接存在記憶體中,應該避免壓測時間過長造成Idea OOM

    配置完成後,點選「stress」按鈕即可進行壓測,並自動跳轉到壓測報告「report」Tab

    壓測報告

    壓測報告中主要包含指標:

  • 請求成功率

  • TP99

  • TP90

  • 最大RT

  • 平均RT

  • 最大TPS

  • 平均TPS

  • 並行數

  • 異常數

  • 總請求數

  • 圖表包含:

  • 請求成功率

  • 平均RT

  • TPS

  • 4. SQL表

    點選「table」Tab時會對「statement」Tab中的SQL語句進行解析,提取出表名稱,然後每個表作為一個Tab。如以下語句:

    SELECT
    state
    FROM
    CITY
    WHERE
    country_name IN (
    SELECT
    name
    FROM
    COUNTRY
    WHERE
    idIN (123)
    )

    SQL語句中包含了兩個表:CITY和COUNTRY,所以會產生兩個Tab,如下圖所示:

    1. 欄位

    左欄顯示表的欄位資訊:欄位名稱、型別、是否可為NULL、預設值、索引、註釋說明等資訊

    右欄顯示對表進行建表規約檢查的結果:如表名、欄位名是否包含大寫字母或特殊字元等檢查

    2. 索引

    左欄顯示表的索引資訊

    右欄顯示對索引進行規約檢查的結果

    3. 數據mock

    mock表數據,支持批次數據mock,左欄進行mock數據型別配置,右欄顯示mock結果

    「mock規則」

    左欄表單中「Mock Type」和「Mock Value」進行mock配置。初始化時,已經按照欄位型別設定了預設的配置,可以按照需求進行修改。支持多種mock數據規則:

  • random:隨機值

  • string

  • name:姓名

  • datetime:形如:2023-01-01 00:00:00

  • integer

  • decimal

  • date:形如2023-01-01

  • timestamp

  • time:形如18:00:00

  • year:形如2023

  • city

  • url

  • email

  • ip

  • university

  • phone

  • lexicon:自訂詞庫

  • database:資料庫,需要填寫table.field

  • increment:遞增

  • fixed:固定值

  • regex:正則

  • none:不進行mock,生成insert語句時不包含此欄位

  • 「詞庫建立」

    點選「lexicon」按鈕,即可進行詞庫的建立

    「mock數據預覽」

    配置好mock配置後,可以點選「preview」按鈕進行mock數據的預覽,預設會生成50條數據

    「mock數據」

    預覽數據符合要求後,點選「mock」按鈕完成數據的插入,預設插入100條數據,透過修改「Mock Rows」的值指定mock記錄數,經測試,插入10w條數據花費時間在10秒內,所以可以進行大批次數據mock。

    「mock數據清理」

    mock數據完成後,會儲存主鍵id的範圍(持久化儲存到本地檔),在對SQL語句進行壓測完成後,可以進行清理,避免汙染日常真實的測試數據。點選「Clean」按鈕即可完成清理工作

    4. 配置

    相關配置:Preferences(Settings) > Tools > Mybatis Sql Viewer

    5. 參考

    在實作過程中參考了許多非常優秀的計畫,拷貝了很多程式碼,特此感謝。

  • JDBC壓測_效能測試 PTS-阿裏雲幫助中心

  • SQL Father - 模擬數據生成器(後端)

  • GitHub - q258523454/Java-Mybatis-SQL-Scanner: Java Mybatis SQL Scanner

  • 程式設計師順仔:動手擼一個SQL規範檢查工具

  • pojo2json

  • mybatis-3

  • mybatis-sql-viewer開源地址:

    https://github.com/linyimin0812/mybatis-sql-viewer

    來源:juejin.cn/post/7246365103783673911

    ·················END·················

    用官方一半價格的錢,用跟官方 ChatGPT4.0 一模一樣功能的工具。

    國內直接使用ChatGPT4o:

    1. 無需魔法,支持手機、電腦,瀏覽器直接使用

    2. 帳號獨享

    3. ChatGPT3.5永久免費

    4. 支持GPT-4o、 Copilot編程、DALL-E AI繪畫

    長按辨識下方二維碼,備註ai,發給你

    回復gpt,獲取ChatGPT4o直接使用地址

    點選閱讀原文,國內直接使用ChatGpt4o