zoukankan      html  css  js  c++  java
  • mybatis-动态sql-trim、where、set

    1. where标签的作用:如果该标签包含的元素中有返回值,就插入一个where;如果where后面的字符是以AND和OR开头的,就讲他们剔除。

    int findUserByWhere(@Param("name") String name, @Param("phone") String phone);
    <select id="findUserByWhere" resultType="User">
      SELECT * FROM user
      <where>
        <if test="name != null and name != ''">
          AND name LIKE concat('%', #{name}, '%')
        </if>
        <if test="phone !=null and phone !=''">
          OR phone=#{phone}
        </if>
      </where>
    </select>

    如果两个if条件不满足的时候,where标签包着的这一段代码就会被剔除掉,在SQL中就不会出现这一段代码。

    2.set标签的作用:如果该标签包含的元素中有返回值,就插入一个set;如果set后面的字符串是以逗号结尾的,就将这个逗号剔除。

    int updateUser(@Param("user") User user);
    <update id="updateUser">
        UPDATE user
        <set>
            <if test="user.email != null and user.email != ''">email=#{user.email},</if>
            <if test="user.phone != null and user.phone != ''">phone=#{user.phone},</if>
        </set>
        WHERE uid=#{user.uid}
    </update>

    注意最后的WHERE uid=#{user.uid}不可省略的,如果set包含的内容为空,只能避免最后遗留的逗号问题

    3.trim用法:

    <trim>标签属性:

    • prefix:当trim元素包含内容时,会给内容增加prefix指定的前缀
    • prefixOverride:当trim元素包含内容时,会把内容中匹配的前缀字符串去掉。
    • suffix:当trim元素包含内容时,会给内容增加prefix指定的后缀
    • suffixOverride:当trim元素包含内容时,会把内容中匹配的后缀字符串去掉。

    <where>和<set>标签都可以用trim标签实现,并且底层就是通过TrimSqlNode实现的。

    <where>标签对应的trim实现:

    <trim prefix="WHERE" prefixOverride="AND |OR ">

    例子:

    <select id="findUserByTrimWhere" resultMap="BaseResultMap">
        SELECT * FROM user
        <trim prefix="WHERE" prefixOverrides="AND | OR">
            <if test="name != null and name != '' ">
                AND NAME LIKE concat('%', #{name}, '%')
            </if>
            <if test="phone !=null and phone !=''">
                OR phone=#{phone}
            </if>
        </trim>
    </select>

    <set>标签对应的trim实现:

    <trim prefix="SET" suffixOverrides=",">

    例子:

    <update id="updateUserTrim">
        UPDATE user
        <trim prefix="SET" suffixOverrides=",">
            <if test="user.email != null and user.email != ''">email=#{user.email},</if>
            <if test="user.phone != null and user.phone != ''">phone=#{user.phone}</if>
        </trim>
        WHERE uid =#{user.uid}
    </update>

    提示:

    prefixOverride中AND和OR后面的空格不能省略,为了避免匹配到andes或orders等单词。实际上prefixOverride包含"AND""OR""AND ""OR ""AND ""OR ""AND ""OR "

  • 相关阅读:
    Threejs学习 一
    Mapbox的表达式
    mapbox 不加载地图
    SQL Server将查询出数据进行列转行操作
    SQL Server 常用近百条SQL语句(收藏版)
    SQL Server DATEDIFF() 函数用法
    SQL Server 数据库开启日志CDC记录,导致SQL Server 数据库日志异常增大
    查询SQL Server数据库使用的版本号信息
    windows 无法启动 SQL Server (MSSQLSERVER) 服务(位于本地计算机上)。错误 1069由于登入失败而无法启动 。
    SQL Server 不同数据间建立链接服务器进行连接查询
  • 原文地址:https://www.cnblogs.com/grasp/p/11804424.html
Copyright © 2011-2022 走看看