MyBatis的动态SQL详解

MyBatis的动态SQL MyBatis的映射文件中支持在基础SQL上添加一些逻辑操作,并动态拼接成完整的SQL之后再执行,以达到SQL复用、简化编程的效果。Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。 阅读详情

在ibatis配置文件写SQL语句的时候对于一些比如“<”,">","<>","&"," ' "," " "是不能够识别的,并且会抛异常。

 

一般可以如下改写:

    &lt;          < 
    &gt;          >  
    &lt;&gt;   <>
    &amp;      & 
    &apos;      '
    &quot;      "

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。

MyBatis中用于实现动态SQL的元素主要有:

 

  • if
  • choose(when,otherwise)
  • trim
  • where
  • set
  • foreach
if就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择。先来看如下一个例子:
Xml代码
  1. <select id="dynamicIfTest" parameterType="Blog" resultType="Blog">  
  2.     select * from t_blog where 11 = 1   
  3.     <if test="title != null">  
  4.         and title = #{title}   
  5.     </if>  
  6.     <if test="content != null">  
  7.         and content = #{content}   
  8.     </if>  
  9.     <if test="owner != null">  
  10.         and owner = #{owner}   
  11.     </if>  
  12. </select>  
这条语句的意思非常简单,如果你提供了title参数,那么就要满足title=#{title},同样如果你提供了Content和Owner的时候,它们也需要满足相应的条件,之后就是返回满足这些条件的所有Blog,这是非常有用的一个功能,以往我们使用其他类型框架或者直接使用JDBC的时候, 如果我们要达到同样的选择效果的时候,我们就需要拼SQL语句,这是极其麻烦的,比起来,上述的动态SQL就要简单多了。

choose元素的作用就相当于JAVA中的switch语句,基本上跟JSTL中的choose的作用和用法是一样的,通常都是与when和otherwise搭配的。看如下一个例子:
Xml代码
  1. <select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">  
  2.     select * from t_blog where 11 = 1    
  3.     <choose>  
  4.         <when test="title != null">  
  5.             and title = #{title}   
  6.         </when>  
  7.         <when test="content != null">  
  8.             and content = #{content}   
  9.         </when>  
  10.         <otherwise>  
  11.             and owner = "owner1"  
  12.         </otherwise>  
  13.     </choose>  
  14. </select>  
when元素表示当when中的条件满足的时候就输出其中的内容,跟JAVA中的switch效果差不多的是按照条件的顺序,当when中有条件满足的时候,就会跳出choose,即所有的when和otherwise条件中,只有一个会输出,当所有的我很条件都不满足的时候就输出otherwise中的内容。所以上述语句的意思非常简单, 当title!=null的时候就输出and titlte = #{title},不再往下判断条件,当title为空且content!=null的时候就输出and content = #{content},当所有条件都不满足的时候就输出otherwise中的内容。

where语句的作用主要是简化SQL语句中where中的条件判断的,先看一个例子,再解释一下where的好处。
Xml代码
  1. <select id="dynamicWhereTest" parameterType="Blog" resultType="Blog">  
  2.     select * from t_blog    
  3.     <where>  
  4.         <if test="title != null">  
  5.             title = #{title}   
  6.         </if>  
  7.         <if test="content != null">  
  8.             and content = #{content}   
  9.         </if>  
  10.         <if test="owner != null">  
  11.             and owner = #{owner}   
  12.         </if>  
  13.     </where>  
  14. </select>  
 where元素的作用是会在写入where元素的地方输出一个where,另外一个好处是你不需要考虑where元素里面的条件输出是什么样子的,MyBatis会智能的帮你处理,如果所有的条件都不满足那么MyBatis就会查出所有的记录,如果输出后是and 开头的,MyBatis会把第一个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上。像上述例子中,如果title=null, 而content != null,那么输出的整个语句会是select * from t_blog where content = #{content},而不是select * from t_blog where and content = #{content},因为MyBatis会智能的把首个and 或 or 给忽略。

trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides;正因为trim有这样的功能,所以我们也可以非常简单的利用trim来代替where元素的功能,示例代码如下:
Xml代码
  1. <select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">  
  2.     select * from t_blog    
  3.     <trim prefix="where" prefixOverrides="and |or">  
  4.         <if test="title != null">  
  5.             title = #{title}   
  6.         </if>  
  7.         <if test="content != null">  
  8.             and content = #{content}   
  9.         </if>  
  10.         <if test="owner != null">  
  11.             or owner = #{owner}   
  12.         </if>  
  13.     </trim>  
  14. </select>  
 
set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出一个set,然后如果包含的语句是以逗号结束的话将会把该逗号忽略,如果set包含的内容为空的话则会出错。有了set元素我们就可以动态的更新那些修改了的字段。下面是一段示例代码:
Xml代码
  1. <update id="dynamicSetTest" parameterType="Blog">  
  2.     update t_blog   
  3.     <set>  
  4.         <if test="title != null">  
  5.             title = #{title},   
  6.         </if>  
  7.         <if test="content != null">  
  8.             content = #{content},   
  9.         </if>  
  10.         <if test="owner != null">  
  11.             owner = #{owner}   
  12.         </if>  
  13.     </set>  
  14.     where id = #{id}   
  15. </update>  
 上述示例代码中,如果set中一个条件都不满足,即set中包含的内容为空的时候就会报错。

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key
下面分别来看看上述三种情况的示例代码:
1.单参数List的类型:
Xml代码
  1. <select id="dynamicForeachTest" resultType="Blog">  
  2.     select * from t_blog where id in   
  3.     <foreach collection="list" index="index" item="item" open="(" separator="," close=")">  
  4.         #{item}   
  5.     </foreach>  
  6. </select>  
 上述collection的值为list,对应的Mapper是这样的
Java代码
  1. public List<Blog> dynamicForeachTest(List<Integer> ids);  
public List<Blog> dynamicForeachTest(List<Integer> ids);
 测试代码:
Java代码
  1. @Test  
  2. public void dynamicForeachTest() {   
  3.     SqlSession session = Util.getSqlSessionFactory().openSession();   
  4.     BlogMapper blogMapper = session.getMapper(BlogMapper.class);   
  5.     List<Integer> ids = new ArrayList<Integer>();   
  6.     ids.add(1);   
  7.     ids.add(3);   
  8.     ids.add(6);   
  9.     List<Blog> blogs = blogMapper.dynamicForeachTest(ids);   
  10.     for (Blog blog : blogs)   
  11.         System.out.println(blog);   
  12.     session.close();   
  13. }  
	@Test
	public void dynamicForeachTest() {
		SqlSession session = Util.getSqlSessionFactory().openSession();
		BlogMapper blogMapper = session.getMapper(BlogMapper.class);
		List<Integer> ids = new ArrayList<Integer>();
		ids.add(1);
		ids.add(3);
		ids.add(6);
		List<Blog> blogs = blogMapper.dynamicForeachTest(ids);
		for (Blog blog : blogs)
			System.out.println(blog);
		session.close();
	}
 
2.单参数array数组的类型:
Xml代码
  1. <select id="dynamicForeach2Test" resultType="Blog">  
  2.     select * from t_blog where id in   
  3.     <foreach collection="array" index="index" item="item" open="(" separator="," close=")">  
  4.         #{item}   
  5.     </foreach>  
  6. </select>  
 上述collection为array,对应的Mapper代码:
Java代码
  1. public List<Blog> dynamicForeach2Test(int[] ids);  
public List<Blog> dynamicForeach2Test(int[] ids);
 对应的测试代码:
Java代码
  1. @Test  
  2. public void dynamicForeach2Test() {   
  3.     SqlSession session = Util.getSqlSessionFactory().openSession();   
  4.     BlogMapper blogMapper = session.getMapper(BlogMapper.class);   
  5.     int[] ids = new int[] {1,3,6,9};   
  6.     List<Blog> blogs = blogMapper.dynamicForeach2Test(ids);   
  7.     for (Blog blog : blogs)   
  8.         System.out.println(blog);   
  9.     session.close();   
  10. }  
	@Test
	public void dynamicForeach2Test() {
		SqlSession session = Util.getSqlSessionFactory().openSession();
		BlogMapper blogMapper = session.getMapper(BlogMapper.class);
		int[] ids = new int[] {1,3,6,9};
		List<Blog> blogs = blogMapper.dynamicForeach2Test(ids);
		for (Blog blog : blogs)
			System.out.println(blog);
		session.close();
	}
 
3.自己把参数封装成Map的类型
Xml代码
  1. <select id="dynamicForeach3Test" resultType="Blog">  
  2.     select * from t_blog where title like "%"#{title}"%" and id in   
  3.     <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">  
  4.         #{item}   
  5.     </foreach>  
  6. </select>  
上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:
Java代码
  1. public List<Blog> dynamicForeach3Test(Map<String, Object> params);  
public List<Blog> dynamicForeach3Test(Map<String, Object> params);
  对应测试代码:
Java代码
  1. @Test  
  2. public void dynamicForeach3Test() {   
  3.     SqlSession session = Util.getSqlSessionFactory().openSession();   
  4.     BlogMapper blogMapper = session.getMapper(BlogMapper.class);   
  5.     final List<Integer> ids = new ArrayList<Integer>();   
  6.     ids.add(1);   
  7.     ids.add(2);   
  8.     ids.add(3);   
  9.     ids.add(6);   
  10.     ids.add(7);   
  11.     ids.add(9);   
  12.     Map<String, Object> params = new HashMap<String, Object>();   
  13.     params.put("ids", ids);   
  14.     params.put("title", "中国");   
  15.     List<Blog> blogs = blogMapper.dynamicForeach3Test(params);   
  16.     for (Blog blog : blogs)   
  17.         System.out.println(blog);   
  18.     session.close();   
  19. }  
	@Test
	public void dynamicForeach3Test() {
		SqlSession session = Util.getSqlSessionFactory().openSession();
		BlogMapper blogMapper = session.getMapper(BlogMapper.class);
		final List<Integer> ids = new ArrayList<Integer>();
		ids.add(1);
		ids.add(2);
		ids.add(3);
		ids.add(6);
		ids.add(7);
		ids.add(9);
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("ids", ids);
		params.put("title", "中国");
		List<Blog> blogs = blogMapper.dynamicForeach3Test(params);
		for (Blog blog : blogs)
			System.out.println(blog);
		session.close();
	}
 

 

MyBatis 中动态 SQL 标签 在 MyBatis 中,动态 SQL 是构建灵活且高效的 SQL 语句的重要工具。通过使用动态 SQL 标签,开发者可以根据不同的条件动态生成 SQL 语句的各个部分,从而避免手动拼接字符串带来的复杂性和潜在的错误。 阅读详情

相关推荐

MyBatis 动态 SQL

MyBatis动态SQL是在XML映射文件中通过特定标签实现SQL语句动态拼接的技术,解决了传统JDBC手动拼接SQL的繁琐问题。文章介绍了MyBatis的9种动态SQL标签:if(条件判断)、where+if(查询条件处理)、set(更新操作)、choose/when/otherwise(多条件分支)、trim(格式化处理)等,并详细说明了各标签的语法和使用场景。动态SQL通过OGNL表达式实现参数值计算和SQL拼接,既提高了开发效率,又需注意性能优化和SQL注入防范。文中提供了多个典型示例,如条件查询、

阿超的博客 1132

mybatis if条件判断

一、字符串(string)非空判断 <if test="name!=null and name!=''"> AND name = #{name} </if> 二、集合(list)非空判断 <if test="list!=null and list.size()!=0"> AND THIRD_DPT IN <foreach collection="list" item="item" open="(" separator=...

JacaCao的博客 6577

从OFED到rdma-core:手把手带你搞定Linux下RDMA开发环境的选型与搭建

本文详细介绍了在Linux系统下搭建RDMA开发环境的完整流程,涵盖OFED与rdma-core的选型对比及分步安装指南。针对高性能计算和分布式存储需求,解析RDMA技术栈的核心组件,提供环境验证与性能测试方法,帮助开发者快速构建稳定高效的开发环境。特别适合需要优化网络性能的工程师参考。

weixin_26905487的博客 226

Mybatis学习

MyBatis 是一个支持自定义SQL存储过程以及高级映射的持久层框架。MyBatis 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO映射成数据库中的记录。sql语句可以进行灵活的修改,在使用JDBC的时候,sql语句和java代码是融合在一起,mybatis是将sql语句和java代码分开来,sql代码写xml文件里,此时sql语句的修改会非常方便。

trh_csdn的博客 3406

别再搞混了!用示波器实测SVPWM:相电压、线电压、端电压波形到底长啥样?(附TI/ST官方笔记解读)

本文详细解析了SVPWM波形实测中的相电压、线电压和端电压的区别与测量技巧,结合TI/ST官方笔记,揭示了马鞍形波形的形成原理及常见误区。通过示波器实测案例,帮助电力电子工程师准确理解并应用这些关键概念,提升电机控制系统的调试效率。

weixin_30632883的博客 433

Hermes-Agent-完整指南

Hermes Agent 是由 **Nous Research** 开发的一款**自我改进型 AI Agent**,具有内置的学习闭环系统。它的核心理念是"一个与你共同成长的 Agent"。- 能够从经验中创建技能(Skill-Learning Automated),在使用过程中自我改进, 跨会话持久记忆, 深度用户建模

liu_zhiyi的博客 3041

mybatis常用判断语法(标签)

作为java开发,我们常用的判断有if、switch语句,其实在MyBatis中也有对应的标签,用于动态生成sql语句。 1. if判断 <where> <if test="null != statusCode and 0 != statusCode"> AND b.STATUS_CODE = #{statusCode, jdbcType=VARCHAR} </if> </where> 一般来说,很多程序猿朋友会在&lt

aw277866304的博客 9227

扫地机的CPU只要二十多块?2024第二拆来了

昨天还说到这个机器人的故障,经小鱼拆机后测试和后台网友留言确认,不是防跌落问题,是轮子故障,这个轮子不会动,轮子上有一个限位开关检测机器人是否离开地面的,测试的时候也没有误触发,所以电机存在故障,后面拆电机的时候再检查。最后再留下一个疑问,这个机器人的回充没有用红外管,机器人是如何识别基站进行返回充电的(因为只买了本体,没买充电桩,不确定充电桩的形状,是不是利用点云识别不确定)懂的请留言。全志的R16,封装是 BGA282,那这个板子至少是4层板,小鱼盲猜 6 层板,知道的小伙伴欢迎留言。

生活不止眼前的苟且 1982

Mybatis <if>标签不起作用案列

1. 在传过来的参数不为-1时,我的判断起作用了,但是若传过来的是0时,if判断不起作用了。 </where> order by releaseDate desc <!--分页查询--> <if test="start!=null and start!='' and size!='' an...

z_ssyy的博客 2728

高通Camera IFE时钟配置

高通Camera IFE时钟配置中的minHorizontalBlanking和minVerticalBlanking配置计算方法

一个懒癌的驱动工程师的随笔分享 6171

pe卸载win10更新补丁_禁用Win10系统更新

众所周知,最近WIN10的强制更新导致了很多问题。如:(部分专业软件系统更新后无法使用,硬件中键盘、鼠标、指纹之类的硬件,更新补丁后失灵等问题)。而之前的禁用WindowsUpdate的方法已经失效。下面我们另辟蹊径,利用系统权限的方法使Win10无法更新,达到禁用更新的目的。1.计算机管理-服务中禁用Windows Update服务。2.打开C:\Windows\softwareDistribu...

weixin_39702479的博客 1万+

MyBatis动态SQL详解

MyBatis动态SQL

SGLP521的博客 3万+

【一看就会】Autoware.universe中静态绕障路线的生成逻辑

在路径行为规划中,前期根据地图和起点终点,生成了一组连续可行的路径段序列(lanelets),然后后续路径行为规划,又会进行起始点,终止点,避障绕障路径的路径规划,并且会调用route_handler中的函数,进行中心线生成,最后生成路径,后续再给速度行为规划进行速度规划。在autoware.universe的规划中,是基于规则的规划,而其中的规则又是为了解决不同场景的。而这些场景,大部分是为了解决路上障碍物(静态、动态、行人、车辆等等)。

weixin_48386130的博客 321

MyBatis 动态SQL详解

注意,``失败后, `` 关键字只会去掉库表字段赋值前面的and,不会去掉语句后面的and关键字,即注意,`` 只会去掉`` 语句中的最开始的and关键字。在实际开发中会遇到许多相同的SQL,比如根据某个条件筛选,这个筛选很多地方都能用到,我们可以将其抽取出来成为一个公用的部分,这样修改也方便,一旦出现了错误,只需要改这一处便能处处生效了,此时就用到了这个标签了。这个标签和是天仙配,是共生的,include用于引用sql标签定义的常量。

Coisini__S的博客 1268

【感知模块算法】障碍物detect+trace+prediction方向介绍

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、多维度看感知问题,体会复杂性二、障碍物/环境目标detect方向1.视觉目标检测方向(1)图像处理认知(2)视觉基础理论部分1、获取数据集---python网页爬虫、买数据、自己录数据、使用开源比赛的数据集2、opencv库的学习3、深度学习框架学习(3)视觉目标检测理论(1)目标检测的概念(2)目标检测的应用场景(3)现有目标检测框架原理及论文【这仅仅是我当初入门学习的框架~

qq_35635374的博客 2894

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【MyBatis】动态SQL

在前一篇中,我们已经讲解了Mybatis的基本使用,那么本篇我们就进一步来了解Mybatis的功能。本篇我们主要讲的是Mybatis中的动态SQL,在前面我们的学习中,我们编写的SQL语句基本都是固定的,每个参数都需要传递,而通过动态SQL,它能根据我们所给的参数,动态地选择参数,不需要每个都传递。

zhyhgx的博客 2204

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Mybatis之动态SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。 利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQ...

JustinNeil的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

mybatis强大的动态SQL

我们可以将一些重复性的 SQL 语句进行抽取,以达到复用的效果。:抽取 SQL 语句标签。:引入 SQL 片段标签。抽取的 SQL 语句三、多条件组合查询之<where-if>我们根据实体类的不同取值,使用不同的 SQL语句来进行查询。比如在 id如果不为空时可以根据id查询,如果username 不同空时还要加入用户名作为条件。这种情况在我们的多条件组合查询中经常会碰到。:条件标签。如果有动态条件,则使用该标签代替 where 关键字。:条件判断标签。查询条件拼接。

2501_90401192的博客 1638

Mybatis-动态SQL

在页面原型中,列表上方的条件是动态的,是可以不传递的,也可以只传递其中的1个或者2个或者全部。而在我们刚才编写的SQL语句中,我们会看到,我们将三个条件直接写死了。如果页面只传递了参数姓名name 字段,其他两个字段 性别 和 入职时间没有传递,那么这两个参数的值就是null。此时,执行的SQL语句为:这个查询结果是不正确的。正确的做法应该是:传递了参数,再组装这个查询条件;如果没有传递参数,就不应该组装这个查询条件。

actavy的博客 3030

MyBatis 动态SQL 详解!

动态 SQL 是指在 SQL 语句中,根据不同的条件或参数,生成不同的 SQL 语句。💡

qq_56158663的博客 1718

【Mybatis】动态SQL详解

什么是动态SQL?if+set if+where if+trim foreach choose sql

m0_66584716的博客 1173

MyBatis 动态 SQL 详解

在使用 MyBatis 进行数据库查询时,可能会遇到一些需要根据条件动态生成 SQL 语句的情况。MyBatis 提供了强大的动态 SQL 支持,通过标签和条件语句,可以让 SQL 语句根据不同的输入参数动态生成。这大大提高了代码的灵活性,避免了拼接 SQL 语句的繁琐和出错风险。

m0_64974617的博客 1795

Mybatis动态SQL

Mybatis 动态Sql

心流时间的博客 1247
上一篇: 软件版本号如何定义
下一篇: 带返回值的Form表单的异步提交(struts+json+jQuery.form)
努力突破
博客等级 码龄17年 36粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值