MyBatis_7 - MyBatis动态SQL

沿用之前的代码Demo

项目源代码 : MyBatis动态SQL

动态SQL


MyBatis的动态SQL包括以下几种元素:

元素

作用

备注

if

判断语句

单条件分支判断

choose(when,otherwise)

相当于Java中的case when

多条件分支判断

trim(where,set)

辅助元素

用于处理一些SQL拼装问题

foreach

循环语句

in语句等列举条件常用


if元素
if元素是我们最常用的判断语句,相当于Java中的if语句. 常与test属性联合使用

举个栗子:
我们根据studentName 这个字段去Student表中查询学生信息,如果字段不为空,进行sql语句拼接查询,字段为空,框架会抛出异常.

这里我们修改一下映射器接口的方法

输出结果: (注意查看SQL语句)

如果参数为空

choose,when,otherwise元素
这个玩意相当于Java中的switch..case..default语句
咱们看看代码吧:

解释下 : 
如果studentId不为空,拼接studentId然后直接进行查询,后面的语句不在走了
如果studentName不为空,拼接studentName,然后直接查询,后面的语句不走了..
当上面两个全部为空,走最后一个<otherwise>

数据库信息


studentId 和 studentName 都不为空情况

studentId为空 , studentName不为空的情况

studentId studentName 都为空的情况


trim , where , set元素

where
之前进行sql语句拼接时 , 会在sql语句中加入 "1=1".. 这是为了 在不满足条件的情况下,防止SQL语句出错.
比如这样子
SELECT studentId , studentName , studentAge , studentPhone FROM student where AND studentName = #{studentName}
这样子就错了....

如果使用<where>就不会这样子了...

这样子 , 只有当where元素里面条件成立的时候,才会将where这个关键字加入sql语句中,否则就不加入
查询结果:

studentName不传


trim
有时候我们需要从SQL语句中  去掉/替换 一些特殊的sql语法,比如常见的and , or.
而使用trim元素可以达到我们预期的效果.

就像这个样子...

按照我们之前的思路 出来的 sql语句是这样的:
SELECT studentId , studentName , studentAge , studentPhone FROM student  and studentName like concat('%',#{studentName},'%')
使用了<trim>之后 , 将"and" 替换为"where"

解释下 : 
prefix : 代表的是被替换/过滤后的内容
prefixOverrides : 代表的是需要替换/过滤的内容.


set
现实场景中,我想更新一个字段,如果发送所有的字段去更新,太消耗网络带宽,性能最佳是把主键和更新字段的值传递给SQL就行.
在MyBatis中,我们使用<set>来完成.

下面举个栗子 : 

注意到studentName那个语句后面有个逗号了嘛?  如果studentName成立,那是不是 后面会多一个逗号呢???
放心吧 , <set>元素帮我们解决了...
set元素遇到了逗号,会将对应的逗号去掉


foreach
foreach元素是一个循环语句 , 它的作用是遍历集合.
他能很好的支持数组和List,Set接口集合,对此提供遍历功能.

属性

描述

item

循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details

具体说明:在list和数组中是其中的对象,在map中是value

该参数为必选。

collection

要做foreach的对象,作为入参时,List<?>对象默认用list代替作为键,数组对象有array代替作为键,Map对象没有默认的键

当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:

如果User有属性List ids。入参是User对象,那么这个collection = "ids"

如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = "ids.id"

上面只是举例,具体collection等于什么,就看你想对那个元素做循环。

该参数为必选。

separator

元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。

open

foreach代码的开始符号,一般是(close=")"合用。常用在in(),values()时。该参数可选。

close

foreach代码的关闭符号,一般是)open="("合用。常用在in(),values()时。该参数可选。

index

list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。


举个栗子 : 

这里循环判断传入的studentName 有一样的就取出来...

这里需要注意 : 对于大量数据的in语句需要注意一下,以为会消耗很大的性能.有些数据库对sql长度有限制. 
我们需要预估一下 collection的长度.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mybatis-plus-generator和mybatis-plus是用于简化MyBatis开发的两个工具。mybatis-plus是一个MyBatis的增强工具包,提供了一些便捷的操作,节约了编写简单SQL的时间。而mybatis-plus-generator是一个代码生成器,可以自动生成一些基本的Controller、Service、Mapper和Mapper.xml文件。 通过整合mybatis-plus和mybatis-plus-generator,我们可以更高效地开发项目的单表增删改查功能。使用mybatis-plus-generator可以自动生成一些基本的文件,例如Controller、Service、Mapper和Mapper.xml,极大地减少了手动创建这些文件的时间和工作量。而mybatis-plus提供的便捷操作可以节约编写简单SQL的时间。 然而,对于一些逻辑复杂、多表操作或动态SQL等情况,建议使用原生SQL来处理。mybatis-plus支持原生SQL使用,通过写原生SQL可以更灵活地满足这些复杂需求。 综上所述,通过整合mybatis-plus和mybatis-plus-generator,我们可以在开发更高效地处理单表的增删改查功能,并且对于复杂的需求可以使用原生SQL来满足。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Spring cloud整合MyBatis-plus和mybatis-plus-generator](https://blog.csdn.net/cssweb_sh/article/details/123767029)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [mybatis-plus-generator(mybatisplus代码生成器篇)](https://blog.csdn.net/b13001216978/article/details/121690960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值