MyBatis_7
来源:互联网 发布:营销软件honghailongt 编辑:程序博客网 时间:2024/06/08 17:13
沿用之前的代码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的长度.
- MyBatis_7
- poj 1953 数列中只有0和1 且1不能和1相邻,求有几种可能
- 【JZOJ5100】【GDOI2017 day2】RPG
- MySQL数据库引擎介绍、区别、创建和性能测试的深入分析
- php最基础的东西,面试必备<2>
- 委托--事件--基础以及在现在做的项目上的实际应用(一)
- MyBatis_7
- SSL握手过程
- [Leetcode] #263#264 Ugly Number I & II
- BBIN AG亚游代理接口 娱乐城源码
- 【JZOJ5101】【GDOI2017 day2】凡喵识图
- BlueROV-7: Keep Learning Dronekit
- JAVA进阶----ThreadPoolExecutor机制
- 设计模式之建造者模式
- mybatis使用resultMap实现一对多查询 (需求:查询订单以及订单明细)