1. 程式人生 > >MyBatis-動態SQL

MyBatis-動態SQL

convert 指定 app 數組 bject end sep name over

動態SQL是MyBatis的一個強大的特性。MyBatis 使用了基於強大的 OGNL(Object-Graph Navigation Language 的縮寫,它是一種功能強大的表達式語言)表達式來避免了大部分其它的元素。 MyBatis 通過映射的 SQL 語句使用強大的動態 SQL 來解決許多的問題。

if:利用if實現簡單的條件選擇

choose(when,otherwise):相當於Java中的switch語句,通常與when和otherwise搭配

where:簡化SQL語句中where的條件判斷

set:解決動態更新語句

trim:可以靈活地去除關鍵字

foreach:叠代一個集合,通常用於in條件

1.選項卡篩選查詢

<!-- 功能要求:使用用戶角色ID和用戶名稱進行模糊查詢

當用戶ID不傳時 表示使用用戶名稱進行模糊查詢 當用戶名稱為空時 表示使用用戶ID查詢

當角色roleId傳入空時 將查詢不到任何數據

<select id="getUserList" resultMap="userList">

select U.*,R.roleName from smbms_user AS U,smbms_role AS R

where username like concat(‘%‘,#{1},‘%‘) and userRole=#{0} and U.userRole=R.id

</select>

-->

<!-- 使用if改進查詢 實現選擇查詢

<select id="getUserList" resultMap="userList">

select U.*,R.roleName from smbms_user AS U,smbms_role AS R

where

<if test="username!=null and username!=‘‘">

username like concat(‘%‘,#{username},‘%‘)

</if>

<if test="roleId!=null">

and userRole=#{roleId}

</if>

and U.userRole=R.id

</select>

-->

<!-- 使用where+if改進查詢

<select id="getUserList" resultMap="userList">

select U.*,R.roleName from smbms_user AS U,smbms_role AS R

<where>

<if test="username!=null and username!=‘‘">

and username like concat(‘%‘,#{username},‘%‘)

</if>

<if test="roleId!=null">

and userRole=#{roleId}

</if>

and U.userRole=R.id

</where>

</select>

-->

<!-- 使用if+trim改進查詢 prefix:前綴 suffix:後綴 prefixOverrides:對trim包含內容首部的覆蓋(忽略) suffixOverrides:對trim包含內容尾部的覆蓋(忽略)-->

<select id="getUserList" resultMap="userList">

select U.*,R.roleName from smbms_user AS U,smbms_role AS R

<trim prefix="where" prefixOverrides="and | or" suffix="and U.userRole=R.id">

<if test="username!=null and username!=‘‘">

and username like concat(‘%‘,#{username},‘%‘)

</if>

<if test="roleId!=null">

and userRole=#{roleId}

</if>

</trim>

</select>

2.修改用戶信息

<!-- 使用if+set實現更新操作

<update id="modifyUser" parameterType="User">

update smbms_user

<set>

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

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

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

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

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

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

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

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

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

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

</set>

where id = #{id}

</update>

-->

<!-- 使用if+trim實現更新操作 -->

<update id="modifyUser" parameterType="User">

update smbms_user

<trim prefix="set" suffixOverrides="," suffix="where id = #{id}">

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

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

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

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

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

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

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

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

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

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

</trim>

</update>

3.使用foreach完成復雜查詢(in)

item:表示集合中每一個元素進行帶帶時的別名

index:指定一個名詞,用於表示在叠代過程中,每次叠代到的位置

open:表示該語句以什麽開始

separator:表示在每次進行叠代之間以什麽符號作為分隔符

close:表示該語句以什麽結束

collection:該屬性必須指定,入參為單參數且參數類型為數組,collection屬性值為array;入參為單參數且參數類型為List,collection屬性值為list;若入參為多參數 需要封裝成Map進行處理

-->

<!-- 根據用戶角色列表,獲取該角色列表下用戶列表信息 單參數 使用數組 -->

<select id="getUserByRoleId_array" resultMap="userList">

select * from smbms_user where userRole in

<foreach collection="array" item="roleId" open="(" separator="," close=")">

#{roleId}

</foreach>

</select>

<!-- 根據用戶角色列表,獲取該角色列表下用戶列表信息 單參數 使用list -->

<select id="getUserByRoleId_list" resultMap="userList">

select * from smbms_user where userRole in

<foreach collection="list" item="roleId" open="(" separator="," close=")">

#{roleId}

</foreach>

</select>

<!-- 根據用戶角色列表,獲取該角色列表下用戶列表信息 單參數 使用map集合 -->

<!-- <select id="getUserByRoleId_map" resultMap="userList">

select * from smbms_user where userRole in

<foreach collection="roleList" item="roleId" open="(" separator="," close=")">

#{roleId}

</foreach>

</select> -->

<!-- 根據用戶角色列表,獲取該角色列表下用戶列表信息 多參數 使用map集合-->

<select id="getUserByRoleId_map" resultMap="userList">

select * from smbms_user where gender=#{gender} and userRole in

<foreach collection="roleList" item="roleId" open="(" separator="," close=")">

#{roleId}

</foreach>

</select>

4.查詢用戶列表(choose)

<!-- 使用choose+when+otherwise -->

<select id="getUserList_choose" resultType="User">

select * from smbms_user where 1=1

<choose>

<when test="userName != null and userName != ‘‘">

and userName like CONCAT (‘%‘,#{userName},‘%‘)

</when>

<when test="userCode != null and userCode != ‘‘">

and userCode like CONCAT (‘%‘,#{userCode},‘%‘)

</when>

<when test="userRole != null">

and userRole=#{userRole}

</when>

<otherwise>

<!-- and YEAR(creationDate) = YEAR(NOW()) -->

and YEAR(creationDate) = YEAR(#{creationDate})

</otherwise>

</choose>

</select>

5.查詢用戶列表(分頁顯示)

<select id="getUserListByPage" resultMap="userList">

select u.*,r.roleName from smbms_user u,smbms_role r where u.userRole = r.id

<if test="userRole != null">

and u.userRole = #{userRole}

</if>

<if test="userName != null and userName != ‘‘">

and u.userName like CONCAT (‘%‘,#{userName},‘%‘)

</if>

order by creationDate DESC limit #{from},#{pageSize}

</select>

MyBatis-動態SQL