zoukankan      html  css  js  c++  java
  • MyBatis(五)动态SQL 之 trim 标签

    一、trim 标签

      语法:

    <trim prefix="" suffix="" prefixOverrides="" suffixOverrides="">:截取并拼接
    

      

      属性说明:

    trim 标签用于截取并拼接,即可以在条件判断完的 SQL 语句前后,添加或者去掉指定的字符。
    prefix:(添加前缀)trim标签体中是整个字符串拼串后的结果,是给拼串后的整个字符串加一个前缀
    suffix:(添加后缀)suffix给拼串后的整个字符串加一个后缀
    prefixOverrides:前缀覆盖: 去掉整个字符串前面多余的字符(去掉前缀)
    suffixOverrides:后缀覆盖:去掉整个字符串后面多余的字符(去掉后缀)
    

      

      trim 用于自定义字符串的截取规则,后面多出的 and 或者 or 使用 where 标签不能解决。

    二、trim 标签的使用

      1、在接口中声明方法

    public List<Employee> getEmpsByConditionTrim(Employee employee);
    

      

      2、在对应的 xml 中配置

        <!--
            public List<Employee> getEmpsByConditionTrim(Employee employee);
        -->
        <!--
            trim:自定义字符串的截取规则
    
                后面多出的and或者or where 标签不能解决
                prefix="":前缀,trim标签体中是整个字符串拼串后的结果。
                           prefix 给拼串后的整个字符串加一个前缀
    
                prefixOverrides=""
                            前缀覆盖:去掉整个字符串前面多余的字符
                suffix="":后缀
                         suffix给拼接后的整个字符串加一个后缀
                suffixOverrides=""
                            后缀覆盖:去掉整个字符串后面多余的字符
        -->
        <select id="getEmpsByConditionTrim" resultType="Employee">
            select * from tbl_employee
            <trim prefix="where" prefixOverrides="" suffix="" suffixOverrides="and">
                <if test="id!=null">
                    id=#{id} and
                </if>
                <if test="lastName!=null and lastName!=''">
                    last_name like #{lastName} and
                </if>
                <if test="email!=null and email.trim()!=&quot;&quot;">
                    email = #{email} and
                </if>
                <if test="gender==0 or gender==1">
                    gender = #{gender}
                </if>
            </trim>
    
        </select>

    三、细节

      对于上一节的多条件的查询,可以使用 if 和 where 标签进行查询。

      这时把 and 关键字放在了条件的后面,又会出现什么问题呢?

      执行的 SQL 语句:

        <select id="getEmpsByConditionTrim" resultType="Employee">
            select * from tbl_employee
            <where>
                <if test="id!=null">
                    id=#{id} and
                </if>
                <if test="lastName!=null and lastName!=''">
                    last_name like #{lastName} and
                </if>
                <if test="email!=null and email.trim()!=&quot;&quot;">
                    email = #{email} and
                </if>
                <if test="gender==0 or gender==1">
                    gender = #{gender}
                </if>
            <where>
        </select>

      这时把 and 关键字放在了条件的后面,如果缺少最后一个条件,又会出现什么问题呢?

      执行的 SQL 语句:

    select * from tbl_employee where id=? and email=? and
    

      可以发现,如果最后一个查询条件不进行拼接,在后面就会多出一个 and 关键字,从而执行失败!!!

      使用 trim 标签解决问题:

        <select id="getEmpsByConditionTrim" resultType="Employee">
            select * from tbl_employee
            <trim prefix="where" prefixOverrides="" suffix="" suffixOverrides="and">
                <if test="id!=null">
                    id=#{id} and
                </if>
                <if test="lastName!=null and lastName!=''">
                    last_name like #{lastName} and
                </if>
                <if test="email!=null and email.trim()!=&quot;&quot;">
                    email = #{email} and
                </if>
                <if test="gender==0 or gender==1">
                    gender = #{gender}
                </if>
            </trim>
    
        </select>

      在 <if> 标签中进行拼接的 SQL 语句前面,需要加上 where 关键字,可以使用 trim 中的 prefix 属性来进行添加,而对于 拼接最后一个条件不成立时,后面的 and 也会去掉

      执行的 SQL 语句:

    select * from tbl_employee where id=? and email=?
    

      如果其中使用 or 进行拼接呢?

        <select id="getEmpsByConditionTrim" resultType="Employee">
            select * from tbl_employee
            <trim prefix="where" prefixOverrides="" suffix="" suffixOverrides="and">
                <if test="id!=null">
                    id=#{id} and
                </if>
                <if test="lastName!=null and lastName!=''">
                    last_name like #{lastName} and
                </if>
                <if test="email!=null and email.trim()!=&quot;&quot;">
                    email = #{email} or
                </if>
                <if test="gender==0 or gender==1">
                    gender = #{gender}
                </if>
            </trim>
    
        </select>

      那么就要在 suffixOverrides="and|or" 再添加一个 or,即去掉多个内容。

  • 相关阅读:
    Spring Aop实例之xml配置
    Spring execution 表达式
    JVM调优总结 -Xms -Xmx -Xmn -Xss
    springmvc整合redis架构搭建实例
    mysql权限操作(转)
    mybatis动态排序
    spring mvc重定向
    jquery中bind和on的区别
    在java项目中使用umeditor
    mybatis的基础Dao
  • 原文地址:https://www.cnblogs.com/niujifei/p/15239273.html
Copyright © 2011-2022 走看看