当前位置: 首页 > news >正文

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

Mybatis动态SQL实现原理

目录

Mybatis动态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实现原理,很多细节没有去讲解,因为这里面内容很简单而且资料多如牛毛,不愿再做过多重复阐述,写这篇文章只是对自己的理解进行一次梳理,以便温故知新!

相关文章:

  • 在Unity AR应用中实现摄像头切换功能
  • 2025年服务器技术全景解析:量子计算、液冷革命与未来生态构建
  • 基于图像处理的道路监控与路面障碍检测系统设计与实现 (源码+定制+开发) 图像处理 计算机视觉 道路监控系统 视频帧分析 道路安全监控 城市道路管理
  • HTTP请求与前端资源未优化的系统性风险与高性能优化方案
  • Java高频面试之并发编程-12
  • 论文速读:《CoM:从多模态人类视频中学习机器人操作,助力视觉语言模型推理与执行》
  • element-ui日期时间选择器禁止输入日期
  • css filter 常用方法函数和应用实例
  • Android SDK 国内镜像及配置方法(2025最新,包好使!)
  • vue3+ts继续学习
  • 【自然语言处理与大模型】LlamaIndex的词嵌入模型和向量数据库
  • laravel 12 监听syslog消息,并将消息格式化后存入mongodb
  • CVE-2025-24813:Apache Tomcat RCE 漏洞分析
  • CyberSentinel AI开源程序 是一个自动化安全监控与AI分析系统
  • Tomcat中Web应用程序停止时为了防止内存泄漏,JDBC驱动程序被强制取消注册出现原因
  • 【落羽的落羽 C++】list及其模拟实现
  • 某公园楼栋自由曲面薄壳结构自动化监测
  • 薪技术|0到1学会性能测试第45课-apache调优技术
  • Apache Doris 使用指南:从入门到生产实践
  • 2025 后端自学UNIAPP【项目实战:旅游项目】2、安装下载引用前端UI框架:uview-plus
  • 奥迪4S店内揭车衣时遭“连环车损”,双方因赔偿分歧陷僵局
  • 综合治理食品添加剂滥用问题,国务院食安办等六部门联合出手
  • 什么让翻拍“语文”成为短视频新风潮
  • 这 3 种食物,不要放进微波炉!第 1 个就大意了
  • 巴菲特股东大会十大金句:未来五年内可能有投资机会,快乐的人活得更久
  • 五大白酒去年净利超1500亿元:贵州茅台862亿领跑,洋河营收净利齐降