1.首先我们先了解一下Mybatis是什么:
MyBatis 是一个开源、轻量级的数据持久化框架,是 JDBC 和 Hibernate 的替代方案。MyBatis 内部封装了 JDBC,简化了加载驱动、创建连接、创建 statement 等繁杂的过程,开发者只需要关注 SQL 语句本身。
2.工作原理和示例代码:(如图所示)
这里是一个查询总行数的 Test类:
总体步骤为:
1、加载核心配置文件到Configuration
2、构建SqlSessionFactory
3、打开SqlSession会话
4、Executor开始处理请求
5、SqlSource解析SQL语句
6、StatementHandler执行SQL语句
7、ParameterHandler设置参数
8、StatementHandler执行SQL语句
9、ResultSetHandler处理结果集
3.Configuration:
Configuration类,是框架的核心配置类,保存了包括映射器、别名、映射方法等信息(保存着Mybatis的重要信息)
4.build()原理:
build()实际上是一个初始化的工作:
当我们点进build()看时会看到build()会调用自己的方法,
点开这个方法,就可以看到她真正的面目:
使用debug可以查看他的返回值:
这样子不难看出:XMLConfigBuilder用来解析Mybatis核心配置的解析器,parse()方 法返回Configuration。
如何得到Configuration的呢?我们继续往下看:
4.1 parse():
发现parse()方法使用XPath语法找到Configuration配置的根节点:
得到Configuration根节点之后,解析核心配置:
5. mapperE lement:
XML MapperBuilder用来解析Mybatis的映射文件( Mapper)
Configuration.typeHandlerRegistry属性 TypeHandlerRegistry.<init>()注册各种java->数据库的类型处理器Configuration.typeAliasRegistry属性 TypeAliasRegistry.<init>()注册各种基本类型的别名 Configuration.typeHandlerRegistry属性 TypeHandlerRegistry.<init>()注册各种java->数据库的类型处理器Configuration.typeAliasRegistry属性 TypeAliasRgistry.<init>()注册各种基本类型的别名
6.创建SqlSession:
sqlSessionFactory.openSession();打开会话连接
DefaultSqlSessionFactory.openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)创建Executor执行器,是Mybatis内的核心对象,负责执行SQL语句(总负责人)
Mybatis默认用的是Simple执行器这个实现类
sqlSession.getMapper(UserMapper.class);
获取Mapper接口代理类实例
使用JDK代理创建Mapper接口代理
InvocationHandler是MapperProxy,MapperProxy是各种XxxMapper的代理类
定位到Mapper中具体的增删改查方法,得到MappedStatement对象,Executor负 责执行
在开启二级缓存的情况下,执行查询会用CachingExecutor缓存执行,如果缓存中没有数据,委托给SimpleExecutor
mapperMethod.execute(sqlSession, args);
执行Sql语句查询,由于我的返回结果是一个 User对象,所以会走到
result = sqlSession.selectOne(command.getName(), param);这一行,查询一条记录
实际走到 DefaultSqlSession.selectOne()
7.未完待续......