1. 程式人生 > >MyBatis學習筆記(二)——標籤使用

MyBatis學習筆記(二)——標籤使用

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>