MyBatis學習筆記(二)——標籤使用
阿新 • • 發佈:2019-02-01
resultMap手動對映
當資料庫表中的欄位名稱與pojo的實體類的名稱不同的時候,使用resultMap:
示例程式碼:
<mapper namespace="com.zrxjuly.mybatis.mapper.OrderMapper">
<!-- type:為實體類的類名
id的值要與寫的sql語句中resultMap的值一致.
colume:資料庫中表的欄位名稱
property:實體類中屬性的名稱
-->
<resultMap type="Orders" id="orders" >
<result column="user_id" property="userId"/>
</resultMap>
<!-- resultMap的值要與resultMap標籤中的id的值一致 -->
<select id="selectOrder" resultMap="orders">
select * from orders
</select>
</mapper>
動態sql
通過MyBatis提供的各種標籤方法實現動態拼接sql。
if標籤
示例程式碼:
<select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
select * from user
where 1=1
<if test="sex != null and sex != ''">
sex=#{sex}
</if>
<if test="username != null and username != ''">
and username=#{username}
</if>
</select>
注:where後的1=1的含義:如果sex為空的話,則語句就會變成select * from user where and username=#{username}
,這樣就會報sql語法錯誤。1=1意思是true
where標籤
不用where 1=1的方法,直接用where標籤:
<select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
select * from user
<!-- where可以去掉第一個前and,也就是說在加and語句的時候要把and放在條件之前 -->
<where>
<if test="sex != null and sex != ''">
sex=#{sex}
</if>
<if test="username != null and username != ''">
and username=#{username}
</if>
</where>
</select>
sql片段
若sql語句中多次出現重複部分,可以提取出來公用:
<!-- 提取出來的sql片段,公共部分, -->
<sql id="selectA">
select * from user
</sql>
<select id="selectUserBySexAndUsername" parameterType="User" resultType="User">
<include refid="selectA" /><!-- 此處引用了select * from user -->
<!-- where可以去掉第一個前and,也就是說在加and語句的時候要把and放在條件之前 -->
<where>
<if test="sex != null and sex != ''">
sex=#{sex}
</if>
<if test="username != null and username != ''">
and username=#{username}
</if>
</where>
</select>
foreach標籤
當要求根據多個引數進行查詢時,用foreach迴圈遍歷多個值:
<!-- collection:傳入的引數的名稱,
例如:如果介面傳過來的引數為Integer[]型別的,則collection="array",此時parameterType屬性去掉
如果介面傳過來的引數為List<Integer>型別的,則collection="list",此時parameterType屬性去掉
item:迴圈遍歷的值
open:遍歷開始
close:遍歷結束
separator:分隔符
該sql語句相當於:select * from user where id in(1,2,3)
-->
<select id="selectUserByIds" parameterType="QueryVo" resultType="User">
select * from user
<where>
id in
<foreach collection="idList" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</where>
</select>
引數為Integer[]型別:
<select id="selectUserInteger" resultType="User">
select * from user
<where>
id in
<foreach collection="array" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</where>
</select>
引數為List<Integer>
型別:
<select id="selectUserList" resultType="User">
select * from user
<where>
id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</where>
</select>
引數為類集合:List<User>
<!-- 批量刪除使用者
當傳入的引數型別為List<類名>這樣的集合時,parameterType的值為類名,
foreach標籤中collection的值為list,item的值為傳入的引數名稱(delete("User.deleteBatch", userList);),
迴圈遍歷的值的獲取要用item值.屬性名。
-->
<delete id="deleteBatch" parameterType="User">
DELETE FROM userinfo
WHERE id IN
<foreach collection="list" item="userList" open="(" close=")" separator=",">
#{userList.id}
</foreach>
</delete>