1. 程式人生 > >MyBatis動態SQL之增、刪、改、查操作

MyBatis動態SQL之增、刪、改、查操作

概述

在實際的場景中,經常會遇到動態SQL的增、刪、改、查問題,這裡就必要說明何謂動態SQL,我們舉一個實際的例子,比如,在一個web工程中,經常會有一個搜尋框,並且在搜尋之前通常會進行一個關鍵詞的過濾,比如可以過濾的條件有:姓名、年齡等,這樣的話當我們姓名和年齡都不選,則等價於下面的SQL語句

select * from students;   -- 不去限制姓名和年齡

當我們將年齡選擇為>20時,相當於下面的SQL語句:

select * from students where age>20;

當我們同時選擇條件姓名為:張三,年齡>20,則相當於下面的SQL語句:

select * from students where age > 20 and name = '張三';

當我們有很多的條件時,此時就需要我們去組合這些條件,並動態的生成一個可執行的SQL語句,這樣就不是一個簡單的SQL語句能夠解決問題,那麼我們該怎麼辦呢?在MyBatis中同樣是支援這種動態SQL的寫法,具體見下面的內容。

MyBatis動態SQL支援

動態SQL之查詢

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="studentNameSpace">

    <!-- resultMap標籤將了工程entity實體類中的物件與資料庫中的表對應起來
         resultMap中的id屬性是一個唯一的名字
         子標籤中的id屬性用來指定主鍵
         result標籤用來指定其他的鍵,其中property屬性是指實體中的欄位,對應的
         column屬性表示的資料庫中的響應的欄位
     -->
    <resultMap type="com.jpzhutech.entity.Student" id="studentMap">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="sal" column="sal"/>
    </resultMap>

    <!-- 動態查詢SQL語句 -->
    <select id="findAll" parameterType="map" resultMap="studentMap">
        select id , name , sal
        from students
        <where>
            <if test="pid!=null" >
                and id = #{pid}    <!-- #{}和之前使用c3p0的時候寫的?含義是相同的 -->
            </if>

            <if test="pname!=null" >
                and name = #{pname}
            </if>

            <if test="psal!=null" >
                and sal = #{psal}
            </if>
        </where>
    </select>
</mapper>

動態SQL之插入

<!-- 動態insert -->
    <!-- 定義兩個sql片段,第一個對應欄位名,id屬性值任意並且唯一 -->
    <sql id="key">
      <trim suffixOverrides=",">
        <if test="id!=null">
            id,
        </if>

        <if test="name!=null">
            name,
        </if>

        <if test="sal!=null">
            sal,
        </if>
      </trim>
    </sql>


    <!-- 定義第二個sql片段,第二個對應?,key屬性值任意並且唯一 -->
    <sql id="value">
      <trim suffixOverrides=",">
        <if test="id!=null">
            #{id},
        </if>

        <if test="name!=null">
            #{name},
        </if>

        <if test="sal!=null">
            #{sal},
        </if>
      </trim>
    </sql>

    <!-- <include refid="key"/>和<include refid="value"/>表示引用上面sql片段 -->
    <insert id="insertStudent" parameterType="com.jpzhutech.entity.Student">
        insert into students(<include refid="key"/>) values(<include refid="value"/>);
    </insert>

動態SQL之刪除

<!-- 動態刪除操作  delete from students where id in(?,?,?);-->
    <delete id="deleteStudent">
        delete from students where id in
        <!-- foreach用於迭代陣列元素 
             open表示開始符號
             close表示結束符號
             seprator表示元素間的分割符
             items表示迭代的陣列
        -->
        <foreach collection="array" open="(" close=")" separator="," item="ids">
            #{ids}
        </foreach>
    </delete>

動態SQL之更新

 <!-- 動態更新SQL語句,update table_name set name=? , sal=? where id=?,
         其中id不能更新,因為id為主鍵,這個動態更新該怎麼寫呢? 
         set標籤會自動判斷後面是否加,
         -->
    <update id="updateStudent" parameterType="map" >
        update students
        <set>
            <if test="pname!=null">
                name = #{pname},
            </if>

            <if test="psal!=null">
                sal = #{psal},
            </if>
        </set>
        where id = #{pid}
    </update>