Mybatis源码分析——MappedStatement(1)

MyBatis 核心组件 MappedStatement 详解:一篇文章搞懂所有核心属性! 在 MyBatis 的底层架构中,有一个组件堪称“SQL执行的灵魂”——它就是 MappedStatement。无论是简单的 selectOne 还是复杂的动态 SQL,最终都要通过它来完成 SQL 解析、参数绑定、执行和结果映射。今天,我们就来深度拆解这个核心组件,把它的核心属性一次性讲透! 阅读详情

在 MyBatis 中,MappedStatement 是一个核心类,它表示一个映射语句的配置项,用于将 SQL 查询、更新、插入等操作与 Mapper 接口方法进行关联。MappedStatement 是 MyBatis 中 SQL 执行的配置和管理的核心对象之一。它保存了 SQL 语句的元数据、参数类型、返回值类型等信息。

1. MappedStatement 的作用和概述

在 MyBatis 中,每个 SQL 映射语句(如 select, insert, update, delete)都会生成一个 MappedStatement 实例。它充当着 SQL 执行的配置对象,将一个 SQL 语句的描述与 Mapper 方法的调用过程联系起来。MappedStatement 作为 MyBatis 中最重要的执行元数据之一,存储了与 SQL 执行相关的所有信息。

2. MappedStatement 的构成

一个 MappedStatement 对象通常包含以下几个重要的组成部分:

  • ID:映射语句的唯一标识符,对应 Mapper 文件中 SQL 映射的 id 属性。
  • SQL 语句:具体的 SQL 查询语句,可能是 select、insert、update 或 delete。
  • 参数类型:方法参数的类型,通常是一个 POJO 类或者基本类型,用于绑定查询条件或插入数据。
  • 返回类型:执行 SQL 后返回的数据类型,通常是一个 Java 类或集合类型。
  • SQL 执行类型:表示该 SQL 是查询、更新、插入还是删除操作。
  • 缓存配置:与二级缓存相关的配置,MappedStatement 中包含了关于缓存的设置。
  • 结果映射:指定如何将 SQL 查询结果映射成 Java 对象,通常是通过 resultMap 来配置。
  • 执行器:MappedStatement 会被 Executor 使用,Executor 负责执行实际的 SQL 操作。

3. MappedStatement 的生命周期

MappedStatement 是 MyBatis 映射文件解析后得到的对象。在 MyBatis 启动时,SqlSessionFactory 会加载所有的 Mapper 配置文件,并解析其中的 SQL 映射语句(即 select, insert, update, delete)。每解析一个 SQL 映射语句,就会生成一个 MappedStatement 对象并将其保存在 Configuration 的 mappedStatements 中。

  • MappedStatement 存储了 SQL 的所有相关元数据(例如:SQL 语句、返回类型、参数类型、查询映射、缓存等信息)。
  • SqlSession 在执行 SQL 时会通过 MappedStatement 获取这些元数据,并执行相关的 SQL 操作。

4. MappedStatement 的创建

在 MyBatis 启动时,MyBatis 会解析配置文件中的 Mapper 文件,并将其中的 SQL 映射信息转化为 MappedStatement 对象。每个 Mapper 文件的 select、insert、update、delete 标签对应一个 MappedStatement。例如,<select id="selectUserById" ...> 标签对应一个 MappedStatement。

示例:解析过程

假设有一个 Mapper 接口和 XML 映射文件如下:

UserMapper.java:

public interface UserMapper {
    User selectUserById(int id);
}

UserMapper.xml:

<mapper namespace="com.example.mapper.UserMapper">

    <select id="selectUserById" resultType="com.example.model.User" parameterType="int">
        SELECT * FROM users WHERE id = #{id}
    </select>

</mapper>

在 MyBatis 启动时,UserMapper.xml 会被解析,<select> 标签会被转换为一个 MappedStatement 对象。

MappedStatement mappedStatement = new MappedStatement.Builder(configuration, "selectUserById", sqlSource, SqlCommandType.SELECT)
    .parameterMap(parameterMap)
    .resultMap(resultMap)
    .build();
  • sqlSource:存储 SQL 查询语句和参数的 SqlSource 对象。
  • parameterMap:映射 SQL 参数和方法参数之间的关系。
  • resultMap:映射 SQL 查询结果和 Java 对象之间的关系。

MappedStatement 被 Configuration 对象存储在 mappedStatements 中,SqlSession 执行时会根据 id 获取对应的 MappedStatement,并执行 SQL。

5. MappedStatement 的字段说明

以下是 MappedStatement 类的一些重要字段及其含义:

  • id:映射语句的唯一标识符。通常是 Mapper 接口方法的名称,或映射文件中 SQL 语句的 id 属性。
  • sqlSource:SQL 源,它包含了 SQL 语句及其相关信息。SqlSource 接口的实现类有 RawSqlSource、StaticSqlSource 和 DynamicSqlSource 等。
  • parameterMap:参数映射,表示 SQL 语句中的参数如何与方法参数进行映射。
  • resultMap:结果映射,定义如何将 SQL 查询结果映射成 Java 对象。
  • sqlCommandType:SQL 执行类型,表示 SQL 是 select、insert、update 还是 delete。
  • fetchSize:SQL 执行时的 fetchSize,用于设置一次从数据库中获取的记录数。
  • timeout:SQL 执行的超时时间,单位为秒。
  • cache:是否启用缓存。可以为 true 或 false。
  • flushCacheRequired:是否要求在执行 SQL 时刷新缓存。
  • useCache:是否使用缓存。

6. MappedStatement 和 Executor 的关系

当 MyBatis 执行 SQL 时,它会通过 MappedStatement 来获取 SQL 语句的相关信息,然后交给 Executor 来执行。Executor 会根据 SQL 类型(查询、更新等)来选择合适的执行方式。

例如,执行查询时,Executor 会通过 MappedStatement 获取 SqlSource 和 parameterMap,然后执行 SQL,并将结果映射成 Java 对象。Executor 还会根据是否开启了缓存来决定是否将查询结果缓存。

7. 总结

  • MappedStatement 是 MyBatis 中用于存储 SQL 映射的核心对象,包含了 SQL 语句、参数类型、返回类型等元数据。
  • 它是 MyBatis 在执行 SQL 时查询数据库、映射结果、管理缓存等操作的基础。
  • 每个 SQL 映射语句(如 select、insert、update、delete)都会生成一个 MappedStatement,并通过 Executor 执行。
  • MappedStatement 可以配置缓存、结果映射、参数映射等信息,是 MyBatis 中执行 SQL 操作的关键。
Mybatis3源码分析(05)-加载Configuration-加载MappedStatement XMLStatementBuilder.parseStatementNode()方法 resultMap元素的解析已经分析完毕。与resultMap不一样,XmlMapperBuilder在解析select/update/insert/delete的元素时会创建一个XMLStatementBuilder对象,解析的工作交由其方法parseStatementNode()方法完成。private v 阅读详情

相关推荐

mybatis源码,从配置到 mappedStatement —— mapper.xml 是如何被解析的?

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 Ext1:本文源码解析基于 mybatis-spring-boot-starter 2.1.1,即 mybatis 3.5.3 版本。 Ext2:本文主要是对源码的讲解,着重点会是在源码上。 一、从 MybatisAutoConfiguration 说开去,mapper 文件是怎么扫描的? 我们知道配置SqlSes...

JKX_geek的博客 1041

Mybatis MappedStatement

MappedStatement 类是 Mybatis 框架的核心类之一,它存储了一个 sql 对应的所有信息 Mybatis 通过解析 XML 和 mapper 接口上的注解,生成 sql 对应的 MappedStatement 实例,并放入 SqlSessionTemplate 中 configuration 类属性中 正真执行 mapper 接口中的方法时,会从 configuration 中找到对应的 mappedStatement,然后进行后续的操作

qq_37436172的博客 2993

MyBatis源码分析

篇章一:入口篇 我们学习Mybatis时知道其核心是SqlSessionFactory,它是mybatis的核心类,也是Mybatis运行的入口,spring集成mybatis时需要配置SqlSessionFactoryBean和扫描mapper的MapperScannerConfigurer,spring-mybatis集成主要的配置就这么点,从这理解也就不难理解mybatis入口问题了,但是...

简乐君 1万+

Mybatis 源码分析 —— MappedStatement 解析

解析 xml 生成对应 mappedStatement 的流程分析。

一步一步往上爬 1万+

Mybatis源码分析篇

在上几篇文章中大致介绍了mybatis的作用和用法。本篇主要对mybatis的源码做一个分析。而在源码分析之前,需要重点介绍mybatis几个重要的类:SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Configuration、MappedStatement、SqlSource、LanguageDriver、KeyGenerator、Executor;每个类都有各自的角色职责。});

YaYicho的博客 736

ICG setup timing violation介绍?

门控时钟(clock gating)在RTL级电路设计过程中进行低功耗优化常用方法,能够有效降低动态功耗(翻转功耗)。Clock gating cell 可以由与门,与非门,或门或者或非门构成,但很容易产生Glitch。在实际使用中,一般用ICG(集成门控时钟单元)来完成clock gating。 下图展示了glitch的产生原因 在CTS时钟树综合的时候,ICG不会被看作sink,通常放置在source点附近,因此就会出现如上图这种结果。上图可以看出,在分析DFF到ICG的setup timing

m0_61003348的博客 9812

MappedStatement 分析

采用#{var}的形式来引用变量时,其中的变量会在解析Mapper.xml文件中的语句时,就被替换成占位符“?上述方法主要是对动态标签的解析,获取完全可执行的sql。若上传多个参数对象时:为ParamMap对象,由于我们使用了@Param注解,故可以使用注解的key,也可以使用param1取出变量。该对象为sql执行的参数。注意:ParameterObject是一个Object对象,上传不同的参数时,该对象的类型不同。BoundSql对象中的sql对象是对动态标签解析后的完全可执行的sql。

qq_44021627的博客 1128

全网最详细 解决戴维南定理的详细推导

替代定理,戴维南定理详细证明

m0_52555753的博客 3万+

Mybatis—MappedStatement

Mybatis通过MappedStatement来描述XML中和@Select、@Update等注解配置的SQL信息,Mybatis在解析XML配置构造Configuration的时候一并解析构造好了MappedStatement,以XMLConfigBuilder#parse为切入点,一起来分析下Mybatis是如何完成构造MappedStatement。

乐只悠悠 2075

智能车实战——从ADC采集到PWM控制,让电磁车精准循迹

本文详细介绍了电磁循迹智能车的实现原理与实战技巧,涵盖从ADC信号采集、PWM控制到PID算法整定的全流程。通过STM32代码示例解析电感信号处理、差比和偏差计算及电机驱动等关键技术,帮助开发者快速掌握智能车精准循迹的核心方法,提升电磁车竞赛项目的开发效率。

weixin_29192211的博客 303

保姆级教程:手把手带你复现APFNet论文的RGBT目标跟踪模型(附完整代码与数据集配置)

本文提供了一份详细的APFNet论文复现指南,涵盖从环境搭建到模型测试的全流程。通过解析多模态融合模块和渐进式训练流程,帮助读者高效完成RGBT目标跟踪模型的复现工作,特别针对训练和测试中的常见问题提供实用解决方案。

weixin_29056781的博客 346

源码分析Mybatis MappedStatement的创建流程(1)

既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。

2401_84048225的博客 390

Webpack打包到宝塔上线:前端小白也能搞定的部署保姆教程

本文为前端开发者提供了一份详尽的Webpack项目部署指南。通过宝塔面板的可视化操作,手把手教你如何将Vue3等项目从本地构建、打包,到上传服务器、配置Nginx,最终完成上线部署的全过程,有效解决了新手在项目上线环节的常见难题。

jjj34的博客 225

Java最新源码分析Mybatis MappedStatement的创建流程(1),阿里P8面试官都说太详细了

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题。注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友互联网工程师必备的面试1000题而且从上面三家来看,算法与数据结构是必备不可少的。

pCITv1C的博客 994

展锐平台wifi连接性问题解决方案

对于断开连接的问题,需要从kernel log中确认下,是上 层主动发起的断开(会下发disconnect的命令),还是CP侧上报的断开事件。同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。1、出现wifi连接正常,但无法上网问题,首先确认其他手机是否可以正常上网,排除网络自身问题;3 路由器配置问题,出现过一个案例,恢复出场设置问题就解决了,具体根因。

手机-手表蓝牙开发工程师的博客 2023

AgentScope 实战训练营-7 种多智能体协作模式详解

本教程基于阿里巴巴开源的AgentScope Java框架,系统讲解多智能体系统的开发方法。涵盖7种核心协作模式:Pipeline流水线、Routing路由、Handoffs智能体交接、Supervisor监督器、Subagent子智能体、Skills技能系统及Workflow工作流。详细阐述ReActAgent、AgentScopeAgent、StateGraph等核心概念,提供完整的配置示例与代码实现,帮助开发者快速掌握基于Spring AI Alibaba的多智能体应用开发。

program哲学 164

源码分析Mybatis MappedStatement的创建流程

本文是Mybatis源码分析第二篇,重点分析Mybatis Mapper.java是如何与mapper.xml文件中的SQL建立联系,即MappedStatement对象的创建流程。1、源码分析Mybatis MapperProxy创建流程;源码分析Mybatis MappedStatement的创建流程;3、源码解析MyBatis Sharding-Jdbc SQL语句执行流程详解;4、源码分析Mybatis插件(Plugin)机制;5、源码分析Mybatis一二级缓存

中间件兴趣圈 5875

微信小程序- 云开发上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。(小程序上传部署云函数提示错误,开发控制台中的云函数没有删除,详细排查)

微信小程序——云函数上传失败,微信小程序——解决上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。微信小程序上传云函数失败,微信小程序云开发|Error: ResourceNotFound.FunctionName, FunctionName 指定的资源不存在。微信云开发报错(Error: ResourceNotFound.FunctionName,微信小程序云函数报错,上传云函数 sum 失败 Error:,上传部署我们的云函数 2. 报错 错误信息

🏆 前端领域优质创作者 4319

Mybatis源码分析——MappedStatement(2)

上一篇主要讲了MappedStatement基本概念,接下来主要分析动态sql语句怎么解析成MappedStatement。在 MyBatis 中,动态 SQL 是指根据条件动态生成 SQL 语句的功能。动态 SQL 语句通常在Mapper文件中使用<if><choose><when><foreach>等标签来实现。当 MyBatis 执行动态 SQL 时,它会将这些动态 SQL 解析成一个对象,然后通过Executor执行相应的 SQL。

java_xiaowangzi的博客 1587

lwip-2.0.3

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

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Mybatis-Spring源码分析(五) MapperMethod和MappedStatement解析

基本上这就是Mybatis-Spring源码的最后一篇了,如果想起来什么再单开博客。比起来Spring源码,Mybatis的确实简单一些,本篇就说一下Mybatis中两个十分重要的类MapperMethod,MappedStatement以及其在Mybatis的流程中的主要作用。

Smallc0de的博客 4369

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

mybatis中MappedStatement注入到StrictMap过程

MappedStatement注入到StrictMap(mappedStatements)

zys1440298847的博客 551

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

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

Mybatis 源码分析 —— 运行流程解析

mybatis 运行各节点流程归纳。

一步一步往上爬 669

Mybatis 核心源码分析

一、Mybatis 整体执行流程 二、Mybatis 层次结构 三、源码分析

Julie的博客 1万+

mybatis plus 批量保存_mybatis源码分析

原理图:Configuration解析:Configuration表示配置,该对象中维护了很多mybatis的配置参数;大致可分为四部分:1.环境变量Environment 2.配置参数;3.缓存集合;4.插件及其他1.1环境变量EnvironmentEnvironment.java源码通过Environment源码可以看出,Environment仅维护了一个id 唯一标识,Transaction...

weixin_39866966的博客 2062

MyBatis工作原理源码分析(一)——SqlSessionFactory的初始化

SqlSessionFactory的初始化

scorpio的博客 1527

Mybatis源码分析(自己动手造轮子)

个人博客欢迎访问 总结不易,如果对你有帮助,请点赞关注支持一下 目录Mybatis基础概念缓存简介一级缓存二级缓存高级查询建表一对一查询联合查询嵌套查询一对多查询扩展问题#{}和${}的区别什么是Sql注入为什么需要预编译通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?MyBatis源码Mybatis的编程步骤Mybatis的工作原理Mybatis的功能架构配置文件解析过程配置文件解析入口解析 environmen

qq_45796208的博客 2758
上一篇: Mybatis框架中动态代理
下一篇: Mybatis源码分析——MappedStatement(2)
yang_xinkun
博客等级 码龄10年 108粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值