MyBatis-動態SQL
動態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