MyBatis源码分析--02:SqlSession建立过程

2024-06-02 00:44

本文主要是介绍MyBatis源码分析--02:SqlSession建立过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们再来看看MyBatis使用流程:


InputStream inputStream = Resources.getResourceAsStream("myBatis_config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();User user = new User();
user.setUser_name("abd");
user.setUser_id(99);
user.setPassword("12345");UserDao userDao = session.getMapper(UserDao.class);

上一篇我们搞清楚了MyBatis通过动态代理创建Dao接口的实现类,关注点在后面一句代码,动态代理底层是调用SqlSession的方法实现数据库操作。那么SqlSession是怎么创建的呢?

接下来我们来解决这个问题。

将目光放在这几句代码上:

InputStream inputStream = Resources.getResourceAsStream("myBatis_config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();

第一句代码非常明显:通过IO方式打开输入流读取myBatis_config.xml和Mapper.xml文件。

那么读取到虚拟机之后是怎么处理xml文件的呢,还是通过标签和字符串的形式展现的吗?一定不是的。一切皆对象!MyBatis将这些标签形式的信息封装成对象进行保存。这个将xml文件映射成对象的过程叫做OXM(Obiect XML Mapping)。

第二行代码就是执行这个过程:具体来说SqlSessionFactoryBuilder().build(inputStream);有俩个作用:

  1. 读取xml文件:将myBatis的xml文件解析映射成Configuration对象;将Mapper.xml文件映射成MappedStatement对象同时放入Configuration对象。
  2. 创建SqlSesisonFactory。

接下来我们来研究这个过程:

SqlSessionFactoryBuilder().build()方法探究

XML文件封装成对象的过程

整个过程有专门的技术实现:XML解析。主要有三种方式:DOM,SAX,XPath。MyBatis通过XPath进行实现。具体来说封装了XNode和XPathParser来进行实现

import org.apache.ibatis.parsing.XNode;
import org.apache.ibatis.parsing.XPathParser;

接下来我们将使用这俩个类来将一个XML文件映射成一个对象:

自定义映射一个XML文件

要解析的XML文件:

<users><user><name>sy</name><password>123</password></user><user><name>curry</name><password>30</password></user>
</users>

要映射的对象的实体类:

package com.example.spring_suns.XPathParser;/*** @ClassName User* @Description 测试MyBatis XML解析的实体类* @Author 86153* @Date 2024/5/31 11:08* @Version 1.0**/
public class User {private String name;private String password;@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", password='" + password + '\'' +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

具体映射过程:

/*** @ClassName XMLParserTest* @Description OXM过程* @Author 86153* @Date 2024/5/31 11:04* @Version 1.0**/
public class XMLParserTest {@Testvoid xpathParsertest() throws IOException {InputStream inputStream = Resources.getResourceAsStream("users.xml");XPathParser xPathParser = new XPathParser(inputStream);//  /users是目标xml文件的根标签,/*表示根标签下的所有子标签List<XNode> xNodes = xPathParser.evalNodes("/users/*");List<User> users = new ArrayList<>();for(XNode xNode : xNodes) {List<XNode> children = xNode.getChildren();User user = new User();user.setName(children.get(0).getStringBody());user.setPassword(children.get(1).getStringBody());users.add(user);}for (User user : users) {System.out.println(user);}}
}

MyBatis将MyBatis的XML配置文件映射成Configuration对象的过程

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream)

SqlSessionFactory的build方法将XML配置文件解析封装成对象:

我们一步一步进行往下调试:

将Mapper.xml映射成MapperedStatement过程:

上面在读取标签MyBatis配置文件标签时读取了一个“mappers”标签,这是Mapper.xml文件的注册信息,由此读取Mapper.xml文件

创建SqlSessionFactory:

我们刚才关注的是build方法里的parse方法,现在来关注创建SqlSessionFactory的build方法

可以发现,最后通过Configuration对象创建了DefaultSqlSesisonFactory

SqlSession创建

接下来终于到我们最终的目的:创建SqlSession:

 SqlSession session = sqlSessionFactory.openSession();

注意上面创建SqlSession时有一个参数Executor,这个类是SqlSession执行数据库操作的实现类

由此和我们上一篇内容连起来了,MyBatis通过jdk动态代理创建Dao接口实现类,代理调用SqlSession的数据库操作,而SqlSession操作数据库的具体实现类就是Executor

总结:

本篇文章实际上就是围绕三行代码:

InputStream inputStream = Resources.getResourceAsStream("myBatis_config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();

第一行代码:通过IO方式打开输入流读取myBatis_config.xml和Mapper.xml文件。

第二行代码:

        1.OXM。将MyBatis的xml配置文件映射成Configuration对象,将Mapper.xml文件映射成MapperedStatement对象同时封装在Configuration对象中。

        2.通过Configuration对象创建SqlSessionFactory。

第三行代码:创建SqlSession。

这篇关于MyBatis源码分析--02:SqlSession建立过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1022565

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤

《SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤》本文主要介绍了SpringBoot+MyBatis-Flex配置ProxySQL的实现步骤,文中通过示例代码介绍的非常详... 目录 目标 步骤 1:确保 ProxySQL 和 mysql 主从同步已正确配置ProxySQL 的

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

PLsql Oracle 下载安装图文过程详解

《PLsqlOracle下载安装图文过程详解》PL/SQLDeveloper是一款用于开发Oracle数据库的集成开发环境,可以通过官网下载安装配置,并通过配置tnsnames.ora文件及环境变... 目录一、PL/SQL Developer 简介二、PL/SQL Developer 安装及配置详解1.下

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

springboot启动流程过程

《springboot启动流程过程》SpringBoot简化了Spring框架的使用,通过创建`SpringApplication`对象,判断应用类型并设置初始化器和监听器,在`run`方法中,读取配... 目录springboot启动流程springboot程序启动入口1.创建SpringApplicat