MyBatis中的xml檔案部分標籤使用
阿新 • • 發佈:2019-02-05
1:parameterType、resultType
無非就是物件,map,其他型別
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" > select id, supplier_id, member_id, province_code, province, city_code, city, district_code from member_address where id = #{id,jdbcType=INTEGER} </select>
2:#{}和${}區別
- 將傳入的資料都當成一個字串,會對自動傳入的資料加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麼解析成sql時的值為order by “111”, 如果傳入的值是id,則解析成的sql為order by “id”.
將傳入的數據直接顯示生成在sql中。如:orderby user_id$,如果傳入的值是111,那麼解析成sql時的值為order by user_id, 如果傳入的值是id,則解析成的sql為order by id.- 方式能夠很大程度防止sql注入。
- $方式無法防止Sql注入。
- $方式一般用於傳入資料庫物件,例如傳入表名.
一般能用#的就別用
.MyBatis排序時使用orderby動態參數時需要注意,用 而不是#<if test="is_default != null"> and is_default = #{is_default} </if> <if test="name!= null and name!= ''"> and namelike '${name}%' </if>
3:轉義字元
在xml的sql語句中,不能直接用大於號、小於號要用轉義字元
轉義字元 | 符號 | 解釋 |
---|---|---|
<; | < | 小於號 |
>; | > | 大於號 |
&; | & | 和 |
&apos; | ‘ | 單引號 |
" ; | “ | 雙引號 |
例如:
<if test="end_time != null and end_time != ''">
and created_at >= #{created_at}
</if>
4:choose 元素
MyBatis 提供了 choose 元素。if標籤是與(and)的關係,而 choose 是或(or)的關係,choose (when,otherwize) ,相當於java 語言中的 switch ,與 jstl 中 的 choose 很類似。
<select id="selectLimitProductByActivityId" parameterType="java.util.Map" resultType="java.lang.Long" >
SELECT
<choose>
<when test="visitSource != null and visitSource==1">
product_outer_id
</when>
<otherwise>
product_id
</otherwise>
</choose>
FROM
core_coupon
<where>
<if test="supplier_id != null">
AND supplier_id = #{supplier_id}
</if>
<if test="activity_id != null">
AND activitie_id = #{activity_id}
</if>
</where>
5:trim 標籤
<trim prefix="" suffix="" suffixOverrides="" prefixOverrides=""></trim>
prefix:在trim標籤內sql語句加上字首。
suffix:在trim標籤內sql語句加上字尾。
suffixOverrides:指定去除多餘的字尾內容,如:suffixOverrides=”,”,去除trim標籤內sql語句多餘的字尾”,”。
prefixOverrides:指定去除多餘的字首內容
<update id="updateByParams" parameterType="java.util.Map" >
update core_member_group
<trim prefix="set" suffixOverrides="," >
<if test="operator_id != null ">
operator_id = #{operator_id} ,
</if>
<if test="user_num != null ">
user_num = #{user_num} ,
</if>
<if test="group_name != null and group_name != ''">
group_name = #{group_name} ,
</if>
<if test="query != null and query != ''">
query = #{query} ,
</if>
</trim>
where group_id = #{group_id} and supplier_id = #{supplier_id}
and operator_id = #{operator_id}
and is_delete = 0
</update>
6:foreach 標籤
例如where id in (1,2,3,4)必須放到數組裡面,順便提一下如果id的陣列特別大的話,儘量不要用where in,in的返回是有上線的
<select id="selectListByParams" parameterType="java.util.Map"
resultType="com.sdc.common.address.model.CoreMemberAddress">
select id, supplier_id, member_id, province_code, province, city_code, city
from core_member_address
<where>
<if test="id != null">
and id = #{id}
</if>
<if test="member_ids != null and member_ids.size()>0">
and member_id in
<foreach item="item" index="index" collection="member_ids" open="("
separator="," close=")">
#{item}
</foreach>
</if>
</where>