MyBatis - 动态sql

举报
斑馬斑馬 发表于 2021/09/15 11:20:15 2021/09/15
【摘要】 动态sql  MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。动态 SQL 可以彻底处理条件地串联 SQL 字符串减少程序员的压力,让程序员将更多地精力投入开发业务中。  MyBatis 中用于实现动态 SQL 的元素主要有:If 标签可以对传入的条件进行判断#{}占位符,预编译,先编译好sql语句在取值,防止sql注入(传值时使用)${}拼接符,会传入参数字符中,取值后再...

动态sql

  MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。动态 SQL 可以彻底处理条件地串联 SQL 字符串减少程序员的压力,让程序员将更多地精力投入开发业务中。

  MyBatis 中用于实现动态 SQL 的元素主要有:

If 标签可以对传入的条件进行判断

#{}占位符,预编译,先编译好sql语句在取值,防止sql注入(传值时使用)
${}拼接符,会传入参数字符中,取值后再编译sql,不能防止注入
${}适用于select * from user order by ${name}  
insert into user values (3,'jim',22)
useGeneratedKeys="true"返回主键  
keyProperty="id" 用bean下的属性接收  
keyColumn="id" 数据库中的列

where 标签

  会进行判断,如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以 AND 或 OR 开头,它会剔除掉AND 或 OR。

<select id="findUser" resultType="User">
        select * from user

    <!--
            <if test="">条件判断
            <where>当条件成立时,插入where关键字,否则不插入
                    会取出where 语句中开头的and  or 等关键字
      -->
    <where>
        <if test="address!=null">
                and address = #{address}
            </if>
        <if test="user_name!=null">
                and user_name = #{user_name}
            </if>
    </where>
</select>

trim 标签

  其实用 trim 也可以表示,当 WHERE 后紧随 AND 或则 OR 的时候,就去除 AND 或者 OR。prefix 前缀,prefixOverrides 覆盖首部指定内容

  使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分

<select id="findUser" resultType="User">
        select * from user
       
    <trim prefix="where" prefixOverrides="and | or">
        <if test="address!=null">
                and address = #{address}
            </if>
        <if test="user_name!=null">
                and user_name = #{user_name}
            </if>
    </trim>
</select>

模糊查询

<!--
    模糊查询
        1.在mapper中  user_name like '%${user_name}%'
        2.在传值时候拼接好 map.put("user_name","%j%");
        3.使用concat('%',#{user_name},'%')
  -->
<select id="findUser1" resultType="User">
        select * from user
        
    <where>
        <if test="user_name!=null">
                and user_name like concat('%',#{user_name},'%')
            </if>
    </where>
</select>

set 元素可以把最后一个逗号去掉

<update id="update" parameterType="User">
        update user 
    
    <set>
        <if test="userName!=null">
                user_name = #{userName},
            </if>
        <if test="age!=null">
                age = #{age},
            </if>
        <if test="mobile!=null">
                mobile = #{mobile},
            </if>
        <if test="address!=null">
                address = #{address}
            </if>
    </set>
        where id = #{id}

</update>

也可以使用trim实现

<update id="update" parameterType="User">
        update user
        
    <trim prefix="set" suffixOverrides=",">
        <if test="userName!=null">
                user_name = #{userName},
            </if>
        <if test="age!=null">
                age = #{age},
            </if>
        <if test="mobile!=null">
                mobile = #{mobile},
            </if>
        <if test="address!=null">
                address = #{address}
            </if>
    </trim>
        where id = #{id}

</update>

Foreach元素

  主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。

  在使用 foreach 的时候最关键的也是最容易出错的就是 collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的。

  – 如果传入的是单参数且参数类型是一个 List 的时候,collection 属性值为 list

  – 如果传入的是单参数且参数类型是一个 array 数组的时候,collection 的属性值为array

适用范围,删除多个数据

  item 表示集合中每一个元素进行迭代时的别名

  index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置

  open 表示该语句以什么开始

  separator 表示在每次进行迭代之间以什么符号作为分隔符

  close 表示以什么结束

<delete id="deleteUser" parameterType="User">
        delete  from user where id IN
        
    <foreach collection="array" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
</delete>

特殊符号处理

  在 mybatis 中的 xml 文件中,存在一些特殊的符号,比如:<、>、"、&、<>等,正常书写 mybatis 会报错,需要对这些符号进行转义。具体转义如下所示:
  特殊字符 转义字符

< &lt;
> &gt; 
" &quot; 
’ &apos;
& &amp;

  也可以使用<![CADTA[]]>来包裹特殊字符,但是这种方式所在的内容会被解析器忽略,应减少使用

<if test="id != null">
    AND 
    <![CDATA[ id <> #{id} ]]>
</if>    

  

  
————————————————
版权声明:本文为CSDN博主「肖帆咪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/XiaoFanMi/article/details/117332600

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。