之所以提這個坑,是因為,今天下午,通過監控系統,發現我們系統生產能力突然下降,頻繁報無法獲取資料庫連接。究其原因,竟然是因為mybatisplus的這個“坑”導致的。 ...
Mybatis常見知識點
${}和#{}有什麼區別
${}是簡單的字元串替換,屬於靜態文本替換,並且並不是在預處理的時候進行替換,實在編譯的時候進行替換,可能會存在sql註入的風險。替換後的值不會自動加上單引號。
{}是占位符,是在預編譯的時候進行替換成?占位符,執行前才會把參數設置進去,相當於jdbc的PreparedStatement,替換後的變數會自動加上單引號,可以防止sql註入。
-- ${}
-- 替換前
select * from t_user where id = ${id}
-- 替換後
select * from t_user where id = 1
-- #{}
-- 替換前
select * from t_user where id = #{id}
-- 替換後
select * from t_user where id = ?
-- 執行時
select * from t_user where id = '1'
Mybatis常見的標簽
Mybatis常見的標簽有
<select>
、<insert>
、<update>
、<delete>
、<resultMap>
、<sql>
、<include>
、<if>
、<foreach>
、<choose>
、<when>
、<otherwise>
、<where>
、<set>
Mybatis實體類屬性名稱和資料庫表中欄位名稱不一致,解決方式
- 在sql查詢語句中是
as
將資料庫欄位名稱定義為實體類屬性名稱,保持兩者一直,as
可以省略。 - 定義
<resultMap>
, sql查詢語句設置resultType為對應的<resultMap>
,<resultMap>
裡面寫實體類欄位和資料庫表中欄位的映射關係。
Mybatis中分頁的幾種方式
-
直接傳入分頁參數,在sql中使用limit進行分頁。例如:
select * from t_users limit 0, 10
-
使用Mybatis中的RowBounds進行分頁
RowBounds需要傳入offset和limit,該方式會把數據全部查詢出來,然後進行處理,將offset之前的數據全部跳過,去除offset和limit之間的數據,屬於邏輯分頁。
-
使用Mybatis的分頁插件,例如PageHelper
PageHelper屬於是物理分頁,會在sql後面添加limit。
-
使用Mybatis提供的攔截器,在攔截器中攔截準備執行的sql,之後重新構造sql。
Mybatis獲取自動生成的主鍵
-
資料庫主鍵是自動生成的,可以使用useGeneratedKeys和keyProerty獲取主鍵值
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> </insert>
-
使用selectKey標簽中的
select LAST_INSERT_ID()
獲取主鍵keyProperty:是屬性名
order:BEFORE、AFTER,BEFORE是先獲取主鍵,再執行insert,AFTER是先執行insert,再獲取主鍵。
<insert id="insertUser"> <selectKey keyProperty="id" resultType="String" order="BEFORE"> select REPLACE(UUID(), '-', '') </selectKey> </insert>
關註微信公眾號「平哥技術站」, 每日更新,在手機上閱讀所有教程,隨時隨地都能學習。
原文鏈接:https://monkey.blog.xpyvip.top/archives/mybatis-chang-jian-zhi-shi-dian