Mybatis源码分析(一)Mybatis的架构设计简介

栏目: Java · 发布时间: 5年前

内容简介:撸完Spring框架,我们接着下一个征程,Mybatis。相对Spring而言,Mybatis就显得短小精悍。在本系列源码开始之前,我们先来一起了解下Mybatis的相关知识点。MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)

撸完Spring框架,我们接着下一个征程,Mybatis。相对Spring而言,Mybatis就显得短小精悍。在本系列源码开始之前,我们先来一起了解下Mybatis的相关知识点。

二、什么是 MyBatis ?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL 、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

三、架构

Mybatis源码分析(一)Mybatis的架构设计简介

1、接口层

接口层主要定义的是与数据库进行交互的方式。在Mybatis中,交互分为两种方式。

  • Mybatis提供的API

使用Mybatis提供的API进行操作,通过获取SqlSession对象,然后根据Statement Id 和参数来操作数据库。

String statement = "com.viewscenes.netsupervisor.dao.UserMapper.getUserList";
List<User> result = sqlsession.selectList(statement);
复制代码
  • 使用Mapper接口

事实上这个才是经常使用的方式,面向接口编程嘛。每一个Mapper接口中的方法对应着mapper.xml文件中的一个 select/insert/update/delete 节点。节点中的ID就是接口中的方法名,在使用的时候直接调用接口方法即可。不过,值得注意的是,它最终执行的还是 sqlSession.select()、sqlSession.delete()

2、数据处理层

这是Mybatis的核心。它负责参数映射和动态SQL生成,生成之后Mybatis执行SQL语句,并将返回的结果映射成自定义的类型。关于参数映射和结果集转换,主要是靠typeHandlers。为便于理解,我们大概来看几个类型处理器。

类型处理器 Java类型 JDBC类型
StringTypeHandler java.lang.String CHAR, VARCHAR
DateTypeHandler java.util.Date TIMESTAMP
BooleanTypeHandler java.lang.Boolean, boolean 数据库兼容的 BOOLEAN
IntegerTypeHandler java.lang.Integer, int 数据库兼容的 NUMERIC 或 INTEGER

3、框架支撑层

  • 事务管理

对于ORM框架而言,事务管理是必不可少的一部分。不过,一般情况下,Mybatis都是和Spring搭配使用的,更多的是用Spring来接管事务管理。

  • 连接池

我们不能每次在执行SQL的时候才去创建数据库的连接。因为创建连接是一个相对比较耗时的操作,通常做法是用一个列表保存提前创建好的N个连接,用到的时候去拿,用完再还回去。关于数据库连接池,业界有很多开源实现。比如 C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid 等。

  • 缓存

为了提高数据利用率和减小服务器和数据库的压力,Mybatis 会对于一些查询提供会话级别的数据缓存,会将对某一次查询,放置到SqlSession 中,在允许的时间间隔内,对于完全相同的查询,MyBatis 会直接将缓存结果返回给用户,而不用再到数据库中查找。

一级缓存是SqlSession级别的缓存,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率,Mybtais默认开启一级缓存。

二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。要开启二级缓存,需要在你的 SQL 映射文件中添加一行:。它会将所有的select语句缓存,在执行insert,update 和 delete 语句时会刷新缓存,缓存根据LRU算法来回收。

4、SQL配置方式

大部分时候我们都是通过XML方式来配置SQL,不过Mybatis也支持通过注解来配置,就像下面这样。

@Select({"<script>", "select * from user"
		"</script>"})
List<ConsultContent> getUserList();
复制代码

不过,不推荐这种方式来搞,除非你想挖坑....想想吧,一个复杂的SQL,几十行上百行,写时一时爽,维护满面泪。

5、引导层

引导层是配置和启动MyBatis 配置信息的方式。MyBatis 提供两种方式来引导MyBatis :基于XML配置文件的方式和基于Java API 的方式。

四、主要构件

  • 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对象之中。

五、版本

本系列采用的数据库为MySQL,Mybatis版本为3.4.6。以下是pom文件坐标。

<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
		
<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis-spring</artifactId>
	<version>1.3.2</version>
</dependency>

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>6.0.6</version>
</dependency>

<dependency>
	<groupId>com.mchange</groupId>
	<artifactId>c3p0</artifactId>
	<version>0.9.5.2</version>
</dependency>
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Programming Collective Intelligence

Programming Collective Intelligence

Toby Segaran / O'Reilly Media / 2007-8-26 / USD 39.99

Want to tap the power behind search rankings, product recommendations, social bookmarking, and online matchmaking? This fascinating book demonstrates how you can build Web 2.0 applications to mine the......一起来看看 《Programming Collective Intelligence》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码