转自:https://www.cnblogs.com/westward/p/6706570.html

最近在学Mybatis,在学到动态sql的trim标签时,很迷惑。不知所以然。看别人的博客和论坛里的解释,太宽泛,还是不能理解:

trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides;正因为trim有这样的功能,所以我们也可以非常简单的利用trim来代替where元素的功能。

例1:

1

2 select * from users

3

4

5 name=#{name}

6

7

8 and address=#{address}

9

10

11

可以看到后台打印的sql:

例2:

1

2 select * from users

3

4

5 or name=#{name}

6

7

8 and address=#{address}

9

10

11

后台报错:

怎么办呢?遇到问题,当然要想办法解决。灵光一闪,我不是把源代码绑定到了mybatis的jar上了吗?对,那就看源代码,源代码还能debug呢,更方便。

trim标签的java方法调用栈轨迹:(只写出关键的几个)

org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply()

org.apache.ibatis.scripting.xmltags.TrimSqlNode.FilteredDynamicContext.applyAll()

org.apache.ibatis.scripting.xmltags.TrimSqlNode.FilteredDynamicContext.applyPrefix()

applyPrefix()的源代码:

代码块1:

1 private void applyPrefix(StringBuilder sql, String trimmedUppercaseSql) {

2 if (!prefixApplied) {

3 prefixApplied = true;

4 if (prefixesToOverride != null) {

5 for (String toRemove : prefixesToOverride) {

6 if (trimmedUppercaseSql.startsWith(toRemove)) {

7 sql.delete(0, toRemove.trim().length());

8 break;

9 }

10 }

11 }

12 if (prefix != null) {

13 sql.insert(0, " ");

14 sql.insert(0, prefix);

15 }

16 }

17 }

prefixApplied的值:初始是false.从下面代码内部类TrimSqlNode.FilteredDynamicContext的构造器可以看出:

代码块2:

1 public FilteredDynamicContext(DynamicContext delegate) {

2 super(configuration, null);

3 this.delegate = delegate;

4 this.prefixApplied = false;

5 this.suffixApplied = false;

6 this.sqlBuffer = new StringBuilder();

7 }

List集合类型prefixesToOverride :trim标签的属性prefixOverrides,

String类型prefix:trim标签的属性prefix.

trimmedUppercaseSql:trim标签的子标签里的sql语句.

见下面代码:(TrimSqlNode的成员变量):

代码块3:

1 private String prefix;

2 private String suffix;

3 private List prefixesToOverride;

4 private List suffixesToOverride;

现在我们在回看代码块1,会发现整个方法的大致意思:当trim标签prefixOverrides属性不为空时,遍历prefixOverrides集合的值,并且用trim标签里第一个子标签(比如if标签)的sql的语句头去匹配prefixOverrides集合的元素值,一旦匹配成功,则将第一个子标签的sql语句匹配的元素删掉,继续向下运行,判断prefix属性是否有值,若有值,在将prefix的值放到第一个子标签的sql语句开头。

所以,例2,将prefixOverrides的值改为 or  或者 and|or 就行了。

好吧,就是这样,可能是自己的语言表达能力不够水平,感觉还是看代码来的精确 :)

最后在总结下吧:

trim标签的prefixOverrides和prefix分两步骤:

1.如果prefixOverrides有元素,拿元素去匹配 第一个子标签sql语句,若匹配上,就删掉sql语句的匹配部分,跳到2

2.如果prefix有值,就在  第一个子标签sql语句 的最前面加上 prefix的值。

mysql的trim动态标签_Mybatis之trim标签的理解相关推荐

  1. mybatis trim标签_MyBatis学习笔记

    MyBatis开发文档: mybatis - MyBatis 3​mybatis.org mapper接口开发的四个规范: XxxMapper.xml配置文件的名称命名空间值必须是mapper接口的全 ...

  2. mysql高可用 持久层_MyBatis持久层框架使用总结 转载

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2 ...

  3. mybatis之trim prefix= suffix= suffixOverrides= prefixOverrides=/trim

    转载自 https://blog.csdn.net/qq_33054511/article/details/70490046 1.<trim prefix="" suffix ...

  4. .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper

    .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper 參考演示样例代码,例如以下所看到的: /// <summary>/// MySql 数 ...

  5. 修改mysql参数_mysql动态修改参数

    mysql数据库可以动态的修改参数,即可以修改会话级变量只对当前会话产生影响:又可以修改全局变量,对所有新连接的会话都产生影响. 1>修改全局变量 [root@admin root]# mysq ...

  6. 动态创建表格给同一个标签创建点击事件并让点击事件操作内容不一样

    动态创建表格给同一个标签创建点击事件,每个点击事件操作的元素不一样. 现在有这样的需求,点击"查看详细"显示或隐藏标签.要实现这样的效果就要给点击标签添加两个属性,一个属性是nam ...

  7. 写MySQL存储过程实现动态执行SQL

    写MySQL存储过程实现动态执行SQL --存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数create procedure p_procedurecode(i ...

  8. mysql数据库特征_如何掌握MySQL数据库中动态表的特征

    以下的文章主要介绍的是如何正确掌握MySQL数据库中动态表的特征,可以说动态表在MySQL数据库中使用频率还是很大的,所以MySQL数据库中动态表的掌握也是一件很重要的事情,以下就是文章的具体内容. ...

  9. python3连接mysql获取ansible动态inventory

    脚本地址:https://github.com/AlbertCQY/scripts/tree/master/ansible 脚本用法:README.txt 1.脚本用法 bestpay用户 cd /t ...

最新文章

  1. 工业传感器:工业互联网的第一道门
  2. php 下载exe 打不开,EXE文件打不开的解决方法
  3. 剑指offer: 不用加减乘除做加法
  4. CNN tensorflow 人脸识别
  5. Flutter与JS的双向调用、Flutter中Widget与Html混合加载
  6. mysql的count函数类型是什么意思_详细解读MySQL中COUNT函数的用法
  7. 传智播客--itcastbbs(四)
  8. 奈飞文化手册_《奈飞文化手册》速阅提炼分享3
  9. 初学java之Map接口
  10. 性能翻倍!斯坦福Matei团队推出机器学习模型优化新方法
  11. nero 2015 installing
  12. dw怎么保存html格式,教你如何用Dreamweaver制作网页以及保存网页的方法--系统之家...
  13. OSChina 周四乱弹 —— 大光头与地中海并行,格子衫共沙滩裤一色
  14. 微信小游戏上线字节平台超全攻略
  15. HTML 媒体(Media)
  16. Zotero+Web of Science 实现批量导入下载文献
  17. Model Adaption: Unsupervised Domain Adaption Without Source Data
  18. 蚂蚁笔记 linux安装教程,群晖docker安装蚂蚁笔记安装教程
  19. google GMS
  20. Kafka 开启 SASL/PLAINTEXT 认证及 ACL

热门文章

  1. .net使用websocket
  2. MVC 源码系列之路由(一)
  3. $.messager.confirm (使用$.messager.defaults修改按钮显示文字)
  4. 这些git技能够你用一年了
  5. PHPExcel读取excel的多个sheet存入数据库
  6. 医疗信息化、医学相关资料下载
  7. [备忘][转载]apache 403错误 You don't have permission to access on this server
  8. 分享Silverlight新鲜事(11月15日-21日) - PDC 10 Downloader
  9. Markdown拾遗
  10. 原生 js 上传图片