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">
calibration的“前世今生”——从simulink开发到CANape的XCP标定 整体思路 备注: elf可简单的看作为hex和map的集合,其中包括可执行的程序、变量及其对应的地址(simulink生成代码是也可以勾选生成ASAP2的a2l文件,有变量但变量对应的地址为空,只有编译后才分配地址) 定义变量是观测值还是标定值需要在simulink中的数据字典定义变量存储类型,详见simulink系列。 1. 前期准备A2L的制作 安装完成CanApe软件 , 插上CanApe硬件( 如:vector 1640A)。打开A2L编辑软件 ASAP2 Editor(注意不是ASAP2 Vi 阅读详情

相关推荐

K210开发板学习笔记(三)——STM32+K210+SD卡实现人脸识别(完整K210代码)

更新日记:2022年4月26日 更新了串口通信部分的内容,本文写的略为粗糙,恐有不当之处,希望大家不吝赐教。 人脸识别 一、MaixPy IDE开发 参考博主晨少hc的博文(https://blog.youkuaiyun.com/HuangChen666/article/details/113995079)来实现人脸识别功能,我用的硬件是亚博智能的K210开发板,在配置工程中有几步和这个博主的不一样,需要注意。 所需要的文件有:模型文件),脚本文件,ide需要的bin文件...

Embedded learner的博客 4万+

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

科研绘图(二):R 语言实现小鼠脑图谱 3D 渲染,附完整代码与数据获取指南

在生物医学科研中,脑区的 3D 可视化是呈现实验结果、解析脑结构功能的重要手段。R 语言凭借rgl和Rvcg等工具包,可高效实现小鼠全脑及特定脑区(如 CA1 区)的立体渲染,且代码可复用性强。本文将从环境搭建、数据准备、代码实现到结果导出,手把手带你完成小鼠脑图谱 3D 绘图,小白也能快速上手!

good_rrrrr的博客 2023

Mybatis学习

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

codesweetpotato的博客 413

基于AXI PCIE IP的FPGA PCIE卡示意图

如果在上图中的AXI互联IP上再连接一个带AXI Slave接口的BRAM控制器,这个BRAM控制器连接一个BRAM,Host PC在系统主存中分配了一些不连续的内存,Host PC可以将这些内存段的起始地址(当然要先转为PCIE总线地址)写到AXI总线上的BRAM中,这样AXI CDMA读取BRAM,将读取到的PCIE总线基地址写到AXIPCIE寄存器块中的AXIBAR2PCIEBAR_n寄存器中,这样就实现了SG DMA。通过动态改变AXIBAR2PCIEBAR_n寄存器的值,可以实现多通道DMA。

csdn_gddf102384398的博客 1624

python刷B站播放量

首先,我们要知道B站播放量计算方法:不同的IP只能算一次,如果点一下就关掉,会出现播放完成度很低的情况,反而不利。 所以我们要做的是:不停换IP地址打开视频播放页,最好能看完视频。 下面是实现方法: 获取某一个网页上的所有代理IP,返回一个IP列表: def get_ip_list(url, headers): web_data = requests.get(url, headers=headers) soup = BeautifulSoup(web_data.text, 'lxml

HGGshiwo的博客 1万+

MyBatis的<isNotNull>标签

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

iteye_21149的博客 2864

深入解析车载以太网DoIP诊断:Wireshark实战TCP/UDS报文分析

本文深入解析车载以太网DoIP诊断,重点介绍如何利用Wireshark进行TCP/UDS报文实战分析。文章详细讲解了从以太网帧、IP帧、TCP段到DoIP协议及UDS服务的逐层拆解方法,并提供了使用Wireshark定位通信故障(如乱序、丢包、重传)的实用技巧,帮助工程师高效排查车载诊断网络问题。

c2d3e4f的博客 674

Mybatis中isNotNull与isNotEmpty的使用

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

只喝酒不抽烟的博客 6465

Python 爬虫实战:在丁香医生抓取健康科普文章阅读量,普及健康知识

requests:用于发送 HTTP 请求,获取网页内容。或 lxml:用于解析 HTML 页面,提取目标数据。pandas:用于数据清洗和分析。matplotlib和seaborn:用于数据可视化。通过本项目,我们实现了以下目标:使用 Python 爬虫抓取丁香医生的健康科普文章阅读量。对数据进行清洗和分析,找出热门文章。通过可视化展示数据,并普及健康知识。

u014481728的博客 1567

WinClaw安全实战 02|五层纵深防护体系全解析:从原理到实操,打造零风险AI智能体

2026年AI智能体爆发式普及,OpenClaw以27.3万GitHub星标成为现象级工具,但恶意Skill投毒、提示词注入、数据外泄等安全事故频发,国家互联网应急中心、工信部等多部门接连发布风险警示。威努特基于国家关键信息基础设施安全防护经验,打造WinClaw安全版AI智能体,其核心竞争力在于**五层纵深防护体系**。本文从安全痛点切入,通过真实事故案例揭示风险本质,全景解构五层防护的架构设计与技术原理,逐层拆解身份认证、安装审查、消息拦截、执行约束、监控审计的实现逻辑,搭配20+实操演示、对比表格

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 497

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

Android Binder——数据传递载体(二十一)

同一进程间的对象传递都是通过引用来做的,因而本质上就是传递了一个内存地址。而跨进程采用了虚拟内存机制,两个进程都有自己独立的内存地址空间,所以跨进程传递的地址值是无效的。进程间的数据传递是 Binder 机制中的重要一环,Android 系统中担负这一重任的就是 Parcel。Parcel 是一种数据的载体,用于承载希望通过 IBinder 发送的相关信息(包括数据和对象引用)。正是基于 Parcel 这种跨进程传输数据的能力,进程间的 IPC 通信才能更加平滑可靠。

小旭的专栏 576

iBatis笔记

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

了凡 450

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

lwip-2.0.3

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

ibatis的动态sql

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

李义星 499

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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、付费专栏及课程。

余额充值