【JavaEE】之MyBatis动态SQL
动态SQL就是在SQL语句中添加一些标签,以完成某些逻辑。通常用到的动态SQL标签有<if>、<choose>、<where>、<trim>、<set>、<foreach>、<bind>、<sql>等。
1、if
if是简单的条件判断,通过if语句我们可以实现某些简单的条件选择,一个例子的代码如下:
<select id="dynamicIfTest" parameterType="Blog" resultType="Blog">
select * from t_blog where 11 = 1
<if test="title != null">
and title = #{title}
</if>
<if test="content != null">
and content = #{content}
</if>
<if test="owner != null">
and owner = #{owner}
</if>
</select>
2、choose
choose标签的作用就相当于JAVA中的switch语句,只不过不是使用case与default搭配,而是使用when和otherwise搭配。一个例子的代码如下:
<select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">
select * from t_blog where 11 = 1
<choose>
<when test="title != null">
and title = #{title}
</when>
<when test="content != null">
and content = #{content}
</when>
<otherwise>
and owner = "owner1"
</otherwise>
</choose>
</select>
choose语句和JAVA中的switch语句类似,都是按顺序从上向下判断,一旦有某个when的条件满足的时候,就会跳出choose,当所有when中的条件都不满足,就会执行otherwise中的语句。
3、trim
trim标签的作用是可以在自己包含的内容前后加上前缀或后缀,与之对应的属性是prefix和suffix;trim标签也可以把包含内容中首、尾部的某些内容覆盖(即忽略),对应的属性是prefixOverrides和suffixOverrides。一个例子的代码如下:
<select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">
select * from t_blog
<trim prefix="where" prefixOverrides="and|or">
<if test="title != null">
title = #{title}
</if>
<if test="content != null">
and content = #{content}
</if>
<if test="owner != null">
or owner = #{owner}
</if>
</trim>
</select>
上面这段代码的意思是:在这段代码的最前面加一个前缀where,然后把可能位于最前面的and或or给覆盖(忽略)掉。正因为trim标签有这样的功能,所以我们也可以非常简单的利用trim来代替where元素的功能。
4、where
where标签的作用是为了简化SQL语句中where的条件判断的,一个例子的代码如下:
<select id="dynamicWhereTest" parameterType="Blog" resultType="Blog">
select * from t_blog
<where>
<if test="title != null">
and title = #{title}
</if>
<if test="content != null">
and content = #{content}
</if>
<if test="owner != null">
and owner = #{owner}
</if>
</where>
</select>
where标签的作用是会在写<where>的地方自动输出一个where,即省略了SQL语句中的where关键字;像上面这段动态SQL,假如第一个判断成立,那么MyBatis为我们生成的SQL语句是:select * from t_blog where title = #{title}; ,而不是:select * from t_blog where and title = #{title},即MyBatis的动态SQL会自动把第一个多余的and去掉,如果将这里的and换成or,也会有同样的效果。
5、set
set标签主要用在更新操作的时候,它的功能和where元素差不多,主要是在包含的语句最前面添加一个set前缀,然后如果所包含的语句是以逗号结尾的话就将该逗号忽略,如果set包含的内容为空的话就会报错。一个例子的代码如下:
<update id="dynamicSetTest" parameterType="Blog">
update t_blog
<set>
<if test="title != null">
title = #{title},
</if>
<if test="content != null">
content = #{content},
</if>
<if test="owner != null">
owner = #{owner}
</if>
</set>
where id = #{id}
</update>
在上面这段代码中,如果set中的三个判断都不成立,即set中的内容为空,那么就会报错。有了set标签,我们就可以动态的更新那些修改了的字段了。
6、foreach
foreach标签主要用于构建in条件,它可以在SQL语句中迭代一个集合。foreach标签的属性有item、index、collection、open、separator、close,其中,item表示集合中的元素进行迭代时的别名;index指定当前迭代的位置;open指定这段SQL的前缀;separator指定每个迭代元素之间的分隔符;close指定这段SQL的后缀;collection指定集合类型:
(1)如果传入List列表,则collection的属性值为list,示例代码如下:
<select id="dynamicForeachTest" resultType="Blog">
select * from t_blog where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
(2)如果传入数组,则collection的属性值为array,示例代码如下:
<select id="dynamicForeach2Test" resultType="Blog">
select * from t_blog where id in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
(3)如果传入Map集合,则collection的属性值是Map集合的key,示例代码如下(在这个例子中,Map中存储着一个key是ids的List):
<select id="dynamicForeach3Test" resultType="Blog">
select * from t_blog where title like "%"#{title}"%" and id in
<foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
(4)如果是Set集合,且Set中每个元素的类型是Map.Entry时,则collection的属性值为collection,此时index属性代表Map.Entry的key,item属性代表Map.Entry的value。示例代码如下:
<select id="dynamicForeachTest" resultType="Blog">
select * from t_blog where id in
<!-- 遍历的对象是Map.Entry时,index代表对应的key,item代表对应的value -->
<foreach collection="collection" index="key" item="value" open="(" separator="," close=")">
#{key}, #{value}
</foreach>
</select>
7、bind
bind标签主要用于模糊查询的字符串拼接,一个例子的代码如下:
<select id="fuzzyQuery" resultType="Blog" parameterType="java.lang.String">
<bind name="titleLike" value="'%'+_parameter+'%'"/>
select * from t_blog where title like #{titleLike}
</select>
8、SQL
有时,如果动态SQL中包含的代码过长,且有可能在不同的SQL语句中重复用到,那么就可以将这段SQL提取出来作为SQL片段(也相当于封装)。抽取出来的SQL语句使用<sql>标签包裹,在使用到某个SQL片段时,使用<include>标签引入SQL片段。一个例子的代码如下:
<!-- 被抽取出来的SQL片段(id是这个SQL片段的唯一标识) -->
<!-- 注意:SQL片段一般都是基于单表创建的;SQL片段中最好不要包括where语句 -->
<sql id="blog_query">
<if test="title!=null">
and title = #{title}
</if>
</sql> <select id="findEmplyeeListDynamicSQL" parameterType="Blog" resultType="Blog">
SELECT * FROM t_blog
<where>
<!-- 引用抽取出来的SQL片段。如果要引用的SQL片段在其他mapper文件中,则需要在前面添加namespace -->
<include refid="blog_query"></include>
</where>
</select>
【JavaEE】之MyBatis动态SQL的更多相关文章
- mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句
mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...
- 自己动手实现mybatis动态sql
发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...
- Mybatis动态SQL单一基础类型参数用if标签
Mybatis动态SQL单一基础类型参数用if标签时,test中应该用 _parameter,如: 1 2 3 4 5 6 <select id="selectByName" ...
- 超全MyBatis动态SQL详解!( 看完SQL爽多了)
MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...
- Mybatis动态SQL简单了解 Mybatis简介(四)
动态SQL概况 MyBatis 的强大特性之一便是它的动态 SQL 在Java开发中经常遇到条件判断,比如: if(x>0){ //执行一些逻辑........ } Mybatis应用中,S ...
- mybatis原理分析学习记录,mybatis动态sql学习记录
以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...
- mybatis 动态sql和参数
mybatis 动态sql 名词解析 OGNL表达式 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性, ...
- MyBatis动态SQL之一使用 if 标签和 choose标签
bootstrap react https://segmentfault.com/a/1190000010383464 xml 中 < 转义 to thi tha <if test=&qu ...
- MyBatis动态SQL(认真看看, 以后写SQL就爽多了)
目录 0 一起来学习 mybatis 1 数据准备 2 if 标签 2.1 在 WHERE 条件中使用 if 标签 2.1.1 查询条件 2.1.2 动态 SQL 2.1.3 测试 2.2 在 UPD ...
随机推荐
- Linux Capabilities 入门教程:基础实战篇
该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 待续... 上篇文章介绍了 Linux capabilit ...
- H5 + WebGL 实现的地铁站 3D 可视化系统
前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...
- JavaSE语法
二.JavaSE语法(上) 1.Java 有没有 goto 语句? goto 是 Java 中的保留字,在目前版本的 Java 中没有使用.根据 James Gosling(Java 之父)编写的&l ...
- python之装饰器的概念
装饰器对于程序来说虽然不是必要的,但有时候却可以提高效率,也可以保证程序的安全. 说装饰器之前需要掌握闭包,前面一篇文章已经介绍过,这里不再重复. 那么,装饰器到底是什么东西呢?看下面这个例子 首先定 ...
- ElasticSearch(五):Mapping和常见字段类型
ElasticSearch(五):Mapping和常见字段类型 学习课程链接<Elasticsearch核心技术与实战> 什么是Mapping Mapping类似数据库中的schema的定 ...
- 一个帮助理清思路的神奇工具--debug
今天在回顾复习之前的知识的时候,对嵌套循环犯了迷糊,于是我使用了debug这个方法,不仅让我弄清楚嵌套循环输出结果是如何得来,也让我明白了具体流程. 在这里,IDE我使用的是PyCharm,自然用它自 ...
- Python基础学习(一)之Python的概述与环境安装
Python介绍 Python语言介绍 Python是一门高级的.面向对象的.解释性.脚本语言. 高级语言:贴近开发者,对应底层语言,底层语言贴近机器:java.C#.php .ruby 面向对象对应 ...
- linux 系统移植uboot
这里使用的版本为:u-boot-2014.04 查看并修改位置如下:u-boot-2014.04/include/configs/at91sam9x5ek.h(1)查看一下Linux内核在NandFl ...
- Keras 中间层可视化,附代码详解,以Mnist数字为对象
最近搭建了个Resnet50 的神经网络模型,相看一看中间某一层的输出结果,想感性的感受下逐层提取特征的过程,以数字0为对象,对数字0逐层提取特征,话不多说直接上代码,关于如何搭建Resnet,可以参 ...
- maven打包记录1
在需要打包的项目目录下找到pom.xml文件 (过程中可能遇到 :-Dmaven.multiModuleProjectDirectory system property is not set. Che ...