mybatis源码解析 - 通过一个简单查询例子分析流程


声明:本文转载自https://my.oschina.net/thinwonton/blog/1547538,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

1. 前言

mybatis的使用方式有两种,一种是通过statement id的方式访问sqlSession提供的接口,另一种方式是通过mapper接口访问。在本文中,为了简单粗暴地过一遍mybatis源码,直接使用了第一种方式使用mybatis。本文的配置如下所示。源码采用的mybatis版本是 3.3.x。

<configuration> 	<!-- 引入外部属性文件 --> 	<properties resource="jdbc.properties"></properties>  	<settings> 		<!-- 数据库表的字段名到java对象属性映射采用驼峰命名的方式,即表的字段user_name -> 对象的属性userName  --> 		<setting name="mapUnderscoreToCamelCase" value="true" /> 		<setting name="cacheEnabled" value="false"/> 	</settings>  	<!-- 配置数据库 --> 	<environments default="development"> 		<environment id="development"> 			<transactionManager type="JDBC" /> 			<dataSource type="POOLED"> 				<property name="driver" value="${db.driver}" /> 				<property name="url" value="${db.url}" /> 				<property name="username" value="${db.username}" /> 				<property name="password" value="${db.password}" /> 			</dataSource> 		</environment> 	</environments>  	<mappers> 		<mapper resource="mapper/UserMapper.xml" /> 	</mappers> </configuration>
<mapper namespace="userMapper">  	<select id="getUserById" resultMap="user">         select * from user where id = #{id}     </select>          <resultMap type="com.github.thinwonton.mybatis.sample.entity.User"         id="user">         <result column="user_name" property="userName" />     </resultMap> 	 </mapper>

测试代码:

		// 建立sqlSessionFactory 		String resource = "mybatis-config.xml"; // mybatis全局配置文件 		InputStream inputStream = Resources.getResourceAsStream(resource); 		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  		// 获取sqlSession 		SqlSession sqlSession = sqlSessionFactory.openSession();  		// 执行查询 		String statement = "userMapper.getUserById"; // statement的id 		Long parameter = 10L; // 参数 		User user = sqlSession.selectOne(statement, parameter);

2. 总体层次结构

我们先看一下mybatis的总体层次结构,大概了解一下mybatis中的一些重要的类,借用 http://blog.csdn.net/luanlouis/article/details/40422941 里的一张图

  • SqlSession            作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
  • Executor              MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
  • StatementHandler   封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
  • ParameterHandler   负责对用户传递的参数转换成JDBC Statement 所需要的参数,
  • ResultSetHandler    负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
  • TypeHandler          负责java数据类型和jdbc数据类型之间的映射和转换
  • MappedStatement   MappedStatement维护了一条<select|update|delete|insert>节点的封装, 
  • SqlSource            负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
  • BoundSql             表示动态生成的SQL语句以及相应的参数信息
  • Configuration        MyBatis所有的配置信息都维持在Configuration对象之中。

3. 详细流程

3.1 初始化

mybatis的初始化发生在 SqlSessionFactory 的构建阶段,它会解析配置文件,并把配置封装到 内部的Configuration 对象中。在configuration对象里,除了保存了全局配置文件mybatis-config.xml的配置,还保存了在statment映射文件中的配置,例如增删改查的statment,参数映射集合,结果映射集合等。

3.2 一个简单查询的流程

下图是一个简单流程selectOne()的流程图

 

本文发表于2017年10月08日 22:36
(c)注:本文转载自https://my.oschina.net/thinwonton/blog/1547538,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1689 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1