文档章节

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

细肉云吞
 细肉云吞
发布于 2017/10/08 17:08
字数 723
阅读 1322
收藏 73
点赞 1
评论 1

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()的流程图

 

© 著作权归作者所有

共有 人打赏支持
细肉云吞
粉丝 104
博文 155
码字总数 122440
作品 0
其它
高级程序员
加载中

评论(1)

ixiaohei
ixiaohei
这博客不错
Mybatis3.4.x技术内幕(十六):Mybatis之sqlFragment(可复用的sql片段)

Mybatis目前最新版本为3.4.0,因此,我也将我的项目由3.3.1替换为3.4.0。在上一篇博文中,详细分析了Mybatis在使用foreach循环进行批量insert,返回主键id列表时,如果使用BatchExecutor,那...

祖大俊
2016/06/05
998
0
Mybatis源码概览(二) ---Plugin扩展与Spring结合原理

本文主要介绍Mybatis通过动态代理避免对sqlSession直接调用,而是通过MapperProxy代理技术生成了具体dao接口的Mapper实例,里面封装了对sqlSession的调用;Mybatis预留了Interceptor接口,用...

robin-yao
2016/03/23
530
0
还有这种操作?浅析为什么要看源码

前言 很多人都有一个疑惑,为什么面试都喜欢问原理,问源码.但是实际工作根本用不上,也就是大家常说的,面试造火箭,进去拧螺丝.我身边也有不少朋友问过我,我给他们的回答是.如果不看源码,不懂原...

肥朝
04/22
0
0
Mybatis一级缓存、二级缓存

以下内容来自美团技术博客:聊聊MyBatis缓存机制 前言 MyBatis是常见的Java数据库访问层框架。在日常工作中,开发人员多数情况下是使用MyBatis的默认缓存配置,但是MyBatis缓存机制有一些不足...

为了美好的明天
05/23
0
0
mybatis(三)配置详解之properties与environments

上一篇我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根节点下面,可配置properties、typeAliases、plugins、objectFactory、objectWrapperFactory、setti...

LCZ777
2014/12/18
0
0
聊聊 MyBatis 缓存机制

前言 MyBatis是常见的Java数据库访问层框架。在日常工作中,开发人员多数情况下是使用MyBatis的默认缓存配置,但是MyBatis缓存机制有一些不足之处,在使用中容易引起脏数据,形成一些潜在的隐...

鉴客
05/14
0
0
Mybatis底层原理学习(三):查询结果集的处理原理

【福利】关注微信公众号:深夜程猿,回复关键字即可获取学习视频、简历模版 Mybatis支持多结果集,也就是结果集中的元素也可以是结果集,返回结果集的时候会调用相应的结果集处理器来处理结果...

深夜程猿
03/06
0
0
【深入浅出MyBatis系列四】强大的动态SQL

深入浅出MyBatis系列 【深入浅出MyBatis系列一】MyBatis入门 【深入浅出MyBatis系列二】配置简介(MyBatis源码篇) 【深入浅出MyBatis系列三】Mapper映射文件配置 【深入浅出MyBatis系列四】...

陶邦仁
2015/12/22
1K
0
MyBatis拦截器原理探究

MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能。那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允许你在已映射语句执...

jiejie2050
2016/07/25
65
0
《Activiti实战》摘抄&笔记3

Query API简介 Activiti的查询API: 1)标准查询 :在以Java对象的方式通过创建一个指定类型的Query对象(实现Query接口)后用链式编程的方式设置查询参数。弊端:不能支持复杂的查询,比如多张...

v1-alpha
2016/07/05
153
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

设计模式

1.装饰器模式 概念   装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。 实现 ...

EasyProgramming
8分钟前
0
0
用python2和opencv进行人脸识别

一、安装cv2 sudo apt-get install python-opencv opencv-data 二、 Haar特征分类器 Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。 ...

wangxuwei
8分钟前
0
0
python模板中循环字典

{% for k,v in user.items %} {{ k}} {{ v}} {% endfor %}

南桥北木
36分钟前
0
0
Java8系列之重新认识HashMap

简介 Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示: 下面针对各个实现类...

HOT_POT
40分钟前
0
0
获取调用方的className

/** * 获取调用方的class * @return */private static String getInvoke() { StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); S......

iborder
57分钟前
0
0
深入了解一下Redis的内存模型!

一前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符...

Java填坑之路
今天
1
0
从实践出发:微服务布道师告诉你Spring Cloud与Spring Boot他如何选择

背景 随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加。在这个背景下,平台的技术架构也完成了从传统的单体应用到微...

老道士
今天
0
0
大数据学习的各个阶段

第一阶段:Linux课程讲解Linux基础操作,讲的是在命令行下进行文件系统的操作,这是Hadoop学习的基础,后面的所有视频都是基于linux操作的。鉴于很多学员没有linux基础,特增加该内容,保证零linux...

董黎明
今天
0
0
CVE-2013-0077 堆溢出分析

找了很久才发现这个环境比较容易搭建分析... 环境: 系统---Win XP SP3 漏洞程序:QQPlayer 3.7.892.400 出错DLL:quartz.dll 6.5.2600.5512 调试工具:x32db+gflag.exe 过程: 首先gflag设置...

Explorer0
今天
7
0
CISCO VPN Client Reason 442 WIN8/10错误解决方案

http://jdkleo.iteye.com/blog/2163493 引用 http://my.oschina.net/cloudcoder/blog/220391?p={{currentPage 1}} 在使用cisco VPN 客户端登录时,产生Reason 442:Failedto enable Virtual......

chenfj_fer
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部