【十五】Mybatis动态SQL实现原理

Mybatis动态SQL实现原理

目录

Mybatis动态SQL实现原理

概述

[动态 SQL](#动态 SQL)

实现原理

总结


概述

每天日常开发都在使用mybatis,但是很多人并没有花心思去理解mybatis的实现原理,一直处于使用阶段,程序员的使命是改变世界,这一点可能很多人没有在意,但是在意的人的确在意了,所以一直在努力。

动态 SQL

大家应该日常都在使用这一特性,下面是我从官网找的一个例子:

复制代码
<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG
  <where>
    <if test="state != null">
         state = #{state}
    </if>
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

这里使用了<select> 、<if>、<where> 这些标签,我们在实际工作中还会使用其他的标签,到这里大家应该是比较熟悉的,接下来我将讲解一下这些标签的实现原理。

实现原理

Mybatis中可以通过注解(@Select、@Insert、@Delete、@Update)和xml配置文件这两种方式配置sql信息,如果我们要实现这样一个功能,我们该怎么做呢?

首先,我们是不是需要设计一个类来接受sql解析的信息,这里mybatis设计了SqlSource:

可以看到,这里有四个不同的实现,分别有不同的作用,这些细节大家可以翻阅源码阅读,中间的实现细节这里略过,重点讲解一下sql配置信息到sqlSource对象的转换过程。

这里我们需要了解一个核心实现LanguageDriver:

这里我们重点关注XMLLanguageDriver和RawLanguageDriver实现,XMLLanguageDriver支持XML标签实现动态SQL的功能,RawLanguageDriver支持静态SQL配置功能。

XMLLanguageDriver实现了父类LanguageDriver接口中两个重载的方法分别用来处理xml方式和Java注解方式配置的sql信息。在处理xml配置文件中我们可以看到是通过XMLScriptBuilder类的parseScriptNode()方法实现的,在这个类里我们看到了如下标签:

复制代码
private void initNodeHandlerMap() {
    nodeHandlerMap.put("trim", new TrimHandler());
    nodeHandlerMap.put("where", new WhereHandler());
    nodeHandlerMap.put("set", new SetHandler());
    nodeHandlerMap.put("foreach", new ForEachHandler());
    nodeHandlerMap.put("if", new IfHandler());
    nodeHandlerMap.put("choose", new ChooseHandler());
    nodeHandlerMap.put("when", new IfHandler());
    nodeHandlerMap.put("otherwise", new OtherwiseHandler());
    nodeHandlerMap.put("bind", new BindHandler());
  }

分析到这里感觉实现好清晰,如果我们自己来设计估计也是这样的方式吧。这里有个惊喜就是注解方式实际上也是通过XMLScriptBuilder类解析的,这里需要注意的是在注解中要加入<Script>标签,这里注解里面的内容解析处理也是XNode对象。

总结

闲来无事大概分析了一下Mybatis动态SQL实现原理,很多细节没有去讲解,因为这里面内容很简单而且资料多如牛毛,不愿再做过多重复阐述,写这篇文章只是对自己的理解进行一次梳理,以便温故知新!

相关推荐
团子的二进制世界2 分钟前
G1垃圾收集器是如何工作的?
java·jvm·算法
long3167 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
独断万古他化17 分钟前
【SSM开发实战:博客系统】(三)核心业务功能开发与安全加密实现
spring boot·spring·mybatis·博客系统·加密
rannn_11134 分钟前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
灵感菇_36 分钟前
Java HashMap全面解析
java·开发语言
qq_124987075338 分钟前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
短剑重铸之日44 分钟前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
若鱼19191 小时前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
觉醒大王1 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
努力学编程呀(๑•ี_เ•ี๑)1 小时前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea