[Mybatis]Mybatis 常用标签及功能整理
Mybatis中生成动态SQL的标签有四类,分别是:
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
1、if
当需要动态生成where条件时,可以使用if标签:
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null and title != ''">
AND title like #{title}
</if>
</select>
当if中的条件成立时,语句块中的内容将会被加到sql中,多个查询调价可以叠加多个 if标签
2、choose, when, otherwise
当需要从多个条件中选择一项时,可以使用choose元素:
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
choose标签只会将第一个成立的<when>标签中的语句加到sql中,如果所有的<when>都不成立,则取otherwise中的语句
3、trim, where, set
在1中的示例中,假定有where条件的情况
WHERE state = ‘ACTIVE’
如果所有where条件都需要动态生成,就需要解决一个问题:谁是第一个条件。
因为where语句中,第一个条件不需要加and(或者or),而第二个之后的条件需要and(或者or),如果你用if标签这样写:
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
当所有条件都不匹配时,生成的SQL是这样的:
SELECT * FROM BLOG
WHERE
或者第一个条件不成立,第二个条件成立时,生成的SQL是这样的:
SELECT * FROM BLOG
WHERE
AND title like ‘someTitle’
显然,这都是有语法错误的SQL语句。
Mybatis的Where标签可以解决这个问题
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
<where>会自动去除多余的AND 或者OR
类似的,当update语句中set更新相关字段时,也会遇到类似的问题,生成的SQL语句可能会多或者少一个逗号。
Mybatis的<set>标签就是用来解决这个问题的:
<update id="updateAuthorIfNecessary">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>
<set>会自动去除多余的逗号
其实,<where>和<set>,都是 通过<trim>实现的:
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
<trim prefix="SET" suffixOverrides=",">
...
</trim>
<trim>中的<prefix>代表前缀,会插入到生成的条件前面,<prefixOverrides>代表去除前缀,<suffixOverrides>代表去除后缀,多个参数可以用管道符 "|" 分割
4、foreach
动态 SQL 的另外一个常用的操作需求是对一个集合进行遍历,通常是在构建 IN 条件语句的时候。比如:
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。
注意 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象传递给 foreach 作为集合参数。当使用可迭代对象或者数组时,index 是当前迭代的次数,item 的值是本次迭代获取的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。
[Mybatis]Mybatis 常用标签及功能整理的更多相关文章
- myBatis数据库常用标签
<sql id=""></sql>:封装sql语句,被其他sql调用 <include refid=""></incl ...
- 最近用到mysql和mybatis结合常用的知识点坐下整理
1.当用到集合in(x,x...)参数可以单个或者多个 ,当为单个时: findbyIds(List<Long> ids),或者findByids(Long [] ids) <se ...
- [刘阳Java]_MyBatis_映射文件的常用标签总结_第5讲
MyBatis中常用标签的总结,简单给出自己的总结 MyBatis映射文件中的标签使用介绍1.<select>:用于编写查询语句用的标签 id:表示当前<select>标签的唯 ...
- 【HTML】---常用标签(1)
Html常用标签(1) 重新整理学习下前端知识从Html标签开始.我们先看HTML 骨架格式: <!DOCTYPE html> <!--这句话就是告诉我们使用哪个html版本--&g ...
- MyBatis - 常用标签与动态Sql
MyBatis常用标签 ● 定义sql语句:select.insert.delete.update ● 配置JAVA对象属性与查询结构及中列明对应的关系:resultMap ● 控制动态sql拼接:i ...
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...
- mybatis的foreach标签
今天写sql发现了一点问题,乱弄了好久算是搞定了.关于mybatis的批量插入使用foreach插入形式为: insert into role_privilege( role_id, privileg ...
- myBatis+Spring+SpringMVC框架面试题整理
myBatis+Spring+SpringMVC框架面试题整理(一) 2018年09月06日 13:36:01 新新许愿树 阅读数 14034更多 分类专栏: SSM 版权声明:本文为博主原创文章 ...
- Mybatis中常用的SQL
1.BaseResultMap <resultMap id="BaseResultMap" type="com.stylefeng.guns.common.pers ...
随机推荐
- 学号 20175223 《Java程序设计》第9周学习总结
目录 教材学习内容总结 教材学习中的问题和解决过程 1. 输出文件时过多输出. 代码调试中的问题和解决过程 1. 问题:费马素性检验程序. [代码托管] 学习进度条 参考资料 目录 教材学习内容总结 ...
- nginx 配置 同一域名端口下,根据URL 导向不同的项目目录
我们现在拥有2个项目.但是只有一个域名,通过nginx配置来实现以下url导向不同的项目. 后台管理台:{域名}/admin 用户客户端:{域名}/client server { listen 888 ...
- 网络知识--OSI七层网络与TCP/IP五层网络架构及二层/三层网络
作为一个合格的运维人员,一定要熟悉掌握OSI七层网络和TCP/IP五层网络结构知识. 废话不多说!下面就逐一展开对这两个网络架构知识的说明:一.OSI七层网络协议OSI是Open System Int ...
- 用chrome和anywhere,配合安卓机搭建最简单的移动端页面测试。
很多时候,我们前端在写移动端页面的时候,虽然目前chrome有调试模式,可以模拟手机的部分效果,但仍有部分效果需要直接在手机上进行页面的调试,今天就在这里推荐一个适合windows+安卓的无需连接局域 ...
- python基础学习1(linux命令)
读研时转人工智能,机器学习方向,必然要用到python,于是开始自学. 1.环境: 使用linux环境下python编译,熟悉各种基本操作. 2.书籍: -- 笨方法学python -- a b ...
- 11.2.0.1单实例DGduplicate过程
记录一次duplicate完整过程1)环境说明数据库版本oracle11.2.0.1,os linux 6.6备库应用的归档,最近一次是三个月前,由于DG环境以前是好的,因此直接迁移数据即可.本次使用 ...
- Sql 查询当天、本周、本月记录、上周、上月记录
查询当天: select * from info where DateDiff(dd,datetime,getdate())=0 查询24小时内: select * from info where D ...
- excel 格式化姓名
在做excel时,难免会遇到输入姓名对齐这种情况,如果数据少时我们可以手动敲空格来进行对齐,但数据量大时,手动调整就不是好办法了. 此时我们可以通过excel自带公式对 ...
- FileUrl
package com.rscode.credits.util; import java.io.BufferedReader; import java.io.File; import java.io. ...
- basic knowledge
---恢复内容开始--- TCP/IP指的是利用IP通信时必须用到的协议群统称. 分层模型: 1.物理层:硬件. 2.数据链路层:网络接口层.当做NIC驱动程序. 3.网络层:互联网层.IP协议基于I ...