实现动态SQL的元素
if (多条件选择)
用来判断参数 在需要判断参数的SQL语句中添加if
属性
test
要判断的条件
如果满足该条件,则会在sql语句中增加if中的那一段sql语句

<!-- if判断条件 --> <select id="userListAssociation" resultMap="userRoleAssociation"> select u.*,r.id as r_id,r.roleName,r.roleCode from smbms_user u,smbms_role r where u.userRole = r.id <!-- 如果userName不是空值null的话,则进入if --> <if test="userName!=null"> and `userName` LIKE CONCAT('%',#{userName},'%') </if> <!-- 如果userRole不是空值null的话,则进入if --> <if test="userRole!=null"> AND `userRole`=#{userRole} </if> </select>
where (简化sql判断条件)
使用where标签时,它上层的sql语句不加where条件关键字
如果where标签内有返回值,则where会自动给sql语句加上where
如果这个标签(返回值)是以and,or等查询关键字开头,则自动去除这些关键字
如果where标签内没有返回值,则不加where条件关键字

<!-- where --> <select id="getUserListByPojo" resultType="User" parameterType="User"> SELECT * FROM `smbms_user` <!-- 外层的where关键字不用写 如果where标签内有返回值,则自动加上where关键字,如果没有返回值,则不会加where关键字 --> <where> <if test="userName!=null"> `userName` LIKE CONCAT('%',#{userName},'%') </if> <if test="userRole!=null"> AND `userRole`=#{userRole} </if> </where> </select>
set (set动态更新)
更新时,若某个参数为null,则不需要更新,保持数据库原值
使用set标签时,它的上层sql语句不加set条件关键字
如果set标签内有返回值,则set会自动给sql语句加上set关键字
set标签会自动去除(返回值)以","分隔符结束的sql语句

<!-- set --> <update id="updateUser"> UPDATE `smbms_user` <!-- 使用set处理分隔符“ , ” --> <set> <if test="userCode!=null"> `userCode` = #{userCode}, </if> <if test="userName!=null"> `userName` = #{userName} </if> </set> WHERE `id` = #{id} </update>
trim(去除多余关键字(代替set和where))
trim标签会自动识别标签内是否有返回值,如果有返回值,则会加上属性的作用
属性
prefix前缀(在trim元素包含的内容上加上前缀)
where----------where标签
set----------set标签
suffix后缀(在trim元素包含的内容上加上后缀)
prefixOverrides前缀覆盖
可以覆盖(去除)sql语句开头的and或or关键字等,例:prefixOverrides="and | or"
suffixOverrides后缀覆盖
可以覆盖sql语句尾部的","分隔符,例:suffixOverrides=","
trim代替where
<!-- trim代替where --> <select id="getUserListByPojos" resultType="User" parameterType="User"> SELECT * FROM `smbms_user` <!-- 通常prefix="where"和prefixOverrides="and | or"一起--> <!-- 前缀是where,去除sql语句中开头的and或or --> <trim prefix="where" prefixOverrides="and | or"> <if test="userName!=null"> `userName` LIKE CONCAT('%',#{userName},'%') </if> <if test="userRole!=null"> AND `userRole`=#{userRole} </if> </trim> </select>
trim代替set
<!-- trim代替set --> <update id="updateUsers"> UPDATE `smbms_user` <!-- 通常prefix="set"和suffixOverrides=","一起 --> <!-- 前缀是set,去除sql语句尾部的"," --> <trim prefix="set" suffixOverrides=","> <if test="userCode!=null"> `userCode` = #{userCode}, </if> <if test="userName!=null"> `userName` = #{userName} </if> </trim> WHERE `id` = #{id} </update>
foreach(迭代一个集合,一般用于in条件)
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合
属性
item
给集合或数组起个别名
index
指定一个名称,表示迭代时每次迭代到的位置
collection必须指定(指定用什么类型接收)
list 集合
array 数组
map-key 键值对
open 表示改语句以什么开始,它的值是(
separator 分割符,它的值是 ","
close 表示改语句以什么结束,它的值是)
collection="array"在mapper中示例
<!-- foreach collection="array" --> <select id="getUserListArray" resultType="User"> SELECT * FROM `smbms_user` where id in <!-- collection="array" item="ids" 给数组的名称是ids open="(" 以"("开始 close=")" 以")"结束 separator="," 分隔符是"," --> <foreach collection="array" item="ids" open="(" close=")" separator=","> <!-- ONGL表达式引用数组中的值 --> #{ids} </foreach> </select>
collection="array"在接口中示例
/** * collection="array" 使用数组传入参数 * @param ids * @return */ public List<User> getUserListArray(Integer [] ids);
-------List与Array基本一样-------