MyBatis之动态Sql

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加

MyBatis之动态Sql


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

动态SQL是MyBatis的强大功能特性之一,能够完成不同条件下的sql拼接。简单来说,动态SQL是指随着用户的输入或外部条件的变化而变化的SQL语句。

在接下来的博客中,我们将介绍MyBatis中用于生成动态SQL的标签,包括、、、和等。通过这些标签,我们可以根据不同的条件和输入来动态地构建和执行SQL语句,以满足各种数据操作需求。

在每个标签的介绍中,我们将提供示例和解释,以便您能够更好地理解和应用动态SQL。希望这个博客能够帮助您更好地掌握MyBatis的动态SQL特性,并在实际项目中实现更灵活和高效的数据访问。


提示:以下是本篇文章正文内容,下面案例可供参考

一、动态sql

if标签

标签是MyBatis中常用的动态SQL标签之一,通常用来判断条件是否成立,从而确定是否将相关的SQL语句加入到查询中。其基本语法格式如下:

xml 复制代码
<if test="判断条件">
  要执行的sql语句
</if>

其中,test属性用于指定判断条件,当条件成立时,则执行相关的sql语句。例如,以下代码可以判断uname和sex是否为空,并根据判断结果动态地生成查询语句:

xml 复制代码
<select id="selectUsersIf" parameterType="user" resultType="user">
  select * from users where 1=1
  <if test="uname!=null and uname!=''">
    and uname like "%"#{uname}"%"
  </if>
  <if test="sex!=null and sex!=''">
    and sex = #{sex}
  </if>
</select>

在上述代码中,当uname和sex不为空时,会将包含它们的查询条件加入到sql语句中。你可以根据实际情况设置不同的判断条件,以实现更灵活的查询操作。

在使用<if>标签时,需要注意的问题

  • test属性必填,该属性值是一个符合OGNL要求的判断表达式,一般只用true或false作为结果。
  • 判断条件property!= null或property == null,适用于任何类型的字段,用于判断属性值是否为空。
  • 判断条件property!= ''或property == '',仅适用于String类型的字段,用于判断是否为空字符串。
  • if中的条件不能使用&&/||,而应该使用and/or
  • if中的条件可以直接通过属性名获取参数POJO的属性值,并且该值可以调用方法。
  • where后为什么要加1=1?任意条件都可能拼接到Sql中。如果有多个条件,从第二个条件开始前都需要加And关键字。加上1=1这个永久成立的条件,就不需要考虑后面的条件哪个是第一个条件,后面的条件前都加And关键字即可。

where标签

可以代替sql中的where 1=1 和第一个and,更符合程序员的开发习惯

xml 复制代码
<select id="findByCondition" resultType="com.zhangsan.user.User" parameterType="com.itbaizhan.user.User">
   select * from user
  <where>
    <if test="username != null and username.length() != 0">
       username like #{username}
    </if>
    <if test="sex != null and sex.length() != 0">
       and sex = #{sex}
    </if>
  </where>
</select>

set标签

标签用在update语句中。借助,可以只对有具体值的字段进行更新。会自动添加set关键字,并去掉最后一个if语句中多余的逗号。

xml 复制代码
<update id="update" parameterType="com.zhangsan.user.User">
   update user
  <set>
    <if test="username != null and username.length() > 0">
       username = #{username},
    </if>
    <if test="sex != null and sex.length() > 0">
       sex = #{sex},
    </if>
  </set>
  <where>
     id = #{id}
  </where>
</update>

choose,when,otherwise标签

这些标签表示多条件分支,类似JAVA中的switch...case。类似switch,类似case,类似default,用法如下:

xml 复制代码
<select id="findByCondition" resultType="com.zhangsan.user.User" parameterType="com.itbaizhan.user.User">
   select * from user
  <where>
    <choose>
      <when test="username.length() &lt; 5">
         username like #{username}
      </when>
      <when test="username.length() &lt; 10">
         username = #{username}
      </when>
      <otherwise>
         id = 1
      </otherwise>
    </choose>
  </where>
</select>

这段代码的含义为:用户名<5时使用模糊查询,用户名>=5并且<10时使用精确查询,否则查询id为1的用户。

foreach标签

MyBatis之动态Sql的foreach标签通常用于循环遍历一个集合,在SQL语句中构建in条件语句或者批量操作语句。其主要属性有item、index、collection、open、separator和close。

item表示集合中每一个元素进行迭代时的别名;index指定一个名字,用于表示在迭代过程中,每次迭代到的位置;collection指向集合对象;open表示该语句以什么开始;separator表示在每次进行迭代之间以什么符号作为分隔符;close表示以什么结束。

你可以将任何可迭代对象,如List、Set、Map或者数组作为集合参数传递给foreach。当使用Map对象(或者Map.Entry对象的集合)时,index是键,item是值。在其他情况下,index是当前迭代的序号,item是本次遍历的对象。以下是示例:

  • foreach遍历数组
xml 复制代码
<delete id="deleteBatch" parameterType="int">
   delete from user
  <where>
    <foreach open="id in(" close=")" separator="," collection="array" item="id" >
       #{id}
    </foreach>
  </where>
</delete>
  • 遍历Collection
xml 复制代码
<insert id="insertBatch" parameterType="com.zhangsan.user.User">
   insert into user values
  <foreach collection="list" item="user" separator=",">
     (null ,#{user.username},#{user.birthday},#{user.sex},#{user.address})
  </foreach>
</insert>
  • 遍历Map
xml 复制代码
<select id="findUser" parameterType="map" resultType="com.zhangsan.pojo.User">
   select * from user
  <where>
    <foreach collection="queryMap" separator="and" index="key" item="value">
       ${key} = #{value}
    </foreach>
  </where>
</select>

总结

提示:这里对文章进行总结:

在使用MyBatis的动态SQL时,需要注意OGNL表达式的语法和语义,以及不同元素的正确使用方法和适用场景。同时,还需要合理地组织和管理动态SQL语句,以提高代码的可读性和可维护性。

相关推荐
阿伟*rui41 分钟前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
数新网络2 小时前
《深入浅出Apache Spark》系列②:Spark SQL原理精髓全解析
大数据·sql·spark
XiaoLeisj3 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck3 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei3 小时前
java的类加载机制的学习
java·学习
师太,答应老衲吧4 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Yaml45 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~5 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616885 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7895 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot