MyBatis 源码学习3——Mybatis核心组件(上)

一、MyBatis框架操作数据库:

1.编写MyBatis的主配置文件

2.新增Java实体与数据库表建立映射:
MyBatis属于半自动化的ORM框架,可以将数据库中的数据转换为Java实体,因此需要一个Java实体类与数据库中的表相对应,可以使用Lombok工具,通过注解为Java类的属性自动生成Setter/Getter方法,消除冗余代码。

3.定义用于执行SQL的Mapper:
MyBatis的Mapper配置包括两部分,一是Mapper接口,二是通过XML或者Java注解方式配置的SQL语句

4.通过MyBatis提供的API执行定义的Mapper
在这里插入图片描述

	以主配置文件的输入流作为参数调用SqlSessionFactoryBuilder对象的bulid()方法,返回一个SqlSessionFactory对象
	调用SqlSessionFactory对象的openSession()方法获取一个与数据库建立连接的SqlSession实例
	调用SqlSession的getMapper()方法创建一个动态代理对象
	调用代理对象的方法完成与数据库的交互。

MyBatis中还提供了一个SqlSessionManager类(单例:通过静态方法newInstance获取实例),实现了SqlSessionFactory和SqlSession接口,既可以获取SqlSession实例,又可以替代SqlSession完成与数据库的交互。

二、 MyBatis核心组件

 MyBatis核心组件

Configuration
描述MyBatis的主配置信息,MyBatis框架在启动时会加载主配置文件,将配置信息转换为Configuration对象。

MappedStatement
描述Mapper中的SQL配置信息,MyBatis框架启动时,XML文件或者注解配置的SQL信息会被转换为MappedStatement对象注册到Configuration组件中。

SqlSession
面向用户的API,是MyBatis与数据库交互的接口,是Executor组件的外观。

Executor
SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。

StatementHandler
封装了对JDBC Statement对象的操作,比如为Statement对象设置参数,调用Statement接口提供的方法与数据库交互,等等。

ParameterHandler
用于处理SQL中的参数占位符,为参数占位符设置值。

ResultSetHandler
封装了对ResultSet对象的处理逻辑,将结果集转换为Java实体对象。

TypeHandler
类型处理器,用于处理Java类型与JDBC类型之间的转换。

MyBatis使用上述组件操作数据库的过程:
1.使用SqlSession组件,它是用户层面的API。

2.调用Executor,它是SQL执行器。

3.Executor会使用StatementHandler组件对JDBC的Statement对象进行操作。当Statement类型为CallableStatement和PreparedStatement时,
会通过ParameterHandler组件为参数占位符赋值。ParameterHandler组件中会根据Java类型找到对应的TypeHandler对象,TypeHandler中会通过Statement对象提供的setXXX()方法为Statement对象中的参数占位符设置值。

4.当SQL语句类型为SELECT时,MyBatis通过ResultSetHandler组件从Statement对象中获取ResultSet对象,然后将ResultSet对象转换为Java对象。

三、Configuration详解

Configuration
描述MyBatis主配置文件的信息,在MyBatis框架启动时注册到Configuration组件中。

MyBatis框架的配置信息有两种
1.配置MyBatis框架属性的主配置文件

2.配置执行SQL语句的Mapper配置文件(可以直接在Mapper接囗中,通过注解配置,不一定要有Mapper配置文件)。

Configuration类内容主要有三类

1.定义一系列的属性用来控制MyBatis运行时的行为,属性的值在MyBatis主配置文件中通过标签指定。

2.作为容器存放TypeHandler(类型处理器)、TypeAlias(类型别名)、Mapper接口及Mapper SQL配置信息。

3.作为Executor、StatementHandler、ResultSetHandler、ParameterHandler组件的工厂类,创建这些组件的实例,方便实现插件拦截逻辑。

常见属性
mapperRegistry
注册Mapper接口信息,建立Mapper接口的Class对象和MapperProxyFactory对象之间的关系。

interceptorChain
注册MyBatis插件信息,MyBatis插件实际上是一个拦截器。

typeHandlerRegistry
注册所有的TypeHandler,并建立Jdbc类型、java类型与TypeHandler之间的对应关系。

languageRegistry
注册LanguageDriver,LanguageDriver用于解析SQL配置,将配置信息转换为SqlSource对象。

mappedStatements
MappedStatement对象描述<insert|select|update|delete>等标签或者通过@Select、@Delete、@Update、@Insert等注解配置的SQL信息。
MyBatis将所有的MappedStatement对象注册到该属性中,其中Key为Mapper的Id,Value为MappedStatement对象。

caches:
注册Mapper中配置的所有缓存信息,其中Key为Cache的Id,也就是Mapper的命名空间,Value为Cache对象。

resultMaps:
注册Mapper配置文件中通过<resultMap>标签配置的ResultMap信息,ResultMap用于建立Java实体属性与数据库字段之间的映射关系,
其中Key为ResultMap的Id,该Id是由Mapper命名空间和<resultMap>标签的id属性组成的,Value为解析<resultMap>标签后得到的ResultMap对象。

parameterMaps:
注册Mapper中通过<parameterMap>标签注册的参数映射信息。Key为ParameterMap的Id,由Mapper命名空间和<parameterMap>标签的id属性构成,Value为解析<parameterMap>标签后得到的ParameterMap对象。

keyGenerators:
用于注册KeyGenerator,KeyGenerator是MyBatis的主键生成器,MyBatis中提供了3种KeyGenerator,即Jdbc3KeyGenerator(数据库自增主键)、NoKeyGenerator(无自增主键)、SelectKeyGenerator(通过select语句查询
自增主键)。

loadedResources:
注册所有Mapper XML配置文件路径。

sqlFragments
注册Mapper中通过标签配置的SQL片段,Key为SQL片段的Id,Value为MyBatis封装的表示XML节点的XNode对象。

mapUnderscoreToCamelCase
是否开启自动驼峰命名规则的映射,例如数据库名stu_name到经典Java属性名stuName的映射。

四、Executor

Executor
定义了对数据库的增删改查方法。

接囗实现类
在这里插入图片描述

BaseExecutor
定义了方法的执行流程及通用的处理逻辑,具体的方法由子类来实现,典型的模板方法模式。

SimpleExecutor:基础的Executor,能够完成基本的增删改查操作。

ResueExecutor:对JDBC中的Statement对象做了缓存,当执行相同的SQL语句时,直接从缓存中取出Statement对象进行复用,避免了频繁创建和销毁Statement对象,从而提升系统性能,这是享元思想的应用。

BatchExecutor:会对调用同一个Mapper执行的update、insert和delete操作,调用Statement对象的批量操作功能。

CachingExecutor:MyBatis支持一级缓存和二级缓存,当MyBatis开启了二级缓存功能时,会使用CachingExecutor对SimpleExecutor、ResueExecutor、BatchExecutor进行装饰,为查询操作增加二级缓存功能,装饰器模式的应用。

接下来以一个案例介绍如何直接使用Executor组件与数据库交互,代码如下:

使用
1.调用Configuration对象的getMappedStatement()方法获取对应的MappedStatement对象,因为Executor与数据库交互需要Mapper配置信息,

2.获取MappedStatement对象后,根据SQL类型调用Executor对象的query()或者update()方法。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值