Mybatis核心概念:
Configuration : 管理 mysql-config.xml 全局配置关系类
SqlSessionFactory: Session 管理工厂接口
Session: SqlSession 是一个面向用户(程序员)的接口。SqlSession 中提供了很多操作数据库的方法
Executor : 执行器是一个接口(基本执行器、缓存执行器)。 作用:SqlSession 内部通过执行器操作数据库
MappedStatement: 底层封装对象 。作用:对操作数据库存储封装,包括 sql 语句、输入输出参数
StatementHandler :具体操作数据库相关的 handler 接口
ResultSetHandler :具体操作数据库返回结果的 handler 接口
Debug代码执行顺序:
入口代码:
String resource = "mybatis-config.xml";
//获取源配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取session
SqlSession sqlSession = sqlSessionFactory.openSession();
//操作数据库
User user = sqlSession.selectOne("com.jiagouedu.mybatis.UserMapper.selectUser", 1);
1. 解析xml文件变成Configuration 返回SqlSessionFactory
org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream)
>org.apache.ibatis.builder.xml.XMLConfigBuilder 构造函数
>org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
>org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration mybatis-config.xml内容
>org.apache.ibatis.parsing.XPathParser.evaluate
>org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement
>org.apache.ibatis.session.SqlSessionFactoryBuilder.build(org.apache.ibatis.session.Configuration)
>org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.DefaultSqlSessionFactory
2. 执行器进行初始化 SimpleExecutor拿到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.操作数据库
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)
>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.executor.CachingExecutor.createCacheKey 缓存的key
>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.queryFromDatabase
>org.apache.ibatis.executor.BaseExecutor.doQuery
>org.apache.ibatis.executor.statement.PreparedStatementHandler.query
>org.apache.ibatis.executor.resultset.ResultSetHandler.handleResultSets
>org.apache.ibatis.executor.resultset.DefaultResultSetHandler
以下是代码执行流程图:
seesion的获取:
Mapper对象的获取:
执行器Executor:
BaseExecutor用到的是规范的理念,使实现这个接口的类都按照这个规范去做对应的事情.
Mybatis中用到的设计模式:
1.sqlSessionFactory 工厂
2. build 建造者
3. getInstance ,Cache 单例
4. 委派 装饰
5.InterceptorChain 责任链
6 Proxy 代理
7. Execute Command 命令
8.doQuery 模板