您的位置:首页 > 文旅 > 旅游 > 后端之路第三站(Mybatis)——动态操作sql

后端之路第三站(Mybatis)——动态操作sql

2024/12/23 9:23:46 来源:https://blog.csdn.net/m0_73991249/article/details/140079978  浏览:    关键词:后端之路第三站(Mybatis)——动态操作sql

一、啥是动态操作sql

还是用之前我们的员工管理系统打比方,假设我现在的需求是:不只是完全把姓名、性别、入职时间都输入才能查到信息,我希望只输入姓名的话就根据姓名返回信息,只输入性别的话就根据性别返回信息,只输入入职时间的话就根据这个返回,输入哪个信息就根据哪个信息查询

可是我们sql语句里已经写死了条件啊,少一个条件就会报错

这时就要用到【动态sql】,Mybatis提供了【动态sql】的方法,不单单是动态的设置参数值,还能动态地修改条件

这里我就要道个歉了,上一篇我说XML映射文件没用,非也,就是XML映射文件才提供了动态sql地语法

二、XML映射文件里动态sql

1、if语法

那么我们要实现那个【输入哪个信息就根据哪个信息查询】功能,就能想到 if条件判断

if(有“姓名”的值传回),那就在where后面接上name的查询条件

if(有“性别”的值传回),那就在where后面接上gender的查询条件

......

if(啥值都没有传回),那就后面连where也不需要了,直接select * from emp order by update_time desc;就够了

那么在XML实现这些语法就是由它提供的<where></where>、<set></set><if test="..."></if>标签

<where></where>的作用:

1、它是针对【select】的查询语句有用的标签

2、动态根据if判断条件符不符合,如果都不符合,sql语句就没必要带个where,自动不显示

3、如果前一个if不符合条件而后一个符合,那么自动检查到符合条件的那个sql部分,把“and”去掉。

比如案例里不传name值,但是有gender,就会变成select * from emp where and gender = ? order by update_time desc;那就报错了。

但是加上<where></where>之后,就会把and删掉,变成select * from emp where gender = ? order by update_time desc;就对了

<set></set>的作用:

1、它是针对【update】的更新语句有用的标签

2、如果一个if不符合条件而另一个符合,那么自动检查到符合条件的那个sql部分,把结尾的“ ,”逗号去掉。

比如案例里更新员工信息时只传name值,后面啥都没有了,就会变成update emp set name = ? , where id = ?;那就报错了。

但是加上<set></set>之后,就会把 “,” 删掉,变成update emp set name = ? where id = ?;就对了

<if test="..."></if>:

就跟if-else语句一样判断是否有值的,有的话就拼接上标签里的sql语句

test="..."里写判断条件就行了

案例一:查询sql操作

只根据 “姓名” 进行查询返回信息

案例2:更新sql操作

动态更新员工信息,只更【新用户名】和【姓名】,其他信息保持不变

EmpMapper接口先写一个更新方法

【Alt + 回车】到XML文件生成对应sql代码区

这里有个快捷方式:【Ctrl + Alt + L】可以把代码格式化更美观

然后换成<set></set>搭配<if></if>

然后外部调用方法时,之传入name值

总结

2、foreach循环

现在我有这么一个需求:点击复选框,勾选几个我们就批量删除几个

在sql里批删除是这样

转到Mybatis就是这样

但是注意!!!!!!!!!!!!!!!!!

一定他麻的要加这个【@Param("参数")】,视频教程里没啥,网上教程也没提,真是塔玛得离谱,我一开始安装标准的写法步骤一个变量对应一个变量,但是到最后傻逼spring boot就是塔玛得报错,知道老子问了半天ai才知道又是要加这个!!!!!

那么现在想要根据外部传入的【装有id的List参数】:[?,?,?,?,?......]来遍历,动态拼接成delete from emp where id in (?,?,?,?,?......)的话,就要用到foreach

foreach里四个属性作用:

        collection:要遍历的那个【数组/集合】的参数名

        item:代表遍历的每一个成员,自定义随便起名就行

        separator:分隔符,比如(18,20,21)的分隔符就是“,”

        open:拼接在开头的片段,比如(18,20,21)的开头是“(” #close:拼接在结尾的片段,比如(18,20,21)的结尾是“)”

最后测试的时候把装着id=18、id=19、id=20的集合传入即可

3、sql跟include

有的时候我们要写的sql语句要很长的话,如果同样的部分在多个sql语句都出现了,那么我们就可以抽取出来复用

就像封装一个函数在外面任意调用、一个组件在其它页面引入调用一样

例子:黑马说select * 不好,要把 * 换成把所有字段都写出来,我不明白为什么,不知道是不是又是他在那瞎说,反正总而言之,如果这么写的话就会有很长的一段语句要写,那多个sql语句都要这么写的话,我们就应该把这一部分封装起来

就要用到<sql></sql>跟<include></include>,简单说:

<sql></sql>就是包住你要用的sql语句的部分,用id给这个sql起个名,你可以理解为定义了一个全局变量

<include></include>就是把那一部分引入,refid绑定上<sql>的id名就行

搞定,运行跟之前一样

总结

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com