本帖最后由 大蓝鲸Java 于 2018-2-27 14:11 编辑
Mybatis开发流程在了解mybatis的运行原理前,我们先来一起回顾下mybatis的基本编写流程。 l SqlSessionFactoryBuilder:加载mybatis配置信息,生成SqlSessionFactory l SqlSessionFactory:创建SqlSession的工厂类 l SqlSession:与数据库交互,执行SQL,并返回结果 使用Mybatis的DAO的开发方式: 方式一、基于SqlSession的开发 1. 编写DAO接口 2. 编写DAO实现类,在实现类中直接调用SqlSession的API来访问数据库,执行SQL,返回结果 方式二、基于接口的开发 1. 编写DAO接口 2. 通过SqlSession来获取DAO接口的代理实现类。不需要自己编写实现类
构建SqlSessionFactory的过程SqlSessionFactory是Mybatis的核心类之一,其最重要的功能就是用于创建Mybatis的核心接口SqlSession。Mybatis采用构造模式去创建SqlSessionFactory,我们可以通过SqlSessionFactoryBuilder去构建。构建主要包括两步: 第一步,通过org.apache.ibatis.builder.xml.XMLConfigBuilder解析配置的XML文件,读取配置参数,并将读取的参数存入到org.apache.ibatis.session.Configuration类中。注意Mybatis几乎所有的配置都存在这里。 第二步,使用Configeration对象去创建SqlSessionFactory。Mybatis中的SqlSessionFactory是一个接口,而不是实现类,为此Mybatis提供了一个默认的SqlSessionFactory的实现类,我们一般情况下都实现它org.apache.ibatis.session.defaults.DefaultSqlSessionFactory。
构建Configuration在SqlSessionFactory的构建过程中,Configuration是最重要的,它的作用如下。 l 读入配置文件,包括mybatis的核心配置文件和映射器的XML配置文件。 l 初始化基础配置,比如Mybatis的别名等,一些重要的类对象,例如,插件、映射器、ObjectFactory和typeHandler对象。 l 提供单例,为后续创建SqlSessionFactory服务并提供配置的参数。 l 执行一些重要的对象方法,初始化配置信息。 显然Mybatis不会是一个简单的类,Mybatis的所有配置信息都来源于此,也就是说Mybatis核心配置文件和映射器配置文件的信息都会被读入这里并保存为一个单例。Configuration是通过XMLConfigBuilder去构建。首先Mybatis会读取所有XML配置信息。然后,将这些信息保存到Configuration对象中。它主要做如下初始化: l properties全局参数。 l settings设置。 l typeAlias别名。 l ObjectFactory对象。 l Plugin插件。 l Environment环境。 l DatabaseIdProvider数据库标识。 l Mapper映射器。
Mapper映射器的内部组成Mapper映射器加载的是我们编写的Mybatis映射文件的内容,也就是我们编写SQL语句的XML文件。它包含了我们所有编写的SQL语句的信息。一般而言,一个映射器由3个部分组成: l MappedStatement,它保存我们一个映射器的节点(update|insert|delete|select)。包括许多我们配置的SQL、SQL的id、缓存信息、resultMap、resultType、parameterType等重要的配置信息。 l SqlSource,它是提供BoundSql的地方,它是MappedStatement的一个属性。 l BoundSql,它是建立SQL和参数的地方。它有三个属性SQL、parameterObject、paramterMappings。
Mapper映射器的内部组成 MappedStatement对象涉及的东西很多,我们一般不去修改它,因为容易产生意外的错误。SqlSource是一个接口,它的主要作用是根据参数和其他规则组装SQL(包括Mybatis提供的动态SQL语句),这些都是比较复杂的东西,好在Mybatis已经为我们提供了它们的实现,一般我们不去修改它。对于参数和SQL而言,主要的规则反应在BoundSql类对象上,在编写Mybatis插件时,我们往往需要拿到BoundSql对象,通过它获取当前运行的SQL语句和参数以及参数规则,进而修改他们,达到我们特殊的需求。 BoundSql会提供三个重要的属性:parameterMappings、parameterObject和sql。 parameterObject为参数本身。我们的参数可以是简单对象、POJO、Map或者@Param注解的参数。 Ø 传递简单对象(包括int、String、float、double等),比如我们传递的int类型时,Mybatis会把参数转变为Integer类型。类似的float、double也是如此。 Ø 如果我们传递的是POJO或Map对象的参数,那么这个parameterObject就是你传入的POJO或Map对象。 Ø 当然我们可以传递多个参数,此时Mybatis就会把parameterObject转变为一个Map<String,Object>对象,如果参数没有@Param注解,其键值的关系是按照参数的顺序规划的,类似这样的形式:{"1":p1,"2":p2,"3":p3,......,"param1":p1,"param2":p2,"param3":p3,......},所以我们在编写Mybatis的SQL映射文件的时候,可以使用#{param1}或#{1}去引用相关参数。如果我们使用@Param注解,其键值的关系置换为@Param注解的键值。比如我们的方法传参注解@Param("key1") String p1, @Param("key2") Stringp2, @Param("key3") String p3,此时的parameterObject的键值关系如下:{"key1":p1,"key2":p2,"key3":p3,......,"param1":p1,"param2":p2,"param3":p3,......}。
构建SqlSessionFactory有了Configuration对象,构建SqlSessionFactory就很简单了,我们只需要写很简单的代码 [Java] 纯文本查看 复制代码 SqlSessionFactory sessionFactory = newSqlSessionFactoryBuilder().build(inputStream); Mybatis会根据Configuration对象加载的配置信息来创建SqlSessionFactory对象。
SqlSession运行过程SqlSession是一个接口,它提供了对数据库的增删改查方法,我们构建SqlsessionFactory就可以轻易的拿到SqlSession对象。那么SqlSession的增删改查方法是如何执行的呢。SqlSession是通过Executor、StatementHandler、ParameterHandler和ResultHandler来完成数据库的操作和结果返回的。 l Executor执行器,由它来调度StatementHandler、ParameterHandler和ResultHandler等来执行对应的SQL。 l StatementHandler的作用是使用数据库的Statement(PreparaStatement)执行操作,它是四大对象的核心,起到承上启下的作用。 l ParameterHandler用于SQL对参数的处理。 l ResultSetHandler用于对最后查询结果集(ResultSet)的封装返回的。
Executor执行器执行器起到了至关重要的作用。它是一个真正执行Java和数据库交互的东西。在Mybatis中存在三种执行器。我们可以在Mybatis核心配置文件的<setting>属性中配置。 l SIMPLE,简易执行器,默认执行器。 l REUSE,是一种执行器重用预编译语句。 l BATCH,执行器重用语句和批量更新,它是针对批量专用的执行器
StatementHandler数据库会话器顾名思义,数据库会话器就是专门处理数据库会话的。StatementHandler只是一个接口,同样Mybatis给我们提供了它的实现。有三种数据库会话器。 Ø SimpleStatementHandler:就是直接使用普通的Statement对象,这样每次执行SQL语句都需要数据库对SQL进行预编译 Ø PrepareStatementHandler:使用PrepareStatement执行,虽然初次创建PrepareStatement时开销比较大,但在多次处理SQL时只需要初始化一次,可以有效提高性能 Ø CallableStatementHandler:使用CallableStatement执行,CallableStatement是用来执行存储过程的。 选择不同StatementHandler的配置如下:通过根据不同的操作配置不同的StatementHandler来进行处理
[Java] 纯文本查看 复制代码 <insert id="save" statementType="STATEMENT"><!-- STATEMENT,PREPARED 或CALLABLE -->
ParameterHandler参数处理器Mybatis是通过参数处理器对预编译语句进行参数设置的。它的作用很明显,就是完成对预编译参数的设置。Mybatis为ParameterHandler接口提供了一个默认的实现类DefaultParameterHandler。
ResultSetHandler结果处理器Mybatis通过结果处理器类封装我们的查询结构并返回的。Mybatis同样为ResultSetHandler提供了一个默认的实现类DefaultResultSetHandler
|