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