mybatis提供了9种动态sql标签:trim、where、t、foreach、if、choo、when、otherwi、bind;
其执行原理为,使用ognl从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。
if : 当参数满足条件才会执行某个条件
<lect id="findname" resulttype="string"> lect stu.name from tab_stu stu where age = 20 <if test="name != null"> and name like #武汉市旅游景点{name} </if></lect>
choo、when、otherwi : choo标签是按顺序判断其内部when标签中的test条件是否成立,如果有一个成立,则choo结束;如果所有的when条件都不满足时,则执行otherwi中的sql。类似于java的switch语句。
<lect id="findname" resulttype="string"> lect stu.name from tab_stu stu where age = #{age} <choo商鞅变法时间> <when test="name != null"> and name like #{name}</when><when test="class != null">and class like #{class}</when><otherwi>and class = 1</otherwi> </choo></lect>
<lect id="findname" resulttype="string"> lect stu.name from tab_stu stu where <if test="age != null">age = #{age}</if> <if test="name!= null">and name= #{name}</if> <if test="class!= null">and class = #{class}</if> </lect>
当第一个if不满或第一第二第三个if都不满足,会出现以下情况
lect stu.name from tab_stu stu where and name = "小米" and class ="1班”;lect stu.name from tab_stu stu where;
这会导致查询失败。使用where标签可以解决这个问题
<lect id="findname" resulttype="string"> lect stu.name from tab_stu stu <where> <if test="age != null">age = #{age}</if> <if test="name!= null">and name= #{name}</if> <if test="class!= null">and class = #{class}</if> </where></lect>
where标签会在只有一个以上的if条件满足的情况下才去插入where关键字,而且,若最后的内容是”and”或”or”开头的,where也会根据语法绝对是否需要保留。
t标签用于解决动态更新语句存在的符号问题
<update id="updatestu">update tab_stu<t><if test="name != null"> name=#{name},</if><if test="age != null"> age=#{age},</if><if test="class != null"> class=#{class},</if><if test="subject != null"> subject=#{subject}</if></t>镭射脱毛</update>
t标签会动态前置t关键字,同时也会消除无关的逗号,因为用了条件语句后,可能就会在生成的赋值语句的后面留下逗号。
trim:trim标签可实现where/t标签的功能
trim标签有4个属性,分别为prefix、suffix、prefixoverrides、suffixoverrides
prefix:表示在trim标签包裹的sql前添加指定内容
suffix:表示在trim标签包裹的sql末尾添加指定内容
prefixoverrides:表示去掉(覆盖)trim标签包裹的sql指定首部内容,去掉多个内容写法为and |or(中间空格不能省略)(一般用于if判断时去掉多余的a美德nd |or)
suffixoverrides:表示去掉(覆盖)trim标签包裹的sql指定尾部内容(一般用于update语句if判断时去掉多余的逗号)
<lect id="findname" resulttype="string"> lect stu.name from tab_stu stu <trim prefix="where" prefixoverrides="and |or"><if test="age != null">age = #{age}</if> <if test="name!= null">and name= #{name}</if> <if test="class!= null">or class = #{class}</if> </trim></lect>
<update id=”updatestu”>update tab_stu<trim prefix="t" subfix="where id=#{id}" suffixoverrides=","><if test="name != null"> name=#{name},</if><if test="age != null"> age=#{age},</if><if test="class != null"> class=#{class},</if><if test="subject != null"> subject=#{subject}</if></trim></update>
foreach:对集合进行遍历
<lect id="findname" resulttype="string"> lect stu.name from tab_stu stu where id in<foreach item=”item” index=”index” collection=”listname” open=”(” parator=”,” clo=”)”>#{item}</foreach></lect>
下面是foreach标签的各个属性:
collection:迭代集合的名称,可以使用@param注解指定,该参数为必选(java入参,相对于#{listname})
item:表示本次迭代获取的元素,若collection为list、t或数组,则表示其中元素;若collection为map,则代表key-value的value,该参数为必选
index:在list、t和数组中,index表示当前迭代的位置,在map中,index指元素的key,该参数是可选项
open:表示该语句以什么开始,最常使用的是左括弧”(”,mybatis会将该字符拼接到foreach标签包裹的sql语句之前,并且只拼接一次,该参数是可选项
clo:表示该语句以什么结束,最常使用的是右括弧”)”,mybatis会将该字符拼接到foreach标签包裹的sql语句末尾,该参数是可选项
parator:mybatis会在每次迭代后给sql语句添加上parator属性指定的字符,该参数是可选项
bind:bind标签可以从ognl(对象图导航语言)表达式中创建一个变量并将其绑定到上下文
mybatis中使用mysql的模糊查询字符串拼接(like) 中也涉及到bind的使用
<lect id="findname" resulttype="string"> lect stu.name from tab_stu stu <where> <if test="name!= null"> <bind name="stuname" value="'%'+stuname+'%'"小数的意义>name like #{stuname}</if> </where></lect>
到此这篇关于mybatis的9种动态标签详解的文章就介绍到这了,更多相关mybatis动态标签内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 02:48:29,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/faf1cb6feb6beed9baf573944eba2bea.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:MyBatis的9种动态标签详解.doc
本文 PDF 下载地址:MyBatis的9种动态标签详解.pdf
留言与评论(共有 0 条评论) |