MyBatis-动态SQL

一文全解:OGNL表达式以及Mybatis中的OGNL表达式 OGNL(Object-Graph Navigation Language)是一种用于在Java中访问和操作对象图的表达式语言。它提供了一种简洁、灵活的方式来遍历和操作复杂的对象结构,而无需编写大量的代码。OGNL表达式可以用于各种场景,如Web应用、批处理任务、测试等。OGNL表达式是一种强大的工具,尤其在Mybatis中能够极大地简化动态SQL的编写。它的简洁语法和强大功能,使得开发者能够高效地处理复杂的对象操作。然而,在使用OGNL表达式时,也要注意性能和安全性的问题,合理使用表达式,避免潜在的风险。 阅读详情

MyBatis-动态SQL
(1)极大的简化拼装SQL的操作。
(2)动态SQL 元素和使用JSTL 或其他类似基于XML 的文本处理器相似。
(3)MyBatis 采用功能强大的基于OGNL 的表达式来简化操作。

通过以下标签实现动态SQL:
1.if:判断
例如1:实现动态筛选查询,根据单个或多个条件:员工id,姓名,部门…
实现接口:public List getEmpByConditions(Employee conditions);

<select id="getEmpByConditions" resultType="com.mybatis.entity.Employee">
		select * from test
		<where>
			<if test="id != null">
				id=#{id}
			</if>
			<if test="last_name != null and last_name !=''">
				and last_name like CONCAT(CONCAT('%', #{last_name}), '%')
			</if>
			<if test="email !=null and email.trim()!=null">
				and email = #{email}
			</if>
			<!-- <if test="gender=='M'.toString() or gender=='F'.toString()"> -->
			<if test='gender =="M" or gender =="F"'>
				and gender = #{gender}
			</if> 
		</where>
	</select>

例如2:实现动态更新,指定修改单个或多个属性:员工id,姓名,部门…
实现接口:public void updateByConditions(Employee employee);

<update id="updateByConditions">
		update test
		<set>
			<if test="last_name!=null and last_name !='' ">
				last_name = #{last_name},
			</if>
			<if test='gender=="F" or gender =="M" '>
				gender = #{gender},
			</if>
			<if test="email!=null and email !='' ">
				email = #{email}
			</if>
		</set>
		where id= #{id}
	</update>

注意:(1)两个字符串比较是否相等

<if test="gender=='M'.toString() or gender=='F'.toString()">
或者
<if test=' gender =="M" or gender =="F" '>
	and gender = #{gender}
</if> 

(2)关于字符串与数字的比较
ognl会进行字符串与数字的转换判断 “0”==0

<if test=" gender==0 or gender==1 ">
	 and gender=#{gender}
</if>

(3)判断字符串是否为空

<if test=" last_name != null and last_name !='' ">
	and last_name like CONCAT(CONCAT('%', #{last_name}), '%')
</if>

或者

<if test=" email !=null and email.trim()!=null ">
		and email = #{email}
</if>

(4)查询的时候如果某些条件没带可能sql拼装会有问题
1、给where后面加上1=1,以后的条件都and xxx.

<select id="getEmpByConditions" resultType="com.mybatis.entity.Employee">
		select * from test  where and 1=1
		<if>and ...</if>

2、mybatis使用where标签来将所有的查询条件包括在内。mybatis就会将where标签中拼装的sql,多出来的and或者or去掉.但是where只会去掉第一个多出来的and或者or。

<select id="getEmpByConditions" resultType="com.mybatis.entity.Employee">
		select * from test  
<where>
	<if>and...</if>
<if>and ...</if>
<where>

3.使用trim标签自定义字符串的截取规则

<select id="getEmpByConditions" resultType="com.mybatis.entity.Employee">
		select * from test  
	 	<trim prefix="where" suffixOverrides="and">
 	   	<!--prefix给拼串后的整个字符串加一个前缀 where,suffixOverrides去掉整个字符串后面多		余的字符and-->
	 		<if >...and</if>
  <if >...and</if>
		 </trim>
</select>

2.trim 字符串截取(where(封装查询条件), set(封装修改条件))
trim标签体中是整个字符串拼串后的结果

  • prefix="":前缀prefix给拼串后的整个字符串加一个前缀
  • prefixOverrides="":前缀覆盖: 去掉整个字符串前面多余的字符
  • suffix="":后缀suffix给拼串后的整个字符串加一个后缀
  • suffixOverrides=""后缀覆盖:去掉整个字符串后面多余的字符 例如1:实现动态筛选查询,根据单个或多个条件:员工id,姓名,部门…

实现接口:public List getEmpByConditionsTrim(Employee employee);

<select id="getEmpByConditionsTrim" resultType="com.mybatis.entity.Employee">
		select * from test
	 	<!-- 自定义字符串的截取规则 -->
	 	<trim prefix="where" suffixOverrides="and">
			<if test="id != null">
				id=#{id} and 
			</if>
			<if test="last_name != null and last_name !=''">
				last_name like CONCAT(CONCAT('%', #{last_name}), '%') and 
			</if>
			<if test="email !=null and email.trim()!=null">
				email = #{email} and 
			</if>
			<if test='gender =="M" or gender =="F"'>
				gender = #{gender} and 
			</if> 
		</trim>
</select>

例如2:实现动态更新,指定修改单个或多个属性:员工id,姓名,部门…
实现接口:public void updateByConditionsTrim(Employee employee);

<update id="updateByConditionsTrim">
		update test
		<trim prefix="set" suffixOverrides=",">
			<if test="last_name!=null and last_name !='' ">
				last_name = #{last_name},
			</if>
			<if test='gender=="F" or gender =="M" '>
				gender = #{gender},
			</if>
			<if test="email!=null and email !='' ">
				email = #{email},
			</if>
		</trim>
		where id= #{id}
	</update>

3.choose (when, otherwise):分支选择;
choose标签形式:(类似于带break的switch-case)

<choose>
	<when test="">...</when>
	<when test="">...</when>
	<otherwise>..</otherwise>
</choose>

注意:如果带了id就用id查,如果带了lastName就用lastName查;同时满足多个条件时,只会进入其中一个分支
例如:实现动态筛选查询,根据单个或多个条件:员工id,姓名,部门…
实现接口:public List getEmpByConditionsChoose(Employee employee);

<select id="getEmpByConditionsChoose" resultType="com.mybatis.entity.Employee">
		select * from test
		<where>
			<choose>
				<when test="id != null">
					id=#{id}
				</when>
				<when test="last_name != null and last_name !=''">
					last_name like CONCAT(CONCAT('%', #{last_name}),'%')
				</when>
				<when test="email !=null and email.trim()!=null">
					email = #{email}
				</when>
				<when test=' gender=="M" or gender=="F" '>
					gender = #{gender}
				</when>
				<!-- <otherwise>gender = #{gender}</otherwise> -->
			</choose>
		</where>
	</select>

注意:1.可选是否存在 2.不能加test条件


4.foreach 遍历集合
foreach标签中属性:

  • collection:指定要遍历的集合:list类型的参数会特殊处理封装在map中,map的key就叫list
  • item:将当前遍历出的元素赋值给指定的变量
  • separator:每个元素之间的分隔符
  • open:遍历出所有结果拼接一个开始的字符
  • close:遍历出所有结果拼接一个结束的字符
  • index:索引。
    遍历list的时候是index就是索引,item就是当前值,遍历map的时候index表示的就是map的key,item就是map的值标签体中:
    #{变量名}就能取出变量的值也就是当前遍历出的元素

例如:动态查询:同时传入多个id,根据id查询员工信息
实现接口:public List getEmpByIdsForeach(@Param(“empIds”)List empIds);

<select id="getEmpByIdsForeach" resultType="com.mybatis.entity.Employee">
	 select * from test where id in
	 <foreach collection="empIds" item="item_id" separator="," open="(" close=")">
	 	  #{item_id}
	 </foreach>
</select>

注意:1.接口参数需要使用@Param(“empIds”)为参数命名,否则 collection="empIds"会出现not found错误,原因未知

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

相关推荐

MyBatis 中动态 SQL 标签

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

YiHanXii的博客 2257

mybatis if标签判断字符串相等

mybatis 映射文件中,if标签判断字符串相等,两种方式: 因为mybatis映射文件,是使用的ognl表达式,所以在判断字符串sex变量是否是字符串Y的时候, 注意: 不能使用 and 1=1 因为mybatis会把'Y'解析为字符,所以不能这样写 会报NumberFormatException ...

奋斗不息 1万+

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 sql配置文件if标签判断字符串相等误区!

mybatis映射文件,使用的是ognl表达式,在判断字符串apply 变量是否是字符串’1’的时候,会把’1’解析成字符,又因为java是强类型语言所以不能这样写: <if test="apply == '1'"> and STR_TO_DATE(CONCAT(LEFT(rd.apply_begin_date,10),':',rd.apply_begin_time),'%Y-%m-...

weixin_43154932的博客 951

SPI 协议帧格式深度解析:从 8 位数据到 16 位扩展的 3 种模式

本文深入解析SPI协议的帧格式,涵盖从8位标准到16位扩展的三种模式。通过详细讲解SPI时钟模式、数据宽度配置及实际应用案例,帮助开发者掌握SPI外设的深度定制能力,提升嵌入式系统开发效率。特别适用于连接传感器、存储器和显示器等高速通讯场景。

weixin_34110749的博客 345

AMD显卡跑Ollama大模型?手把手教你搞定Windows下GPU识别与加速(以RX 9600XT为例)

本文详细指导如何在Windows系统下使用AMD显卡(如RX 9600XT)运行Ollama大模型,解决GPU识别与加速问题。通过获取非官方Ollama版本、替换ROCm库文件等步骤,实现高效的GPU加速推理,提升大语言模型的运行效率。

weixin_28707365的博客 481

ognl表达式中判断字符串常量的注意事项

// OGNL与单个字符常量做等号判断,会被转成数值型 Map context = new HashMap(); context.put("id", "1"); context.put("name", "z"); context.put("sex", "man"); System.out.println(context); // 单个字符的数字型字符串 Syste

zycgod的专栏 2312

Cadence Sigrity PowerSI实战:从.brd到S参数提取的完整避坑指南

本文详细介绍了使用Cadence Sigrity PowerSI进行信号完整性分析的完整流程,从.brd文件预处理到S参数提取的关键技巧。通过实战案例和避坑指南,帮助工程师高效解决高速PCB设计中的信号质量问题,提升仿真精度和设计效率。

carrot的博客 694

mybatis 字符串比较失效

实现,当name传入字符串0时,判断name的值。但是在实际运行过程中,这个判断条件并没有生效。推荐使用第二种toString方法。二、使用toString()

xieyfjejwaj的博客 897

STM32F103到F407移植OLED,为啥F4屏幕不亮?一个延时函数搞定时序问题

本文详细分析了STM32F103到F407移植OLED时屏幕不亮的问题,指出时钟频率差异导致的时序问题是关键原因。通过对比F103和F407的时钟架构差异,提供了精确延时函数的实现方法,并指导在I2C通信关键点插入适当延时,确保OLED正常显示。文章还涵盖了完整的测试方案和高级优化技巧,帮助开发者彻底解决移植中的时序问题。

weixin_30642561的博客 549

100天精通Python(可视化篇)——第98天:Pyecharts绘制多种炫酷日历图参数说明+代码实战

一、日历图介绍 二、基础配置 1. 配置项类 2. 添加函数 3. 日期标签配置 4. 坐标系配置 三、日历图实战 1. 基础日历图 2. 日历热图

努力让自己发光,对的人才能迎着光而来 2万+

【MyBatis】动态SQL

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

zhyhgx的博客 2203

黑猫带你学UFS协议第17篇:UFS安全模式详解(Secure Mode)

本文详细介绍了UFS协议中的安全模式,包括Erase, Discard, Purge和Wipe Device操作。Erase用于永久删除数据并确保无法恢复;Discard不保证数据清除;Purge类似于Sanitize,清除内部未映射的物理块数据;Wipe Device则是格式化设备。这些操作涉及逻辑单元、擦除单位、相关寄存器配置等,确保数据安全。" 126036669,12409270,MySQL 8.0 开窗函数详解,"['数据库理论', 'SQL']

黑猫奥利奥的博客 2559

mybatis强大的动态SQL

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

2501_90401192的博客 1637

Android AVB 分析(十三)dm-verity 设备是如何映射的?

在上一篇《Android AVB 分析(十二)嵌入式设备安全中的 dm-verity 简介》介绍 dm-verity 原理的时候,作者提供了一个 dm-verity 演示的例子。本篇我们基于 AOSP 源码 `android-13.0.0_r41` 实际编译生成的 Google Pixel 7 (“panther”) 设备的 system 分区镜像进行 dm-verity 设备验证实战。

洛奇看世界 2438

BUG调试案例一:RK3588+YT8531网络无法PING通调试案例

在使用 RK3588 搭配 YT8531S PHY 芯片进行网络调试时,遇到了“网络无法 Ping 通”的棘手问题。排查了两天,终于找到问题原因。为了避免大家在类似项目中走弯路,也为了加深自己对调试细节的理解,我们特意整理了本次问题的完整排查过程。本篇文章将围绕以下四个方面展开分享: 问题现象&描述 调试过程&分析 问题根源定位 注意事项提醒 举一反三(走两步)

案例文章,高速信号 2336

Mybatis-动态SQL

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

actavy的博客 3028

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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。提示导入失败后,重新检测通过。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MyBatis 动态SQL详解

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

Coisini__S的博客 1268

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

MyBatis 实现动态 SQL

MyBatis 中的动态 SQL 就是SQL语句可以根据不同的情况情况来拼接不同的sql。 本文会介绍 xml 和 注解 两种方式的动态SQL实现方式。

2302_76339343的博客 2375

Mybatis动态SQL

Mybatis 动态Sql

心流时间的博客 1247

【MyBatis】动态 SQL

这些标签可以根据传入的参数动态地添加、删除或修改 SQL 语句的某些部分。语句,用来根据不同条件选择执行不同的 SQL 语句,包含。标签根据传入的条件判断是否包含该 SQL 片段。用于在 SQL 语句中循环处理集合或数组,常用于。文件中使用特定的标签来完成的。子句中的值,并且自动加上括号和逗号分隔符。,则将相应的条件添加到 SQL 查询中。是指在程序执行过程中,根据实际的情况。标签用于自动处理 SQL 语句中的。部分,避免了多余的逗号和条件。部分,它会自动去除多余的。,之后的条件会自动处理为。

weixin_63466958的博客 1363

MyBatis 之 动态 SQL

动态 SQL

lfm1010123的博客 2134
下一篇: Java内部类
X1aoMin9同学
博客等级 码龄12年 2粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值