MyBatis 动态sql(新手版)详细

目录

1.什么是mybatis动态sql

     mybatis动态sql标签以及属性的作用

2.示例代码

1.<if test=" ">

2.<choose>

3.<trim>

4.<foreach>

5.<set>

6.<where>

3.Mybatis 动态sql 的好处


1.什么是mybatis动态sql

        MyBatis动态SQL是指在进行数据库操作时,根据不同的条件动态生成SQL语句的功能。传统的SQL语句是静态的,即固定不变的字符串。而使用动态SQL可以根据不同的条件来拼接生成不同的SQL语句,从而实现更加灵活和可复用的数据库访问。

        动态SQL使得在不同的条件下执行不同的查询、插入、更新或删除操作变得非常方便。它能够避免因为大量的if-else语句导致代码冗长和维护困难的问题。

     mybatis动态sql标签以及属性的作用

<if test=" ">

        用于在SQL语句中添加条件判断test:指定条件表达式,用于判断是否执

行该if块内的SQL语句

<choose>

        标签没有特定的属性,只需将<when><otherwise>标签作为其子标签使用,

<choose>标签的作用是在多个条件中选择符合条件的分支进行处理

<trim>

用于去除或添加SQL语句中的特定部分,

  • prefix:在生成的SQL语句前添加前缀。
  • prefixOverrides:去除生成的SQL语句开头多余的内容。
  • suffix:在生成的SQL语句后添加后缀。
  • suffixOverrides:去除生成的SQL语句结尾多余的内容
<foreach>

用于循环遍历集合,并将集合元素作为参数传递给SQL语句的占位符

  • collection:指定要遍历的集合或数组。
  • item:指定当前遍历项的别名。
  • index:指定当前遍历项的索引别名。
  • open:指定生成的SQL语句的起始字符。
  • separator:指定生成的SQL语句每个遍历项之间的分隔符。
  • close:指定生成的SQL语句的结束字符。
  • jdbcType:指定遍历项的JDBC类型。
 <set>

        标签的作用是生成UPDATE语句中的SET子句,并根据条件动态拼接需要

更新的字段和对应的值。它通常和<if>标签或其他动态SQL标签一起使用。

<where>

        作用是生成SQL语句中的WHERE子句,并根据条件动态拼接查询条件。它通

常和<if>标签或其他动态SQL标签一起使用。

        这些标签可以组合使用,以根据不同的条件生成不同的SQL语句,可以根据具体需求进行设置,以实现动态生成符合条件的SQL语句。通过灵活应用这些属性,可以使得SQL语句更加可读性高、可维护性强,并且适应不同的业务场景。

2.示例代码

<if test=" ">

<select id="getSupplierBysupCodesupName" parameterType="Supplier" resultType="Supplier">
  SELECT * FROM t_supplier
  WHERE 1=1
    <if test="supCode!= null">
      AND supCode= #{supCode}
    </if>
    <if test="supName!= null">
      AND supName= #{supName}
    </if>
</select>

        通过这样的配置,我们可以根据传入的参数动态生成符合条件的SQL语句。使用<if>标签时,需要注意将它放置在适当的位置,以确保生成的SQL语句的语法正确。在示例中,我们将<if>标签放在WHERE子句中,并使用1=1作为初始条件,这样可以确保WHERE子句始终以AND开头。

<choose>

<select id="getSupllierBysupCodesupName" parameterType="Supplier" resultType="Supplier">
  SELECT * FROM t_supplier
  WHERE 
    <choose>
      <when test="supCode!= null">
        supCode= #{supCode}
      </when>
      <when test="supName!= null">
        supName= #{supName}
      </when>
      <otherwise>
        id= '1'
      </otherwise>
    </choose>
</select>

  <choose>标签来处理多条件判断。首先,它会尝试匹配第一个<when>标签中的条件表达式,如果满足条件,则执行对应的SQL语句;如果不满足,则继续匹配下一个<when>标签,直到找到满足条件的分支。如果所有的<when>标签都不满足条件,则会执行<otherwise>标签内的SQL语句

<trim>

    <select id="getSupllierAllByidsupCodesupName" resultType="Supplier" parameterType="Supplier">
        SELECT * FROM t_supplier
        <trim prefix="WHERE" prefixOverrides="AND|OR">
            <if test="id!=null">
                AND id=#{id}
            </if>
            <if test="supCode!=null">
                AND supCode=#{supCode}
            </if>
            <if test="supName!=null">
                AND supName=#{supName}
            </if>
        </trim>
    </select>

        首先,我们指定prefix="WHERE",这样生成的SQL语句会以WHERE关键字开头,使用prefixOverrides="AND | OR "来去除生成的SQL语句中多余的AND或OR连接词,保证生成的WHERE子句的语法正确。

<foreach>

<delete id="delManySupllierById" parameterType="java.lang.Integer">
        DELETE FROM t_supplier WHERE id IN
        <foreach collection="ids" item="id"
                 open="(" separator="," close=")">
            #{id}
        </foreach>
    </delete>

        在<foreach>标签中,我们指定了item="id",表示在每次迭代中,将当前遍历到的元素赋值给名为id的变量。collection="ids"表示要遍历的集合对象是ids,即传入的用户ID列表。<foreach>标签内部,我们使用open="("separator=","close=")"来指定循环生成的SQL代码的开头、分隔符和结尾。这样,在生成的SQL语句中,会将用户ID列表拼接成类似 (1, 2, 3) 的形式批量删除

<set>

<update id="updSupplier" parameterType="Supplier">
  UPDATE t_supplier
  <set>
    <if test="supName!= null">
      supName= #{supName},
    </if>
    <if test="supCode!= null">
      supCode= #{supCode},
    </if>
  </set>
  WHERE id = #{id}
</update>

  <set>标签来生成UPDATE语句中的SET子句,用于指定要更新的字段和对应的值。在<set>标签内部,我们使用了多个<if>标签来根据条件判断是否需要更新相应的字段。注意每个被更新的字段后面都需要有逗号作为分隔符。这样,在执行UPDATE语句时,只会更新非空字段对应的值。最后,我们通过WHERE id = #{id}来指定更新的条件。

<where>

<select id="getSupllierBysupCodesupName" parameterType="Supplier" resultType="Supplier">
  SELECT * FROM t_supplier
  <where>
    <if test="supName!= null">
      AND supName= #{supName}
    </if>
    <if test="supCode!= null">
      AND supCode= #{supCode}
    </if>
  </where>
</select>

        注意,通过使用<where>标签,可以自动去除多余的AND连接词。如果没有任何条件满足,最终生成的SQL语句中不会出现WHERE关键字,而只会保留原始的SELECT语句。

3.Mybatis 动态sql 的好处

  1. 简化条件拼接:动态SQL使得条件拼接变得更加灵活和直观。可以根据不同的条件动态生成查询语句,避免了手动拼接字符串的复杂性和潜在的安全风险。

  2. 提高代码可读性:通过使用动态SQL,可以将不同的条件判断以结构化的方式呈现,使得SQL语句更易于理解和维护。可读性提高了代码的可维护性和可扩展性。

  3. 减少数据库负担:动态SQL可以根据具体的条件生成精确的SQL语句,避免了不必要的查询或更新操作,减少了数据库的负担和网络传输数据量。

  4. 增强性能优化:动态SQL可以根据不同的条件生成不同的执行计划,从而实现更好的性能优化。可以针对特定的查询场景生成最优化的SQL语句,提升查询效率。

  5. 支持批量操作:动态SQL支持批量操作,可以循环遍历集合对象,并根据集合元素生成相应的SQL代码。这在处理批量插入、更新或删除等操作时非常实用,能够大大提高数据库操作的效率。

        总之,动态SQL是MyBatis强大的特性之一,它能够根据不同的条件动态生成SQL语句,提高代码的灵活性、可读性和性能优化能力。通过合理使用动态SQL,可以简化开发工作、减少数据库负担,同时提升应用程序的性能和可维护性。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值