MyBatis之动态Sql

系列文章目录

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


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

文章目录

  • 系列文章目录
  • 前言
  • 一、动态sql
    • if标签
      • 在使用``标签时,需要注意的问题
    • where标签
    • set标签
    • choose,when,otherwise标签
    • foreach标签
  • 总结


前言

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

动态SQL是MyBatis的强大功能特性之一,能够完成不同条件下的sql拼接。简单来说,动态SQL是指随着用户的输入或外部条件的变化而变化的SQL语句。
在接下来的博客中,我们将介绍MyBatis中用于生成动态SQL的标签,包括、、、和等。通过这些标签,我们可以根据不同的条件和输入来动态地构建和执行SQL语句,以满足各种数据操作需求。
在每个标签的介绍中,我们将提供示例和解释,以便您能够更好地理解和应用动态SQL。希望这个博客能够帮助您更好地掌握MyBatis的动态SQL特性,并在实际项目中实现更灵活和高效的数据访问。


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

一、动态sql

if标签

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

<if test="判断条件">
  要执行的sql语句
if>

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

<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语句中。你可以根据实际情况设置不同的判断条件,以实现更灵活的查询操作。

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

  • 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,更符合程序员的开发习惯

<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语句中多余的逗号。

<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,用法如下:

<select id="findByCondition" resultType="com.zhangsan.user.User" parameterType="com.itbaizhan.user.User">
   select * from user
  <where>
    <choose>
      <when test="username.length() < 5">
         username like #{username}
      when>
      <when test="username.length() < 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遍历数组
<delete id="deleteBatch" parameterType="int">
   delete from user
  <where>
    <foreach open="id in(" close=")" separator="," collection="array" item="id" >
       #{id}
    foreach>
  where>
delete>

  • 遍历Collection
<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
<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语句,以提高代码的可读性和可维护性。

你可能感兴趣的:(Mybatis,sql,java,mybatis,动态sql)