Mybatis框架分析
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
Mybatis是支持定制化SQL、存储过程和高级映射的持久型框架,主要完成两件事:
1、封装JDBC的操作
2、利用反射完成Java类和SQL之间的转换
Mybatis的主要目的就是管理执行SQL参数的输入和输出,编写SQL和结果集的映射是mybatis的主要优点
提示:以下是本篇文章正文内容,下面案例可供参考
一、在IDEA中关联 Mybatis源代码
1.把下载的框架源码jar包解压,得到一个文件夹
2.在IDEA中打开任意一个Mybatis框架的类,比如 Configuration
3.关联解压的源码目录
4.在代码中敲一下空格,设置源代码为可编辑(以便于写注释)
二、Mybatis的编程步骤
首先来让我们看看Mybatis的调用代码
代码如下(示例):
//加载配置文件
InputStream inputStream = Resources.getResourceAsStream(mybatis-config.xml);
//初始化得到sqlSessionFacotry
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//得到SqlSession
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
//执行查询并返回结果
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
System.out.println(mapper.getAll());
}
这里可以看见过程为:
加载配置文件 > SqlSessionFactoryBuilder > SqlSessionFactory > Sqlsession > Executor > statementHandler > ResultSetHandler > 返回结果
框架初始化
解析核心配置,赋值给configuration对象
代码如下(示例):
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
//通过XMLConfigBuilder解析配置文件解析的配置相关信息都会封装为一个Configuration对象
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
//这里可以看见build中返回的XMLConfigBuilder.parse()
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
try {
//issue #117 read properties first
propertiesElement(root.evalNode("properties"));
Properties settings = settingsAsProperties(root.evalNode("settings"));
loadCustomVfs(settings);
loadCustomLogImpl(settings);
typeAliasesElement(root.evalNode("typeAliases"));
pluginElement(root.evalNode("plugins"));
objectFactoryElement(root.evalNode("objectFactory"));
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
reflectorFactoryElement(root.evalNode("reflectorFactory"));
settingsElement(settings);
// read it after objectFactory and objectWrapperFactory issue #631
environmentsElement(root.evalNode("environments"));
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
typeHandlerElement(root.evalNode("typeHandlers"));
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
扫描dao包,把mapper接口添加到注册表对象
映射数据类型
注册各种java->数据库的类型处理器
注册各种基本类型的别名
创建SqlSession
创建Executor执行器,是Mybatis内的核心对象,负责执行SQL语句(总负责人)
Mybatis默认用的是Simple执行器这个实现类
调用Mapper接口的【抽象方法】完成SQL语句
有个HashMap封装了扫描到的Mapper接口(key)
获取XML中SQL语句节点名称、id、、parameterType、resultType或resultMap、
设置SQL参数
总结
1、加载核心配置文件到Configuration
2、构建SqlSessionFactory
3、打开SqlSession会话
4、Executor开始处理请求
5、SqlSource解析SQL语句
6、StatementHandler执行SQL语句
7、ParameterHandler设置参数
8、StatementHandler执行SQL语句
9、ResultSetHandler处理结果集