有几年开发经验的程序员应该都有暗骂过原生的SQL语句吧。因为他们不能一句就搞定一个业务,往往还要通过代码来拼接相关的SQL语句。相信大家会理解SQL里面的永真(1=1),永假(1=2)的意义吧。所以mybatis动态SQL功能在笔者看来是最引吸人的。为了更好的区别XML映射文件上的SQL语句。mybatis把SQL语句分为四类。那么这个笔者已经在前面的章节里面讲过了。但是我们在开发过程中常常用到的也就俩种:静态和动态。
关于静态和动态的定义,笔者是这样子理解的——静态SQL语句显示就是里面没有相关的罗辑。即是没有#if之类的语活。反之则是动态SQL语句。而笔者感兴趣是动态SQL部分。我们都知道在读取XML映射文件信息的时候就会分析当前的SQL语句属于哪一种类型。这部分工作就是放在源码的XMLScriptBuilder类里面。
public SqlSource parseScriptNode() {
List<SqlNode> contents = parseDynamicTags(context);
MixedSqlNode rootSqlNode = new MixedSqlNode(contents);
SqlSource sqlSource = null;
if (isDynamic) {
sqlSource = new DynamicSqlSource(configuration, rootSqlNode);
} else {
sqlSource = new RawSqlSource(configuration, rootSqlNode, parameterType);
}
return sqlSource;
}
看到了吧,是通过成员isDynamic的值来获取相关类型的SQL语句类。DynamicSqlSource类从字面上来讲就很容易看出来是属于动态的。而下面便是静态的。关键的部分还是在parseDynamicTags方法里面。
为了实现动态SQL语句的功能。mybatis设置几个动态的节点。如if,choose 等。当然如果你们想要知道有几个的话,最好跟笔者一样子点开他相关的DTD文件。如下
<!ELEMENT select (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*>
我们可以看到include 、trim 、where 、set 、foreach 、choose 、if 、bind。各自的用法在官网上面有些详细的说明。 大家可以去看看。相信大家看到这里心里应该有了一定的想法。为了实现动态SQL,那么mybatis一定会根据不同的节点来做不同的逻辑处理。这也是笔者为什么说——关键的部分还是在parseDynamicTags方法里面。因为parseDynamicTags方法是用于分析当前select或是delete等节点的SQL节点(即是SqlNode类)。可以说终于生成的SQL语句就是靠这若干个SqlNode类提供生成的。在前面几章中我们有讲到关于BoundSql类的作用。在这里就一下明白了。如下图
通过parseDynamicTags方法分析出需要用到的若干个SqlNode类。并确定他是否是动态SQL语句。如果是,就创建DynamicSqlSource类。而DynamicSqlSource类会存放在MappedStatement类里面。当我们要通过BoundSql类来生成StatementHandler实例的时候,就会从通过MappedStatement类获得对应的BoundSql类。而BoundSql类的getSql方法就会我们最终的落点。
其实笔者的内心是有一点小失望的。我本以为mybatis会一直实现自己的元素处理。当然这只是笔者内心的一点完美主义吧。正如官网上讲的MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。所以我们可以源码里面看到ognl的应用。
Map<Object, OgnlClassResolver> context = Ognl.createDefaultContext(root, new OgnlClassResolver());
对于ongl笔者就不想多说了。有兴趣的读者们可以自己去看一下。笔者建议还是去看一下吧。struts2框架里面也用到他了。
关于mybatis系列笔者就记录到这里了。希望对大家有用。
MyBatis 源码分析——动态SQL语句的更多相关文章
-
Spring mybatis源码篇章-动态SQL节点源码深入
通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-动态SQL基础语法以及原理 前话 前文描述到通过mybatis默认的解析驱动类org.apache.ibat ...
-
Spring mybatis源码篇章-动态SQL基础语法以及原理
通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-Mybatis的XML文件加载 前话 前文通过Spring中配置mapperLocations属性来进行对m ...
-
MyBatis 源码分析——动态代理
MyBatis框架是如何去执行SQL语句?相信不只是你们,笔者也想要知道是如何进行的.相信有上一章的引导大家都知道SqlSession接口的作用.当然默认情况下还是使用DefaultSqlSessio ...
-
mybatis源码解读(五)——sql语句的执行流程
还是以第一篇博客中给出的例子,根据代码实例来入手分析. static { InputStream inputStream = MybatisTest.class.getClassLoader().ge ...
-
MyBatis源码分析-SQL语句执行的完整流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
-
精尽 MyBatis 源码分析 - MyBatis 初始化(三)之 SQL 初始化(上)
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
-
精尽MyBatis源码分析 - MyBatis初始化(四)之 SQL 初始化(下)
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
-
精尽MyBatis源码分析 - SQL执行过程(四)之延迟加载
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
-
精尽 MyBatis 源码分析 - SqlSession 会话与 SQL 执行入口
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
随机推荐
-
Python-lambda函数,map函数,filter函数
lambda函数主要理解: lambda 参数:操作(参数). lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值.lambda语句构建的其实是一个函数对象 map函数: ma ...
-
Java从0开始学——字符串
#,java中的字符串是不可变的: #,比较两个字符串是不是相等,不能用==,因为那只能确认他们是否指向了同一个字符串对象: #,空串和null是不同的: #,代码点和代码单元 #,代码点表示 ...
-
CSS3——动画效果
CSS3动画在Style里面就实现了以往我们用JQ写的动画效果,着实简便了不少~ 简单Demo: html代码: <div id="dv1"></div> ...
-
I/O多路复用之select
1.什么是I/O多路复用 关于什么是I/O多路复用,在知乎上有个很好的回答,可以参考罗志宇前辈的回答. 这里记录一下自己的理解.我认为要理解这个术语得从两方面去出发,一是:多路是个什么概念?二是:复用 ...
-
mac安装GNU命令行工具
mac安装GNU命令行工具 2.添加的repo tap home/dupes brew install coreutils binutils diffutils ed -- ...
-
KaliLinuxNetHunter教程下载相关资源
KaliLinuxNetHunter教程下载相关资源 当用户将刷机工具准备完后,则需要下载ROM包.ROM是ROM image(只读内存镜像)的简称,常用于手机定制系统.一般手机刷机的过程,就是将只读 ...
-
系统更新报错--NO_PUBKEY
错误信息 W: An error occurred during the signature verification. The repository is not updated and the p ...
-
Spring data JPA中使用Specifications动态构建查询
有时我们在查询某个实体的时候,给定的条件是不固定的,这是我们就需要动态 构建相应的查询语句,在JPA2.0中我们可以通过Criteria接口查询,JPA criteria查询.相比JPQL,其优势是类 ...
-
Linux基础知识之用户和用户组以及 Linux 权限管理
已经开始接触Linux用户管理,用户组管理,以及权限管理这几个逼格满满的关键字.这几个关键字对于前端程序猿的我来说真的是很高大上有木有,以前尝试学 Linux 的时候看到这些名词总是下意识的跳过不敢看 ...
-
关于cookie和session
在设置cookie的时候,它会保留在本地,无论你有没有退出浏览器都是.但是session只能在登录状态有效.退出浏览器过后就会消除掉.同时设置也是有问题的. @app.route('/login',m ...