1. 程式人生 > >MyBatis中的xml檔案部分標籤使用

MyBatis中的xml檔案部分標籤使用

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:#{}和${}區別
  1. 將傳入的資料都當成一個字串,會對自動傳入的資料加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麼解析成sql時的值為order by “111”, 如果傳入的值是id,則解析成的sql為order by “id”.
  2. sqlorderbyuser_id$,如果傳入的值是111,那麼解析成sql時的值為order by user_id, 如果傳入的值是id,則解析成的sql為order by id.
  3. 方式能夠很大程度防止sql注入。 
  4. $方式無法防止Sql注入。
  5. $方式一般用於傳入資料庫物件,例如傳入表名. 
  6. 一般能用#的就別用.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語句中,不能直接用大於號、小於號要用轉義字元

轉義字元 符號 解釋
&lt; < 小於號
&gt; > 大於號
&amp; &
&apos; 單引號
&quot ; 雙引號

例如:

   <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>