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

Mybatis源码学习

一、Mybatis核心概念

名称 意义
Configuration 管理 mybatis-config.xml 全局配置关系类
SqlSessionFactory Session 管理工厂接口
Session SqlSession 是一个面对用户的接口。SqlSession 提供了很多操作数据库方法
Executor 执行器是一个接口(基本执行器、缓存执行器)。作用:SqlSession 内部通过执行器操作数据库
MappedStatement 底层封装对象。作用对操作数据库存储封装,包括 sql 语句、输入输出参数
StatementHandler 具体操作数据库相关的 handler 接口
ResultSetHandler 具体操作数据库返回结果的 handler 接口

二、Mybatis源码包

文件夹 功能
annotations 注解相关
binding mapper相关
builder 解析xml相关
cache 缓存相关
cursor 返回结果相关
datasource 数据管理
exceptions 异常
executor 执行器
io classloader
jdbc jdbc
lang jdk7/jdk8
logging 日志相关
mapping mapper相关的封装
parsing xml相关解析
plugin 拦截器
reflection 反射相关
scripting 数据厂家
session session
type 返回类型对应

三、Mybatis操作表数据方式一源码

通过操作xml文件完成对数据库表数据查询

mybatis-conf.xml

<mappers><mapper resource="mybatis/UserMapper.xml"/>
</mappers>
@Test
public void test() throws IOException {String resource = "mybatis-config.xml";InputStream resourceAsStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();User user = sqlSession.selectOne("com.test.mybaits.UserMappper.selectUserById", 1);System.out.println(user.toString());
}
1.获取mybaits-config中的配置信息解析成Configuration对象,然后将Configuration对象传入DefaultSqlSessionFactory对象并返回DefaultSqlSessionFactory对象
org.apache.ibatis.session.SqlSessionFactoryBuilder#build(java.io.InputStream)>org.apache.ibatis.builder.xml.XMLConfigBuilder#XMLConfigBuilder(java.io.InputStream, java.lang.String, java.util.Properties) 创建构造函数>org.apache.ibatis.builder.xml.XMLConfigBuilder#parse>org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration  解析mybatis-config.xml成对象>org.apache.ibatis.parsing.XPathParser#evaluate	解析String、Boolean、Double、NodeList、Node类型数据都是调用这个方法处理的>org.apache.ibatis.builder.xml.XMLConfigBuilder#mappersElement >org.apache.ibatis.session.SqlSessionFactoryBuilder#build(org.apache.ibatis.session.Configuration) 将parseConfiguration获取的Configuration传入SqlSessionFactory2.通过 SqlSessionFactory 对执行器初始化然后获取 SqlSession
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSession>org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSessionFromDataSource>org.apache.ibatis.transaction.TransactionFactory#newTransaction(javax.sql.DataSource, org.apache.ibatis.session.TransactionIsolationLevel, boolean)>org.apache.ibatis.session.Configuration#newExecutor(org.apache.ibatis.transaction.Transaction, org.apache.ibatis.session.ExecutorType)>org.apache.ibatis.executor.SimpleExecutor 默认执行器>org.apache.ibatis.executor.CachingExecutor 缓存执行器,一级缓存>org.apache.ibatis.plugin.InterceptorChain#pluginAll 责任链模式拦截器3.通过SqlSession找到sql调用JDBC执行
org.apache.ibatis.session.defaults.DefaultSqlSession#selectOne(java.lang.String, java.lang.Object)>org.apache.ibatis.session.defaults.DefaultSqlSession#selectList(java.lang.String, java.lang.Object)>org.apache.ibatis.session.Configuration#getMappedStatement(java.lang.String) MappedStatement对象 就是下面的内容<delete id="deleteConfigByIds" parameterType="Long">delete from sys_config where config_id  = #{configId}</delete>>org.apache.ibatis.executor.CachingExecutor#createCacheKey>org.apache.ibatis.executor.BaseExecutor#createCacheKey 创建一级缓存的Key,由id(namespace+id)+sql+limit+offset等组成>org.apache.ibatis.executor.CachingExecutor#query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)>org.apache.ibatis.executor.CachingExecutor#query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)	>org.apache.ibatis.executor.BaseExecutor#query(org.apache.ibatis.mapping.MappedStatement, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler, org.apache.ibatis.cache.CacheKey, org.apache.ibatis.mapping.BoundSql)>org.apache.ibatis.executor.BaseExecutor#queryFromDatabase>org.apache.ibatis.executor.SimpleExecutor#doQuery>org.apache.ibatis.executor.statement.PreparedStatementHandler#query>org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleResultSets

四、Mybatis操作表数据方式二源码

mybatis-config.xml

<mappers><mapper class="com.test.mybaits.UserMappper"></mappers>
</mappers>
@Test
public void test1() throws IOException {String resource = "mybatis-config.xml";InputStream resourceAsStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user = userMapper.selectUserById(1);System.out.println(user.toString());
}
1.获取mybaits-config中的配置信息解析成Configuration对象,然后将Configuration对象传入DefaultSqlSessionFactory对象并返回DefaultSqlSessionFactory对象
org.apache.ibatis.session.SqlSessionFactoryBuilder#build(java.io.InputStream)>org.apache.ibatis.builder.xml.XMLConfigBuilder#XMLConfigBuilder(java.io.InputStream, java.lang.String, java.util.Properties) 创建构造函数>org.apache.ibatis.builder.xml.XMLConfigBuilder#parse>org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration  解析mybatis-config.xml成对象>org.apache.ibatis.parsing.XPathParser#evaluate	解析String、Boolean、Double、NodeList、Node类型数据都是调用这个方法处理的>org.apache.ibatis.builder.xml.XMLConfigBuilder#mappersElement >org.apache.ibatis.session.SqlSessionFactoryBuilder#build(org.apache.ibatis.session.Configuration) 将parseConfiguration获取的Configuration传入SqlSessionFactory2.通过 SqlSessionFactory 对执行器初始化然后获取 SqlSession
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSession>org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSessionFromDataSource>org.apache.ibatis.transaction.TransactionFactory#newTransaction(javax.sql.DataSource, org.apache.ibatis.session.TransactionIsolationLevel, boolean)>org.apache.ibatis.session.Configuration#newExecutor(org.apache.ibatis.transaction.Transaction, org.apache.ibatis.session.ExecutorType)>org.apache.ibatis.executor.SimpleExecutor 默认执行器>org.apache.ibatis.executor.CachingExecutor 缓存执行器,一级缓存>org.apache.ibatis.plugin.InterceptorChain#pluginAll 责任链模式拦截器
3.通过getMapper,最后还会调到SqlSession#selectOne
org.apache.ibatis.session.defaults.DefaultSqlSession#getMapper>org.apache.ibatis.session.Configuration#getMapper>org.apache.ibatis.binding.MapperRegistry#getMapper>org.apache.ibatis.binding.MapperProxyFactory#newInstance(org.apache.ibatis.session.SqlSession)>org.apache.ibatis.binding.MapperProxy#invoke>org.apache.ibatis.binding.MapperProxy.MapperMethodInvoker#invoke>org.apache.ibatis.binding.MapperProxy.PlainMethodInvoker#invoke>org.apache.ibatis.binding.MapperMethod#execute>org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object)

五、Mybaits操作表数据方式三源码

@Select("select * from user where id = #{id}")
<mappers><mapper class="com.test.mybaits.UserMappper"></mappers>
</mappers>
@Test
public void test() throws IOException {String resource = "mybatis-config.xml";InputStream resourceAsStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();User user = sqlSession.selectOne("com.test.mybaits.UserMappper.selectUserById", 1);System.out.println(user.toString());
}
@Select加载方式
org.apache.ibatis.builder.xml.XMLConfigBuilder#mappersElement>org.apache.ibatis.session.Configuration#addMapper>org.apache.ibatis.binding.MapperRegistry#addMapper>org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#parse>org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#loadXmlResource 先加载xml,看xml是否存在>org.apache.ibatis.builder.annotation.MapperAnnotationBuilder#parseStatement 再查看注解

第一种和第二、三种加载方式不同在于 org.apache.ibatis.builder.xml.XMLConfigBuilder#mappersElement

http://www.jsqmd.com/news/835972/

相关文章:

  • 2026“钉耙编程”中国大学生算法设计春季联赛(8)1007思路分享(期望)
  • 南充广告设计制作安装厂家优选:2026年灯光舞台,演艺主持,泡沫板一站式制作服务商盘点 - 四川华蔓广告有限公司
  • 南充广告公司优选榜单:2026年本地门头招牌,发光字,软膜灯箱现货供应链实力厂商 - 四川华蔓广告有限公司
  • 南京及镇江防水补漏服务商评测:全维度对比解析 - 奔跑123
  • 2026年5月正规的废气环保设备/除尘环保设备厂家推荐江苏环球环境工程集团有限公司 - 品牌鉴赏师
  • 【2026上海GEO优化怎么挑?合适的才是最好的】上海GEO优化公司选型参考:得赢科技核心能力详解 - 得赢
  • 南充广告设计制作安装厂家优选:2026年条幅锦旗,楼顶发光字,户外广告牌一站式制作服务商盘点 - 四川华蔓广告有限公司
  • 南充广告设计制作安装厂家优选:2026年易拉宝,X展架,行架租赁一站式制作服务商盘点 - 四川华蔓广告有限公司
  • 南充广告设计制作安装厂家优选:2026年PVC板雕刻,KT板,车贴一站式制作服务商盘点 - 四川华蔓广告有限公司
  • 贵阳市政工程建设公司如何做线上全网获客?2026年AI搜索推广与GEO优化指南 - 精选优质企业推荐官
  • 贵州实体企业老板如何做全网推广?2026年获客系统与服务商盘点 - 精选优质企业推荐官
  • Claude Skill Creator 2.0 完整上手攻略
  • 企业微信群活码开发-唯一客服企微xscrm源码开发
  • 南充广告设计制作安装厂家优选:2026年警示标识,围挡,展架一站式制作服务商盘点 - 四川华蔓广告有限公司
  • 虚幻游戏设计8个方向
  • 确认服务器被入侵后第一步应该断网还是保留现场用于取证?
  • 跻身全球第一梯队,itc保伦股份入选“2025年全球公共广播TOP3” - 品牌速递
  • 在合肥哪个招聘网站最有效?我是一个刚注册的新公司 - drfdxr
  • Conductor 完整上手攻略
  • 2026年5月评价高的废气处理设备/废气处理厂家推荐江苏环球环境工程集团有限公司 - 品牌鉴赏师
  • 南充广告设计制作安装厂家优选:2026年喷绘写真,平板UV喷印,亚克力字一站式制作服务商盘点 - 四川华蔓广告有限公司
  • 类与对象OOP作业总结
  • 2026年庭院铸铝门厂家推荐:从梯队到避坑,一篇读懂如何选 - Amonic
  • OpenSpec OPSX 完整指南
  • 南充广告设计制作安装厂家优选:2026年花草牌,小区园林标识,亚克力雕刻一站式制作服务商盘点 - 四川华蔓广告有限公司
  • Auto-Memory + CLAUDE.md
  • Ubuntu 服务器如何配置自动安全更新而不导致业务服务中断?
  • 贵州房地产销售行业如何做线上全网获客?2026年推广策略与服务商盘点 - 精选优质企业推荐官
  • 南充广告设计制作安装厂家优选:2026年门头招牌,发光字,软膜灯箱一站式制作服务商盘点 - 四川华蔓广告有限公司
  • 金华铸铝门厂家哪家好?2026年品牌梯队与避坑指南 - Amonic