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);//获取sqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//获取sessionSqlSession 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 模板