ibatis的dynamicSQL中,关于prepend的使用

ibatis的文档中,关于动态SQL的举例如下:

<statement id="someName" parameterClass="Account" resultMap="account-result" >
select * from ACCOUNT
<dynamic prepend="where">
<isGreaterThan prepend="and" property="id" compareValue="0">
ACC_ID = #id#
</isGreaterThan>
<isNotNull prepend="and" property="lastName">
ACC_LAST_NAME = #lastName#
</isNotNull>
</dynamic>
order by ACC_LAST_NAME
</statement>


当需要使用根据传入参数的值来动态组装SQL时,可以使用dynamic标签。
dynamic元素可以包含多个条件比较元素,并且按照条件比较元素的表述对参数值进行比较,来组装动态SQL。
这里主要的条件比较元素包含isGreaterThan、isNotNull、isEmpty……

dynamic元素和条件比较元素,都是组成动态SQL的一部分,其中的prepend属性根据实际情况的需要辅助的组装动态SQL。

以上面的statement为例:
1)dynamic的prepend只要检测到第一个为“真”的条件比较元素,则覆盖其prepend属性并组装where关键字为动态SQL的一部分。
2)isNotNull的prepend只要检测到参数值满足比较条件,则前置组装and关键字为动态SQL的一部分。

注意一点:上面的例子中,ibtis文档中说 - dynamic元素中的prepend属性“where”将覆盖第一个为“真”的条件比较元素(即isGreaterThan)的prepend属性
按照这个理解,则第一个为“真”的条件比较元素(即isGreaterThan)的prepend属性是不需要的,或者“and”是不需要的,(ibatis文档中的原文是 For example, in the case of the first true condition, there is no need for the AND, and in fact it would break the statement) 则修改上述例子为

<statement id="someName" parameterClass="Account" resultMap="account-result" >
select * from ACCOUNT
<dynamic prepend="where">
<isGreaterThan property="id" compareValue="0">
ACC_ID = #id#
</isGreaterThan>
<isNotNull prepend="and" property="lastName">
ACC_LAST_NAME = #lastName#
</isNotNull>
</dynamic>
order by ACC_LAST_NAME
</statement>

事实上,这样修改的结果导致最终SQL 变为
“select * from ACCOUNT where ACC_ID = #id# ACC_LAST_NAME = #lastName#”
明显是有问题的。

跟踪源码发现,ibatis在检测sqlTag的时候,调用了如下方法

public void pushRemoveFirstPrependMarker(SqlTag tag) {

if(tag.getHandler() instanceof DynamicTagHandler) {
// this was added to retain default behavior
if(tag.isPrependAvailable()) {
removeFirstPrependStack.addFirst(
new RemoveFirstPrependMarker(tag,true));
} else {
removeFirstPrependStack.addFirst(
new RemoveFirstPrependMarker(tag,false));
}
……
}

dynamic要覆盖第一个为“真”的条件比较元素的prepend属性,首先需要检测该tag的prepend是否可用(tag.isPrependAvailable()),如果不可用的话,即便该比较条件为“真”,则不会覆盖,只是单独的添加该比较条件元素下的SQL


public boolean isPrependAvailable() {
return prependAttr != null && prependAttr.length() > 0;
}

由此可以看出,prepend可用的前提是prepend属性值已经设置,并且长度>0。

这样的话就不难理解上述修改后的statement,为何SQL变更为“select * from ACCOUNT where ACC_ID = #id# ACC_LAST_NAME = #lastName#”?因为ACC_LAST_NAME = #lastName#的前置prepend,被作为第一个为真的比较条件给删除了。
正确的写法应该是

<isGreaterThan prepend="and" property="id" compareValue="0">

或者

<isGreaterThan prepend=" " property="id" compareValue="0">
TI AWR2944毫米波雷达开发板开箱:用官方Demo快速上手3D点云与热图生成 本文详细介绍了TI AWR2944毫米波雷达开发板的开箱与实战应用,包括硬件准备、软件开发环境搭建、Demo固件刷写与配置、实时可视化与数据解析等全流程指南。通过官方Demo快速上手3D点云与热图生成,帮助开发者高效掌握毫米波雷达技术在工业检测、智能交通等领域的应用。 阅读详情

相关推荐

避开封号风险!wxauto+Claude API实现微信智能客服的合规方案

本文详细介绍了如何利用wxauto和Claude API构建合规的微信智能客服系统,避免封号风险。通过技术选型对比、防封策略设计及大模型接入实践,为企业提供了一套安全高效的解决方案,特别适合中小企业在微信生态中部署AI客服。

sql99的博客 446

Mybatis使用IN语句查询

  一、Mybatis使用IN语句查询 写法一: 在SQL语法中如果我们想使用in的话直接可以像如下一样使用: select * from ec_org_person where state in ('1','2', '3' )   但是如果在MyBatis中的使用in的话 &lt;select id="findPersonByLogNameAndEntity" paramete...

懂哥的博客 5865

数字孪生驱动的城市地下管网智能运维与应急处置决策支持系统

上海市城市数字化中心的数据实践显示,通过关联分析管网材质与故障率的关系,将铸铁管更换周期从15年优化至8年(李敏,2021)。环境效益方面,上海市通过优化管网运行参数,年减少碳排放1.8万吨,相当于种植36万棵乔木。数字孪生与物理设备的双向交互采用OPC UA协议实现,某次天津管网渗漏事件中,系统通过实时数据反馈,指导现场人员调整注浆方案,将修复时间从48小时压缩至16小时。虚拟指挥沙盘支持多视角协同,深圳水务系统的实践表明,通过AR可视化技术,跨部门会议效率提升60%,方案决策时间缩短40%。

2501_92431686的博客 1424

Mybatis学习

Mybatis学习以注解的方式编写SQL语句表名数据库属性与实体类映射注解@InsertProvider @DeleteProvider @UpdateProvider @SelectProvider注解 以注解的方式编写SQL语句 以插入语句为例 @Insert(“insert into mp_prize_issue prize_type,apply_no values (#{pri...

codesweetpotato的博客 413

VSCode搭配Keil开发STM32:从环境配置到代码跳转全流程(避坑指南)

本文详细介绍了如何使用VSCode搭配Keil进行STM32开发,从环境配置到代码跳转的全流程指南。通过安装必备插件和正确配置项目文件,开发者可以在VSCode中享受现代编辑器的便捷功能,同时保留Keil的编译调试能力,提升嵌入式开发效率。

weixin_28832121的博客 253

别再为H桥烧MOS管发愁了!手把手教你用IR2104搭建稳定电机驱动(附自举电路详解)

本文详细解析了使用IR2104半桥驱动芯片构建高可靠H桥电机驱动电路的全过程。从芯片内部架构、自举电路原理到PCB布局技巧和实战调试方法,帮助工程师彻底解决MOS管烧毁问题。重点讲解了自举电容选型、死区时间控制等关键设计要点,并附有示波器实测波形分析,是电机驱动设计的实用指南。

我的博客 739

MyBatis的<isNotNull>标签

标签&lt;isNull&gt;用于判断参数是否为Null,为Null时,执行标签体内的语句。 标签&lt;isNotNull&gt;用于判断参数是否不为Null,不为Null时,执行标签体内的语句。 标签&lt;isEmpty&gt;判断参数是否为Null或者空(空字符串),满足其中一个条件则其true,执行标签体内的语句。 标签&lt;isNotEmpty&gt;判断参数是否同时不为N...

iteye_21149的博客 2864

ArcGIS新手必看:5分钟搞定等高线转DEM栅格(附完整操作截图)

本文详细介绍了在ArcGIS中将等高线转换为DEM栅格的完整流程,包括CAD数据预处理、TIN转栅格和直接插值法两种核心方法,以及常见问题排查与优化技巧。通过实战案例和操作截图,帮助GIS新手快速掌握这一测绘数据处理的核心技能,提升地形分析和三维可视化效率。

dapp9builder的博客 286

Mybatis中isNotNull与isNotEmpty的使用

isNotNull,就是不为null,也就是<>null isNotEmpty,就是不为空,也就是<>null,并且<>''(空字符串) <isNotEmpty prepend="AND" property="userName"> C.USER_NAME= #userName# </isNotEmpty> <i...

只喝酒不抽烟的博客 6465

直流电源EMI滤波器设计实战:从器件选型到PCB布局的完整指南

本文提供了一份直流电源EMI滤波器的完整实战设计指南。针对EMI噪声超标问题,文章深入剖析了差模与共模噪声的抑制原理,详细讲解了从电路拓扑、核心器件(如X/Y电容、共模电感)的选型计算,到决定性能成败的PCB布局艺术。重点强调了低阻抗路径、干净接地及输入输出隔离等关键布局原则,并分享了常见的调试坑点与排查方法,旨在帮助硬件工程师设计出真正有效的滤波器,确保电源系统通过EMC测试。

q9r0s的博客 641

一张图看懂中国民航适航审定体系:从适航司到审定中心,到底谁管谁?

本文深入解析中国民航适航审定体系,从立法层到执行层的完整链条,揭示适航管理的金字塔结构和核心流程。涵盖适航司、审定中心等关键机构职能,以及型号审定、生产许可审定等全生命周期管理,展现中国适航体系的特色实践与创新探索。

weixin_30896511的博客 476

ibatis2.3.4.726问题一

[code="java"] select ACC_ID , ACC_FIRST_NAME , ACC_LAST_NAME , ACC_EMAIL from ACCOUNT ACC_ID = #id# ACC_FIRST_NAME = #firstName# [/c...

sd_zyl的专栏 240

Python库CloudScraper详细使用(绕过 Cloudflare 的反机器人页面的 Python 模块)

CloudScraper是一个专门用于绕过Cloudflare反机器人保护的Python库,它基于requests库构建,能够处理Cloudflare的5秒盾、WAF和人机验证等防护机制。

数据知道的博客 1万+

iBatis笔记

iBatis笔记有些老项目在使用iBatis,所以也学习了下,记录下学习笔记。标签dynamic标签内容来自ibatis的dynamicSQL中,关于prepend的使用当需要使用根据传入参数的值来动态组装SQL时,可以使用dynamic标签。 <statement id="someName" parameterClass="Account" resultMap="account-result" >

了凡 450

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ibatis的动态sql

位于包 com.ibatis.sqlmap.engine.mapping.sql.dynamic 。ibatis的标签和mybatis的标签之间,区别已经很大了 ibatis在启动的时候,会把所有的sql对象解析出来,并初始化为对应的实际实现。Sql对象的实现类有很多,常见的有 StaticSql,这个是纯净态的,没有动态SQL DynamicSql是包含了动态标签的SQL对象。...

李义星 499

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

mybati(ibatis)中的动态sql <dynamic prepend="where">的详解

ibatis的文档中,关于动态SQL的举例如下:  Java代码   "someName" parameterClass="Account" resultMap="account-result" >     select * from ACCOUNT     "where">       "and" property="id" compareValue="0">  

huyanzhiwei的博客 6205

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

mybatis的常用标签用法总结

一、背景 在我们的学习过程中,我们经常使用到mybatis,这里主要讲讲常用的标签,这样你也可以在面试官面前有底气了,那下面我们就来讲讲这些常用的标签,再说了标签不熟悉非常影响开发效率和质量。好了废话不多说了。 二、selectKey 1.应用场景:新增数据时 2.插入数据并且返回当前数据的id <insert id="selectUser"> <!-- se...

码农小默 6069

Ibatis <dynamic> 标签 update 的相关问题总结

1.为了使用&lt;dynamic &gt;中 &lt;isNotNull&gt;和其他地方出现不必要的bug  我们在定义map 或者 TO时 将所有的类型都定义为原生态的类型,比如定义INTEGER。2.在写语句时很容易引入很难察觉的错误 比如“ : ” ,和“ : ” .这两个字符在.java 文件里面会区别非常明显,但是在xml中,肉眼是看不出来的。所以尽量统一,将标点用半角英文。3.所有...

萧曳丶 1477

ibatIS的<dynamic prepend="WHERE">原理,是判断前一个AND字母是否存在

动态标签分类:1,2 二元标签,3 一元标签,4 这四种标签以及他们的子标签具有共同的属性prepend,open,close 1   Xml代码          select * from ACCOUNT                                                   生成的语句不会有多余and,因为dynamic有一个隐含的属性,  

gaojiyinhang2的专栏 3171

MyBatis动态sql问题

MyBatis动态sql问题 博客分类:  spring+hibernate+ibatis框架 ibatis  接使用JDBC一个非常普遍的问题就是动态SQL。使用参数值、参数本身和数据列都是动态SQL,通常是非常困难的。典型的解决办法就是用上一堆 的IF-ELSE条件语句和一连串的字符串连接。对于这个问题,Ibatis提供了一套标准的相对比较清晰的方法来解决一个问题,这里

evilcry2012的专栏 1232

Mybatis中isNotNull与isNotEmpty的使用技巧

做开发工作时间长了,会发现,在需求逐步梳理清晰以后,大致的方向已经明确了。此时会进入细节开发环节,是最繁琐,也是决定开发质量的关键阶段。最近遇到了一个生产问题,必填字段的值,清空保存,无法保存成功。   具体业务需求是这样的: 客户的基本信息,坐席可以保存,也可以提交后端系统进行审批。 1,保存的时候,其实就是一个暂存的功能,只要坐席输入的是合法的值,都要保存入库。 2,提交审批的时候会...

reggergdsg的博客 3万+

ibatis 3.0 Dynamic Sql 设计解析(并与2.x的差异)

前段时间ibatis3.0发布出来了,迫不及待,将其源码下载拜读。相对ibatis 2.x来说,3.0已是完全改变。具体我就不在这细说,论坛中有一个帖子介绍了ibatis 3.0的新特征及使用。       由于其他模块的源码我还未细读,在这篇中,先来讨论Dynamic Sql在ibatis 3.0中的实现并比较2.x对应模块的设计。   写在前头的话:       其实如从设计模式应用角...

蝈蝈的技术博客 249

ibatis 动态语句拼写心得

ibatis 动态语句拼写心得 文章分类:Java编程  项目中用到了ibatis。看了很多篇在XML 里动态编写sql 的文章!  我突然有了疑问,在一个statement 中可以包含多个 dynamic 子标签么?  于是 试验了一把,嘿嘿 果然能行~~ dynamic 标签的作用是  可以自动添加或者移除 在SQL语句中 多余的表单符号 不用再担心 少了逗号...

mowengaoboa的博客 247

[ibatis]动态映射

在复杂查询过程中,我们常常需要根据用户的选择决定查询条件,这里发生变化的并不只是SQL 中的参数,包括Select 语句中所包括的字段和限定条件,都可能发生变化。典型情况,如在一个复杂的组合查询页面,我们必须根据用户的选择和输入决定查询的条件组合。一个典型的页面如下:对于这个组合查询页面,根据用户选择填写的内容,我们应为其生成不同的查询语句。如用户没有填写任何信息即提交查询请求,我们应

blueilove2003的专栏 1597

刚学ibatis,小结一下

1. ibatis 框架通过对象和SQL 之间映射来完成持久化工作的。 2. ibatis框架的搭建 (1)所需的架包:ibatis.jar  mysql-connector-java-bin.jar (2)配置数据源:SqlMapConfig.xml             PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0/

kimi_lov_ing的专栏 975
上一篇: 浅析ibatis的cache实现
下一篇: ubuntu 下安装调试 thrift
sotti
博客等级 码龄20年 0粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值