MyBatis 执行流程分析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MyBatis 执行流程分析

1. MyBatis 执行流程概述


上篇文章讲到 MyBatis入门 MyBatis 的基本入门案例我们实现了通过 MyBatis 去获取数据库的数据,那么他的基本流程如下:

微信截图_20231016213054.png

第一步:是从配置文件中根据配置的信息构建 SqlSessionFactory 对象,由于配置文件中关联了映射文件 UserMapper.xml ,所以在 SqlSessionFactory 中也存在映射文件的内容


第二步:是从 SqlSessionFactory 中获取 SqlSession 会话对象,其实 SqlSession 会话对象底层封装的就是 conn 连接对象


第三步:是通过 SqlSession 会话对象调用查询方法 selectList 然后根据参数找到映射文件中的 sql 语句并将数据封装到 pojo 的User对象中


名词解释:


SqlSessionFactory : SqlSessionFactory 是 MyBatis 框架中的一个重要接口,用于创建SqlSession 对象,它是与数据库交互的主要入口点。


通过SqlSessionFactory,可以获取一个线程安全的SqlSession对象,用于执行数据库操作。SqlSessionFactory的创建是相对较重的操作,一般在应用程序的启动阶段进行创建,并在整个应用程序的生命周期内保持单例。它使用了一组配置信息,包括数据源、事务管理器、映射器(Mapper)等。


一般来说,创建SqlSessionFactory需要以下几个步骤:

- 加载MyBatis的配置文件,即包含了数据库连接信息、映射器配置等。
- 构建Configuration对象,作为SqlSessionFactory的配置信息。
- 使用SqlSessionFactoryBuilder根据配置信息创建SqlSessionFactory实例。

SqlSession: SqlSession是MyBatis框架中的一个核心接口,用于执行与数据库的交互操作。它提供了一系列的方法,包括查询、插入、更新、删除等,用于操作数据库并返回相应的结果。

SqlSession的一般使用流程如下:

- 通过SqlSessionFactory获取SqlSession对象。
- 使用SqlSession执行具体的数据库操作,如查询、插入、更新、删除等。
- 提交事务(如果使用了事务管理器)或手动调用SqlSession的commit()方法,将操作提交到数据库。
- 关闭SqlSession,释放相应的资源。 

SqlSession提供了一系列的方法,例如查询、新增、更新、删除等,用于与数据库进行交互。

每个线程应该拥有自己的SqlSession实例,并在使用完后及时关闭,以确保数据库连接的正确释放。一般推荐使用 try-with-resources 或 try-finally 等方式来确保 SqlSession 的正确关闭。



2. MyBatis 配置文件详解

在我们上个案例中的完整配置如下:

spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://192.168.0.108:3306/study_mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
# mybatis 配置
mybatis:
  # 配置实体类所在的包
  type-aliases-package: com.snow.po
  # 配置 xml 文件所在的包
  mapper-locations: classpath:com/snow/mapper/*.xml
  configuration:
    # 开启驼峰命名
    map-underscore-to-camel-case: true
logging:
  level:
    com.snow.mapper: debug

MyBatis 配置信息详解:

微信截图_20231016213219.png

username: 数据库用户名,这里设置为"root"。


password: 数据库密码,这里设置为"root"。


url: 数据库连接地址,这里使用MySQL数据库,连接地址为"jdbc:mysql://192.168.0.108:3306/study_mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8"。其中,192.168.0.108是数据库服务器的IP地址,3306是MySQL数据库的默认端口号,"study_mybatis"是要连接的数据库名称,后面的部分是一些可选的连接参数,例如设置时区和字符编码等。


driver-class-name: 数据库驱动类全限定名,这里使用的是MySQL的JDBC驱动类"com.mysql.cj.jdbc.Driver"。

type-aliases-package: 配置实体类所在的包。这里设置为"com.snow.po",表示MyBatis会扫描该包下的实体类,并将其注册为别名,方便在映射文件中使用类名代替全限定名。


mapper-locations: 配置XML映射文件所在的包或路径。这里设置为"classpath:com/snow/mapper/*.xml",表示MyBatis会在指定的包下按通配符的方式搜索映射文件,并加载到MyBatis中供使用。该配置可以指定一个或多个映射文件,多个映射文件之间使用逗号或分号分隔。


configuration: MyBatis的全局配置项。


map-underscore-to-camel-case: 配置是否开启驼峰命名规则。这里设置为"true",表示开启驼峰命名规则,即将下划线分隔的数据库字段名转换为驼峰命名的Java属性名。例如,数据库字段名为"first_name",则对应的Java属性名为"firstName"。默认情况下,MyBatis是关闭这个功能的,需要手动开启。



3. Mappers 映射器

mappers(映射器):UserMapper.xml====>UserMapper.java接口 关联.


mappers 是 MyBatis 配置文件中用于指定映射器(Mapper)接口的配置项。


Mapper接口是定义了与数据库交互的方法的接口,它与映射文件相对应,可以通过映射文件中定义的SQL语句来执行数据库操作。配置mappers使得MyBatis能够将Mapper接口与对应的映射文件进行关联。


以下是一个示例的mappers配置项的写法:

mappers:
  - package: com.snow.mapper
  - mapper: com.snow.mapper.UserMapper

可以有两种方式进行配置:


使用package配置项指定一个包名,表示将该包下的所有Mapper接口进行自动扫描,并将其与对应的映射文件进行关联。

使用mapper配置项指定一个具体的Mapper接口的全限定名,表示将该Mapper接口与对应的映射文件进行关联。

可以根据实际情况配置 mappers,使得 MyBatis 能够正确加载和使用您定义的Mapper接口。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
SQL XML Java
|
6月前
|
Java 数据库连接 mybatis
mybatis 框架分析——mybatis框架使用篇
mybatis 框架分析——mybatis框架使用篇
36 0
|
6月前
|
SQL Java 数据库连接
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
746 0
MyBatis【源码探究 01】mapper.xml文件内<if test>标签判断参数值不等于null和空(当参数值为0)时筛选条件失效原因分析
|
2月前
|
SQL XML Java
mybatis-源码深入分析(一)
mybatis-源码深入分析(一)
|
4月前
|
Java 数据库连接 mybatis
mybatis包扫描环境分析,最简单的环境准备
mybatis包扫描环境分析,最简单的环境准备
|
4月前
|
Java 数据库连接 Maven
Private method ‘getVideoList()‘ is never used,mybatis必须指定Mapper文件和实体目录,在参考其他人写的代码,要认真分析别人的代码,不要丢失
Private method ‘getVideoList()‘ is never used,mybatis必须指定Mapper文件和实体目录,在参考其他人写的代码,要认真分析别人的代码,不要丢失
|
6月前
|
Java 关系型数据库 数据库连接
MyBatis 执行流程分析
MyBatis 执行流程分析
54 2
|
6月前
|
SQL Java 数据库连接
Mybatis技术专题(3)MybatisPlus自带强大功能之多租户插件实现原理和实战分析
Mybatis技术专题(3)MybatisPlus自带强大功能之多租户插件实现原理和实战分析
386 1
|
6月前
|
Java 数据库连接 mybatis
结构性模式之---外观模式、MyBatis中Configuration的外观模式的使用分析
结构性模式之---外观模式、MyBatis中Configuration的外观模式的使用分析
|
6月前
|
SQL 设计模式 Java
干翻Mybatis源码系列之第十篇:Mybatis拦截器基本开发、基本使用和基本细节分析
干翻Mybatis源码系列之第十篇:Mybatis拦截器基本开发、基本使用和基本细节分析