👉 歡迎 ,你將獲得: 專屬的計畫實戰 / Java 學習路線 / 一對一提問 / 學習打卡 / 每月贈書
新計畫: 仿小紅書 (微服務架構)正在更新中... , 全棧前後端分離部落格計畫 2.0 版本完結啦, 演示連結 : http://116.62.199.48/ 。全程手摸手,後端 + 前端全棧開發,從 0 到 1 講解每個功能點開發步驟,1v1 答疑,直到計畫上線。 目前已更新了261小節,累計43w+字,講解圖:1806張,還在持續爆肝中.. 後續還會上新更多計畫,目標是將Java領域典型的計畫都整一波,如秒殺系統, 線上商城, IM即時通訊,Spring Cloud Alibaba 等等,
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資料庫章節。
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
id IN (1, 2, 3)
)
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
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
❞
👉 歡迎 ,你將獲得: 專屬的計畫實戰 / Java 學習路線 / 一對一提問 / 學習打卡 / 每月贈書
新計畫: 仿小紅書 (微服務架構)正在更新中... , 全棧前後端分離部落格計畫 2.0 版本完結啦, 演示連結 : http://116.62.199.48/ 。全程手摸手,後端 + 前端全棧開發,從 0 到 1 講解每個功能點開發步驟,1v1 答疑,直到計畫上線。 目前已更新了261小節,累計43w+字,講解圖:1806張,還在持續爆肝中.. 後續還會上新更多計畫,目標是將Java領域典型的計畫都整一波,如秒殺系統, 線上商城, IM即時通訊,Spring Cloud Alibaba 等等,
1.
2.
3.
4.
最近面試BAT,整理一份面試資料【Java面試BATJ通關手冊】,覆蓋了Java核心技術、JVM、Java並行、SSM、微服務、資料庫、數據結構等等。
獲取方式:點「在看」,關註公眾號並回復 Java 領取,更多內容陸續奉上。
PS:因公眾號平台更改了推播規則,如果不想錯過內容,記得讀完點一下「在看」,加個「星標」,這樣每次新文章推播才會第一時間出現在你的訂閱列表裏。
點「在看」支持小哈呀,謝謝啦