<!-- 4.3.1 where用法 <where>标签的作用:如果该便签包含的元素中有返回值,就插入一个where;如果 where后面的字符串是一and或or开头的,就将它们剔除掉。 案例分析 当if条件不满足的时候,where元素中没有任何内容,所以SQL中不会出现where,也就 不存在4.1.1节中的SQL错误的问题。如果if条件满足,where元素的内容就是以and开 头的条件,where会主动去掉开头的and,这也能保证where条件正确。 ——很尴尬的一点,这样的化,反倒会将整张表都给查出来。。。 --> <select id="selectByUser" resultType="tk.mybatis.simple.model.SysUser"> SELECT id, user_name userName, user_password userPassword, user_email userEmail, user_info userInfo, head_img headImg, create_time createTime FROM sys_user <where> <if test="userName != null and userName != ''"> AND user_name LIKE CONCAT('%',#{userName},'%') </if> <if test="userEmail != null and userEmail != ''"> AND user_email = #{userEmail} </if> </where> </select> <!-- 4.3.2 set用法 <set>标签的作用:如果该标签包含的元素中有返回值,就插入一个set;如果set 后面的字符串是以逗号结尾的,就将这个逗号剔除掉。 --> <update id="updateByIdSelective"> UPDATE sys_user <set> <if test="userName != null and userName != ''"> user_name = #{userName}, </if> <if test="userPassword != null and userPassword != ''"> user_password = #{userPassword}, </if> <if test="userEmail != null and userEmail != ''"> user_email = #{userEmail}, </if> <if test="userInfo != null and userInfo != ''"> user_info = #{userInfo}, </if> <if test="headImg != null"> head_img = #{headImg,jdbcType=BLOB}, </if> <if test="createTime != null"> create_time = #{createTime,jdbcType=TIMESTAMP}, </if> id=#{id} </set> WHERE id=#{id} </update> <!-- 4.3.3 trim用法 <where>和<set>标签都可以用trim标签实现,并且底层就是通过TrimSqlNode实现的 <where>标签对应的trim实现: <trim prefix="WHERE" prefixOverride="AND |OR "> <set>标签对应的trim实现: <trim prefix="SET" suffixOverrides=","> 提示: prefixOverride中AND和OR后面的空格不能省略,为了避免匹配到andes或 orders等单词。实际上prefixOverride包含"AND""OR""AND\n""OR\n" "AND\r""OR\r""AND\t""OR\t" <trim>标签属性: prefix:当trim元素包含内容时,会给内容增加prefix指定的前缀 prefixOverride:当trim元素包含内容时,会把内容中匹配的前缀字符串去掉。 suffix:当trim元素包含内容时,会给内容增加prefix指定的后缀 suffixOverride:当trim元素包含内容时,会把内容中匹配的后缀字符串去掉。 -->
From《MyBatis从入门到精通》