0


【SSM框架】Mybatis详解08(源码自取)之动态sql详解

  • 🧛‍♂️个人主页:杯咖啡
  • 💡进步是今天的活动,明天的保证!
  • ✨目前正在学习:SSM框架,算法刷题
  • 👉本文收录专栏:SSM框架解析
  • 🙌牛客网,刷算法过面试的神级网站,用牛客你也牛。 👉免费注册和我一起学习刷题👈
  • 🐳希望大家多多支持🥰一起进步呀!
  • 😎The man who fears losing has already lost. 怕输的人已经输了。 - 《权力的游戏》

✨前言

上一节我们复习了优化注册,#{}与¥{}区别,返回主键,UUID
这一节我们复习动态sql
**和我一起复习下去你可以获得一个比较

完美框架demo

,并且

深刻体会框架


坚持到最后的

源码解析

你会收获更多哦,

加油坚持!!!

**


文章目录


什么是动态sql

可以定义代码片断,可以进行逻辑判断,可以进行循环处理(批量处理),使条件判断更为简单.
我们假设一个场景,如果我们需要利用姓名模糊搜索或者需要利用性别进行搜索,或者我们需要两个条件同时进行限制搜索
我们知道为了防止sql注入,我们使用的都是预编译的语句,我们的sql语句就要写三套。那么mybatis就很方便的为我们提供了自动判断自动修改sql语句的方式,使我们的工作更加方便。

标签详解

<sql>
1)<sql>:用来定义代码片断,可以将所有的列名,或复杂的条件定义为代码片断,供使用时调用.

<include>
2)<include>:用来引用<sql>定义的代码片断.
<!--定义代码片断--><sqlid="allColumns">
        id,username,birthday,sex,address
    </sql>
   //引用定义好的代码片断
   <selectid="getAll"resultType="users">
        select <includerefid="allColumns"></include>
        from users
    </select>

在这里插入图片描述

<if>
3)<if>:进行条件判断

test条件判断的取值可以是实体类的成员变量,可以是map的key,可以是@Param注解的名称.

<where>
4)<where>:进行多条件拼接,在查询,删除,更新中使用.
<!--UserMapper.xml文件中--><selectid="getByCondition"parameterType="users"resultType="users">
        select <includerefid="allColumns"></include>
        from users
        <where><iftest="userName != null and userName != ''">
               and username like concat('%',#{userName},'%')
            </if><iftest="birthday != null">
               and birthday = #{birthday}
            </if><iftest="sex != null and sex != ''">
               and sex = #{sex}
            </if><iftest="address != null and address != ''">
                and address like concat('%',#{address},'%')
            </if></where></select>

在这里插入图片描述

我们看一下输入不同的查询值的sql语句的不同
当我们什么条件都没有输入,就会查询全部
在这里插入图片描述
当我们输入了性别,可以看到我们的语句是这样的
在这里插入图片描述
当我们由加入地区的模糊查询,sql语句是这样的
在这里插入图片描述
这就是动态sql给我们提供的便利,我们只需要输入我们的条件就好了,mybatis可以自动为我们调整sql语句
我们在做模糊查询的时候的一个细节:我们尽量使用concat()函数进行字符串的拼接,而不是直接like ‘xxxx’,在我们使用函数的时候更加安全方便
在这里插入图片描述

<set>
5)<set>:有选择的进行更新处理,至少更新一列.能够保证如果没有传值进来,则数据库中的数据保持不变.

这里我们需要更新的话,我们就要把这一行的所有指标都赋值,才能完成更新。如果我们只赋值一个属性(只传入我们需要修改的属性)那么其他没赋值的就变成null了。我们来看一下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
正常我们需要给所有指标(属性),全部赋值可以完成更新,那么我们试试只赋值一个属性的情况
一定要记得在我们的实体类增加新的构造方法哦,不然构造会报错哦
在这里插入图片描述
在这里插入图片描述
运行看结果

在这里插入图片描述
这里运行成功了,细心的小伙伴已经发现问题了,我们看看数据库里面吧,显然易见
在这里插入图片描述
**本来我只想修改名字,其他的不需要修改的我不想动,我还就只想输入我想修改的值,其他的为啥变成了NULL呢???那么这里

<set>

标签来帮助你,代码如下:**

<updateid="updateBySet"parameterType="users">
        update users
        <set><iftest="userName != null and userName != ''">
               username = #{userName},
            </if><iftest="birthday != null">
                birthday = #{birthday},
            </if><iftest="sex != null and sex != ''">
                sex = #{sex},
            </if><iftest="address != null and address != ''">
                address =#{address} ,
            </if></set>
        where id = #{id}
    </update>

我们来看结果吧
在这里插入图片描述
在这里插入图片描述
这下我们的目的就达到了,完美解决

<foreach>

6):用来进行循环遍历,完成循环条件查询,批量删除,批量增加,批量更新.

<!--查询实现--><selectid="getByIds"resultType="users">
        select <includerefid="allColumns"></include>
        from users
        where id in
           <foreachcollection="array"item="id"separator=","open="("close=")">
               #{id}
           </foreach></select>
<foreach>

参数详解:
collection:用来指定入参的类型,如果是List集合,则为list,如果是Map集合,则为map,如果是数组,则为array.
item:每次循环遍历出来的值或对象
separator:多个值或对象或语句之间的分隔符
open:整个循环外面的前括号
close:整个循环外面的后括号

<!--批量删除实现--><deleteid="deleteBatch">
        delete from users
        where id in
        <foreachcollection="array"item="id"separator=","open="("close=")">
            #{id}
        </foreach></delete><!--批量增加实现--><insertid="insertBatch">
        insert into users(username, birthday, sex, address) values
        <foreachcollection="list"item="u"separator=",">
            (#{u.userName},#{u.birthday},#{u.sex},#{u.address})
        </foreach></insert>

这里就只展示批量增加吧
在这里插入图片描述
在这里插入图片描述


✨总结

动态sql可以极大的简化我们sql的编写量,也是必须要掌握的东西哦!!!
下一节我们将继续复习指定参数位置,入参是map(重点掌握) ,返回值是map
本次源码放在代码仓库gitee,自取链接

      原创不易,还希望各位大佬支持一下
     
    
   
   
    \textcolor{blue}{原创不易,还希望各位大佬支持一下}
   
  
 原创不易,还希望各位大佬支持一下


 
  
   
    
     
      点赞,你的认可是我创作的动力!
     
    
   
   
    \textcolor{green}{点赞,你的认可是我创作的动力!}
   
  
 点赞,你的认可是我创作的动力!


 
  
   
    
     
      收藏,你的青睐是我努力的方向!
     
    
   
   
    \textcolor{green}{收藏,你的青睐是我努力的方向!}
   
  
 收藏,你的青睐是我努力的方向!


 
  
   
    
     
      评论,你的意见是我进步的财富!
     
    
   
   
    \textcolor{green}{评论,你的意见是我进步的财富!}
   
  
 评论,你的意见是我进步的财富!
标签: mybatis sql java

本文转载自: https://blog.csdn.net/muzi_longren/article/details/126417115
版权归原作者 风铃听雨~ 所有, 如有侵权,请联系我们删除。

“【SSM框架】Mybatis详解08(源码自取)之动态sql详解”的评论:

还没有评论