目錄
一. sql?代碼片段標簽
二.?resultMap 映射結果集標簽
三. where?條件標簽
四.?set?修改標簽
五.?trim?標簽
六. foreach 循環標簽
一. sql?代碼片段標簽
sql 標簽是 mybatis 框架中一個非常常用的標簽頁,特別是當一張表很有多個字段多,或者要多表查詢很多字段時,都會用到。拓本之際是用來定義一個SQL代碼片段,然后可以在其它SQL語句中引入此片段。
舉例:如下圖,m_user 表中有多個字段。
定義方法:將SQL代碼片段寫在標簽內,并定義唯一id,如下
<sql id="User_Column">id,username,salt,phone,avatar,email,`status`,created,last_login</sql>
引用方式:<include refid="被引用的代碼片段ID">
select<include refid="User_Column" />from m_user
好處:在 mapper.xml 文件中,通常會定義大量的增刪改查語句,當我們定義一個SQL片段時,就可以在整個 mapper.xml 文件中進行引用,簡化了后續的開發,省去了很多不必要的寫字段的時間和精力。
此外,當我們后續要對表添加修改字段時,基本上只需要對SQL片段內部的字段做增減,然后所有引用此SQL片段的SQL語句都會跟著改變,非常方便。
二.?resultMap 映射結果集標簽
數據庫字段與Java代碼之前的映射關系是我們經常需要注意的一個問題,例如數據庫字段名稱為 create_time,但是在Java代碼中,通常采用駝峰的方式定義為 createTime,這就會導致字段映射失敗,而?resultMap 就是來解決這個問題的。
使用方法:以上述 m_user 表為例
last_login 字段在Java代碼中通常定義為 lastLogin;
定義方式:?mapper.xml?文件中,在?resultMap 標簽中這樣寫,定義為一 id ,type 就是映射的 Java 實體類,即 User 類。
<!-- 通用查詢映射結果 --><resultMap id="UserResultMap" type="com.markerhub.entity.User"><id column="id" property="id" /><result column="username" property="username" /><result column="avatar" property="avatar" /><result column="email" property="email" /><result column="password" property="password" /><result column="status" property="status" /><result column="created" property="created" /><result column="last_login" property="lastLogin" /></resultMap>
使用方式:以 select 查詢語句為例,當查詢返回值 resultMap 中全部都有時,就可以通過 resultMap="id值" 來進行引用,當查詢數據庫時,mybatis 會自動把數據庫字段的值映射到我們定義的Java屬性值上。
<select id="selectByUserName" resultMap="UserResultMap">select <include refid="User_Column"/>from m_user where username = #{username}</select>
三. where?條件標簽
條件 where 語句,用于動態 SQL 時使用,在查詢數據庫時,我們不確定用戶是否傳入值,如果有值,就將條件加入到 where ,如果沒有傳值,則不加。
使用方法:將 where條件SQL定義在<where>標簽內部,當 <where> 標簽內部不為空時,where 標簽就會生效。如果<where> 標簽內部為空,則不會將where條件語句拼接到SQL語句內。
<if>標簽也是同樣的道理,test ="id != null" 表示如果 id 值不為空,則將 "and id = #{id}"SQL片段拼接到SQL語句中。
<select id="selectByIdAndUserName" resultMap="UserResultMap">select <include refid="User_Column"/>from m_user w<where><if test="id != null" >and id = #{id}</if><if test="username != null">and username = #{username}</if></where></select>
四.?set?修改標簽
條件 set 語句,和 where 標簽是一個道理。
示例代碼如下,<set> 標簽 搭配 <if> 標簽,就可以達到當傳入的值不為空時,就更新值的效果。
<update id="updateUserById" parameterType="com.markerhub.entity.User">update m_user<set><if test="username != null">username = #{username},</if><if test="avatar != null">avatar = #{avatar},</if><if test="email != null">email = #{email},</if><if test="password != null">password = #{password},</if><if test="status != null">status = #{status},</if><if test="created != null">created = #{created},</if><if test="lastLogin != null">last_login = #{lastLogin},</if></set>where id = #{id}</update>
五.?trim?標簽
trim 標簽是一個單獨的標簽,一共提供了四個屬性,如下圖所示。
prtefix/suffix:在trim標簽中內容前面/后面添加指定內容;
prefixOverrides/suffixOverrides:在trim標簽中內容前面/后面去掉指定內容;
完整的SQL語句
這樣寫表示當 <if> 標簽內容不為空時,添加 where 過濾條件,并且將 <if> 標簽內不多余的后綴關鍵詞 and 去掉防止語法錯誤。
<select id="selectUserByIdAndUserName" parameterType="com.markerhub.entity.User">select <include refid="User_Column"/>from m_user<trim prefix="where" suffixOverrides="and"><if test="id != null and id != ''">id = #{id} and</if><if test="username != null and username != ''">username = #{username} and</if></trim></select>
六. foreach 循環標簽
foreach 就是用來循環的語句,通常出現在按照列表數據批量添加或批量刪除數據時使用,它提供了五個屬性;
cllection:代表要遍歷的數組,Java接口在定義是最好使用@Parm進行標注;
item:表示數組中的每個元素;
open:表示該標簽體以什么開頭;
close :表示該標簽體以什么結尾;
separator:表示數據之間的分隔符是什么;
示例代碼:
這段代碼的意思就是參數傳遞一個ID集合,集合不為空時,where 過濾條件按照 id 值循環刪除所有符合條件的數據。
<delete id="deleteUserByIds" parameterType="arraylist">delete from m_user<where>id in<foreach collection="array" item="id" open="(" separator="," close=")">#{id}</foreach></where></delete>