MyBatis 作為一款優(yōu)秀的持久層框架,它支持自定義SQL、存儲過程以及高級映射。它免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。還可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數(shù)據(jù)庫中的記錄。接下來為大家?guī)碓谌粘?yīng)用的過程中的一些小技巧。
1
MyBatis總結(jié)
1.MyBatis查詢/更新語句,沒有找到符合條件的記錄,會返回什么?返回類型為String的:實(shí)際返回null; 返回類型為對象的:實(shí)際返回null; 返回類型為列表等集合: 實(shí)際返回空集合[]; 返回類型為Boolean:實(shí)際返回false當(dāng)數(shù)據(jù)庫語句插入條件不滿足,會返回false;比如使用dual的SQL語句;
2.mybatis會拋出哪些常見異常?不是所有的異常,都認(rèn)為程序出異常要報(bào)錯(cuò); 比如用戶重復(fù)收藏商品,可以直接返回成功,這時(shí)候?qū)Α斑`反唯一鍵”異常要特殊處理。
(1) 插入語句DataIntegrityViolationException:違反非空約束、數(shù)據(jù)大小超過約束 DuplicateKeyException:違反唯一鍵約束 CannotAcquireLockException: for update nowait 超時(shí)
(2)更新語句條件不滿足時(shí),會返回false 數(shù)據(jù)庫操作應(yīng)該判斷返回值,比如下面BUG: (3) bug類,表字段找不到等場景MyBatisSystemException BadSqlGrammarException
3.事務(wù)里面套用for update,看上去繞過了事務(wù)等for update獲取鎖后,select出來的是最新的數(shù)據(jù) 4.for update是一種行級鎖,又叫排它鎖一旦用戶對某個(gè)行施加了行級加鎖,則該用戶可以查詢也可以更新被加鎖的數(shù)據(jù)行,其它用戶只能查詢但不能更新被加鎖的數(shù)據(jù)行;如果查詢條件帶有主鍵,會鎖行數(shù)據(jù),如果沒有,會鎖表。如果一定要用FOR UPDATE,建議加上NOWAIT 或 for update wait 3
2
SQL優(yōu)化
約束條件:
數(shù)據(jù)表增加表的約束條件,防止臟數(shù)據(jù)。
limit1:
如果我們知道返回結(jié)果只有 1 條,就可以使用LIMIT 1,告訴 SELECT 語句只需要返回一條記錄即可。這樣的好處就是 SELECT 不需要掃描完整的表,只需要檢索到一條符合條件的記錄即可返回。
拼寫風(fēng)格:
SQL保留字使用英文大寫,其他使用英文小寫;提高可讀性。
Like:
使用like加通配符,可能使得索引失效,會觸發(fā)全表掃描。如果要讓索引生效,那么 LIKE 后面就不能以(%)開頭,比如使用LIKE ‘%太%’或LIKE ‘%太’的時(shí)候就會對全表進(jìn)行掃描。如果使用LIKE ‘太%’,同時(shí)檢索的字段進(jìn)行了索引的時(shí)候,則不會進(jìn)行全表掃描。
對常用于搜索的字段添加索引,能極大增加查詢效率
使用“自連接”優(yōu)于子查詢。
使用視圖:
視圖可以理解成給一個(gè)查詢SQL起個(gè)別名。 只不過提前經(jīng)過編譯,視圖不能傳入變量,不保存數(shù)據(jù) 視圖的優(yōu)點(diǎn)是:隔絕數(shù)據(jù)表操作
使用臨時(shí)表:
http://9.IN/EXIST 使用類似兩層for循環(huán),遵循小表驅(qū)動大表原則。 如果兩個(gè)表中一個(gè)較小,一個(gè)是大表,則子查詢表大的用exists,子查詢表小的用in:
例如:表A(小表),表B(大表)
select * from A where cc in (select cc from B) ;// 效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc) ;// 效率高,用到了B表上cc列的索引。
不建議使用索引的情況:
(1)總數(shù)據(jù)量很少。 (2)數(shù)據(jù)重復(fù)度大,且不同取值分布均勻,比如性別男女比例各接近50%。
唯一索引/唯一鍵有3個(gè)字段時(shí),按其中1個(gè)字段查詢,是否比沒有索引效率高?
---- 沒有,這種情況創(chuàng)建唯一鍵,更多的是為了保證數(shù)據(jù)正確性。 (1)唯一索引和唯一鍵的區(qū)別? (2)創(chuàng)建聯(lián)合索引時(shí),我們需要注意創(chuàng)建時(shí)的順序問題 因?yàn)槁?lián)合索引 (x, y, z) 和 (z, y, x) 在使用的時(shí)候效率可能會存在差別。比如剛才舉例的 (x, y, z),如果查詢條件是 WHERE x=1 AND y=2 AND z=3,就可以匹配上聯(lián)合索引;如果查詢條件是 WHERE y=2,就無法匹配上聯(lián)合索引。
連接表:
(1)連接表的數(shù)量盡量不要超過 3 張,因?yàn)槊吭黾右粡埍砭拖喈?dāng)于增加了一次嵌套的循環(huán),數(shù)量級增長會非??欤瑖?yán)重影響查詢的效率。 (2)對用于連接的字段創(chuàng)建索引,并且該字段在多張表中的類型必須一致。比如 user_id 在 product_comment 表和 user 表中都為 int(11) 類型,而不能一個(gè)為 int 另一個(gè)為 varchar 類型。
索引失效情況
(1)在 WHERE 子句中,如果在 OR 前的條件列進(jìn)行了索引,而在 OR 后的條件列沒有進(jìn)行索引,那么索引會失效。 (2)索引列盡量設(shè)置為 NOT NULL 約束。
數(shù)據(jù)表字段,不要用bool類型,用int2 代替 bool類型,增加擴(kuò)展能力
原文標(biāo)題:學(xué)起來!MyBatis中SQL語句優(yōu)化小結(jié)
文章出處:【微信公眾號:華為開發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責(zé)任編輯:haq
-
SQL
+關(guān)注
關(guān)注
1文章
780瀏覽量
44816 -
mybatis
+關(guān)注
關(guān)注
0文章
63瀏覽量
6870
原文標(biāo)題:學(xué)起來!MyBatis中SQL語句優(yōu)化小結(jié)
文章出處:【微信號:Huawei_Developer,微信公眾號:華為開發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何一眼定位SQL的代碼來源:一款SQL染色標(biāo)記的簡易MyBatis插件

Devart: dbForge Compare Bundle for SQL Server—比較SQL數(shù)據(jù)庫最簡單、最準(zhǔn)確的方法
dbForge Studio For SQL Server:用于有效開發(fā)的最佳SQL Server集成開發(fā)環(huán)境
淺談SQL優(yōu)化小技巧
SSM框架的性能優(yōu)化技巧 SSM框架中RESTful API的實(shí)現(xiàn)
深入理解C語言:循環(huán)語句的應(yīng)用與優(yōu)化技巧

SQL錯(cuò)誤代碼及解決方案
SQL與NoSQL的區(qū)別
大數(shù)據(jù)從業(yè)者必知必會的Hive SQL調(diào)優(yōu)技巧
QPS提升10倍的sql優(yōu)化

IP 地址在 SQL 注入攻擊中的作用及防范策略
如何在SQL中創(chuàng)建觸發(fā)器
什么是 Flink SQL 解決不了的問題?
使用mybatis切片實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制

評論