MyBatis-知识点详解

1、Mybatis 概述

1.1、MyBatis 的概念和特点

MyBatis 是一款优秀的持久层框架它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

MyBatis 的优点较多,也是大多数开发者使用的原因,具体如下:

  • 简单易学且小巧灵活:自身很小,不会对应用程序或者数据库的现有设计强加任何影响,与JDBC相比,减少了50%以上的代码量。

  • SQL 解耦且功能丰富:通过提供DAL层,将业务逻辑和数据访问逻辑分离,即:SQL代码从程序代码中彻底分离出来,可重用,使系统的设计更清晰,更易维护,更易单元测试。同时提供 XML 标签支持编写动态 SQL,通过映射标签,支持对象和数据库的 ORM 字段关系映射。

MyBatis 的缺点主要是由于其编写的 SQL 工作量大的原因,具体如下:

  • 编写SQL语句时工作量很大,尤其是字段多、关联表多时,因此对开发者对于 SQL 的熟练度要高。

  • 数据库移植性差,比如 MySQL 移植到 Orecle,SQL 语句会有差异从而引起错误。

因此,MyBatis 专注于 SQL 本身,是实体类与 SQL 语句之间建立的映射关系(不是实体类与表),是一个足够灵活的持久层优化方案,适用于性能要求高,需求多变的项目。

1.2、MyBatis 架构

MyBatis 的架构大概是这样的,最上面是接口层,接口层就是开发人员在 Mapper 或者是 Dao 接口中的接口定义,是查询、新增、更新还是删除操作;中间层是数据处理层,主要是配置 Mapper -> XML 层级之间的参数映射,SQL 解析,SQL 执行,结果映射的过程。上述两种流程都由基础支持层来提供功能支撑,基础支持层包括连接管理,事务管理,配置加载,缓存处理。

功能架构

  • API接口层:通过提供给外部使用的接口 API 操作数据库,接收到调用请求就会调用数据处理层来完成具体的数据处理。

  • 数据处理层:根据请求完成数据库操作,包括 SQL 查找、SQL 解析、SQL 执行和执行结果映射处理等。

    • 加载配置:在 Mybatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及Mapper接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configration 对象中。之后,根据该对象创建 SqlSessionFactory 对象。待 Mybatis 初始化完成后,可以通过 SqlSessionFactory 创建 SqlSession 对象并开始数据库操作。

    • SQL解析:当 API 接口层接收到调用请求时,Mybatis 会根据 SQL 的 ID 和传入参数对象找到并解析对应的 MappedStatement,得到可执行 SQL。Mybatis 实现的动态 SQL 语句,几乎可以编写出所有满足需要的SQL。Mybatis 中scripting 模块会根据用户传入的参数,解析映射文件中定义的动态 SQL 节点,形成数据库能执行的 SQL 语句。

    • SQL执行:SQL语句的执行涉及多个组件,包括MyBatis的四大神器,它们是: Executor、StatementHandler、ParameterHandler、ResultSetHandler。将最终得到的 SQL 和参数拿到数据库进行执行,得到操作数据库的结果。

    • 结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成 HashMap、JavaBean 或者基本数据类型,并将最终结果返回。

  • 基础支撑层:提供数据处理层基础功能支持,包括连接管理、事务管理、配置加载和缓存处理等。

image

在不与Spring 集成的情况下,使用MyBatis执行数据库的操作主要如下:

InputStream is = Resources.getResourceAsStream("myBatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(is);
sqlSession = factory.openSession();
其中的SqlSessionFactory,SqlSession是MyBatis接口的核心类,尤其是SqlSession,这个接口是MyBatis中最重要的接口,这个接口能够让你执行命令,获取映射,管理事务。

image

MyBatis层级结构各个组件的介绍(这里只是简单介绍,具体介绍在后面):

SqlSession: MyBatis核心API,主要用来执行命令,获取映射,管理事务。接收开发人员提供Statement Id 和参数.并返回操作结果
Executor: 执行器,是MyBatis调度的核心,负责SQL语句的生成以及查询缓存的维护
StatementHandler: 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
ParameterHandler: 负责对用户传递的参数转换成JDBC Statement 所需要的参数
ResultSetHandler: 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
TypeHandler: 用于Java类型和jdbc类型之间的转换
MappedStatement: 动态SQL的封装
SqlSource: 表示从XML文件或注释读取的映射语句的内容,它创建将从用户接收的输入参数传递给数据库的SQL。
Configuration: MyBatis所有的配置信息都维持在Configuration对象之中

posted @ 2022-08-06 12:47  静守己心&笑淡浮华  阅读(213)  评论(0编辑  收藏  举报