JavaWeb-36-Mybatis动态SQL

Mybatis动态SQL

一、问题分析

image-20230917182207613

  • 假如用户不输入任何条件来查询,是可以的
  • 假如用户只输入姓名、性别或入职日期条件来查询,都是可以的

  • 但是我们之前写的sql语句,是必须同时满足三个条件才可以查询到数据,否则是不行的

    image-20230917182502719


    image-20230917183238499

  • 这样肯定是不行的,因此需要使用 动态SQL


二、介绍

  • 随着用户的输入或外部条件的变化而变化的SQL语句,我们称为 动态SQL

    image-20230917182725633


三、<if>

1. 介绍
  • <if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
  • <where>:where 元素只会在子元素有内容的情况下才插入where子句而且会自动去除子句的开头的AND 或OR

2. 优化
(1) <if>标签
  • 用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。

image-20230917185421374


(2) 测试
① 姓名条件
  • ①. 查询名字中有 “张” 的员工

    image-20230917185746236


② 性别条件
  • ②. 查询性别为 “女” 的员工

    image-20230917185921429


    image-20230917190244003

    image-20230917190233780


    image-20230917190444021


    image-20230917190648357


(3)<where>标签
  • where 元素只会在子元素有内容的情况下才插入where子句而且会自动去除子句的开头的AND 或OR

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


(4) 测试(<where>标签作用)
① 性别条件
  • <where>作用①:会自动去除子句的开头的 ANDOR

image-20230917191643558


image-20230917191832919



② 空条件
  • <where>作用②:where 元素只会在子元素有内容的情况下才插入where子句

image-20230917192030867


image-20230917192141164


3. 案例
  • 完善更新员工功能,修改为动态更新员工数据信息

(1) 需求
  • 动态更新员工信息,如果更新时传递有值,则更新;如果更新时没有传递值,则不更新。

(2) 解决方案
  • 动态SQL

(3) 分析
  • 之前使用Java注解的形式

    image-20230917200949575


    image-20230917201216222


    image-20230917201353509


  • 原因

    image-20230917201532579


(4) 实现
①. XML
  • 自动生成,并补充sql语句

    image-20230917202150241


    image-20230917202818444


②. 测试
  • 正常:

image-20230917203031878


image-20230917203150004


image-20230917203302386



  • 异常:

image-20230917203554785


image-20230917203804297


(5) <set>标签
  • 动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)

image-20230917204430887


  • 测试:

image-20230917204539598


image-20230917204811584


4. 小结

1.<if>

  • 用于判断条件是否成立,如果条件为true,则拼接SQL。

  • 形式:

    <if test="name != null"></if>
    

2.<where>

  • where 元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND 或OR

3.<set>

  • 动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)


四、<foreach>

1. 介绍
  • 格式
<foreach collection=""  item="" separator="" open="" close="">...</foreach>

  • 属性介绍
    • collection:集合名称
    • item:集合遍历出来的元素/项
    • separator:每一次遍历使用的分隔符
    • open:遍历开始前拼接的片段
    • close:遍历结束后拼接的片段

  • 业务场景

    image-20230917212048708


2. 批量删除
(1) SQL分析
  • 例如:批量删除如下员工

image-20230917210901034


-- 批量删除员工
delete from emp where id in (19,21,23);

image-20230917211012579


(2) Mybatis实现
  • Mapper接口方法:

    image-20230917211547470


  • XML映射文件SQL:

    image-20230917211531666


  • 测试:

    • 批量删除如下员工:

      image-20230917211737623


      image-20230917211935075


      image-20230917212016203


五、<sql>&<include>

1. 介绍
(1) <sql>
  • <sql>:定义可重用的 SQL 片段。

(2) <include>
  • <include>:通过属性 refid,指定包含的sql片段。

(3) 问题分析
  • 问题分析:

    image-20230917213634616


  • 解决问题:

    • 比如我们编写Java代码时,如果有些代码块功能经常被复用,那么我们就会将其抽取出来,封装到一个方法里
    • 这样其他地方需要用到此功能时,可通过调用该方法来使用该功能。

    image-20230917214036447


    image-20230917225715375


2. 实现
  • XML映射文件

image-20230917225105813


image-20230917225421804


  • 测试

image-20230917225648499


六、总结

1.XML映射文件

  • 映射配置文件名与Mapper接口名一致,且放在相同的包下(同包同名)。
  • 映射配置文件的namespace属性与Mapper接口的全类名一致。
  • XML映射文件中sql语句的id与Mapper 接口中的方法名一致。

2.动态SQL

<if>
<where>
<set>
<foreach>
<sql>
<include>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值