mybatis源码解析 - 通过一个简单查询例子分析流程
2017-10-10 12:59
941 查看
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()的流程图相关文章推荐
- mybatis源码解析 - 通过一个简单查询例子分析流程
- 收了100元辛苦费,写了一个最简单的C#ASP.NET的3层架构例子代码,源码是通过代码生成器生成的【写程序的效率神奇的高】
- Mybatis源码解析之查询流程
- Mybatis实现【4】-查询解析(一次SQL查询的源码分析)
- 通过源码分析MyBatis的缓存/Mybatis解析动态sql原理分析
- struts2源码流程分析(一个低级错误的跟踪之旅)
- 一个简单的python代理服务器源码分析
- 通过对一个病毒源码的分析,了解VBS脚本语言的应用
- jct 模板通过json 从java 之间得到值的一个简单例子
- 递归思想分析----以一个简单的例子为例
- 写一个简单的C#反射的例子(附有源码)
- 一个简单XQuery查询的例子
- 通过一个对数据的存储和分析的简单实例初识Hadoop
- linux两个程序通过共享内存通信的一个简单例子
- 一个简单XQuery查询的例子
- 一个简单的演示SQL2005的查询通知的例子
- Ext源码分析源码分析之Ext的继承模式解说——第二节、一个简单的继承
- 一个简单实现多条件查询的例子
- 一个显示地图数据,并实现简单浏览查询程序源码(SDK编写)
- VC编译下对一个超简单的缓冲区溢出程序的原理解析以及c程序的汇编分析