MyBatis框架中sql语句的执行过程

一:概述

        主要思路:dom4j解析配置文件生成一个全局配置对象,利用jdk动态代理创建出接口的代理类,通过代理类完成crud的操作,从而间接完成接口方法中的crud操作(代理通过以接口方法名为id就可以拿到对应的sql语句,所以dao接口的接口方法其中一个作用就是代理类用来寻找对应的sql语句的)

二:MyBatis使用的标准步骤

        

//通过流的方式加载mybatis配置文件
InputStream in = Resource.getResourseAsStream("classpath:mybatis.xml")

//创建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in)

//创建sqlSession
SqlSession session = sqlSessionFactory.openSession()

//创建代理类
xxxDao dao = session.getMapper(xxxDao.class)

//执行语句
dao.selectXXX()

三:使用原始jdbc的标准步骤

//加载驱动
Class.forName("com.mysql.jdbc.Driver")

//建立连接
Connection connection = DriverManager.getConnection(url,userName,password);

//定义sql语句
String sql = "";

//创建语句对象
Statement statement = connection.PreparedStatement(sql);

//参数设置
statement.setXXX(index,vlaue)

//执行sql语句
ResultSet resultSet = statement.executeQuery()

//解析结果数据集
while(resultSet.hasNext()){
...
...
}
//关闭连接
statement.close();
connection.close();

四:MyBatis的底层就是JDBC

众所周知,MyBatis的底层就是jdbc,正所谓哪有什么幸福和平,只是有人在负重前行。MyBatis是如何帮我们完成底层的jdbc的操作的呢?在这里先简单概括一下

        

JDBCMyBatis
加载驱动直接加载到JVM,与JDBC加载一样
创建连接执行器创建
创建语句对象配置文件中的语句会被封装成语句对象
参数设置参数处理器执行
执行执行器执行
处理返回集返回值处理器处理

顺便提一下:MyBatis拥有四大对象,分别是执行器executor,语句控制器statementHandler,参数控制器parameterHandler以及返回值处理器resultSetHandler,该框架正是利用这四大对象来完成sql语句的执行与返回。

五:mybatis启动并执行一条语句的详细过程

1.解析MybatisConfig.xml,并封装成一个全局的Configuration对象,通过该对象来保存配置文件中的值

(1)实现逻辑:通过工具类Resource获取配置文件的输入流,然后利用SqlSessionFactoryBuilder解析xml文件生成的Configuration对象并以此为参数创建出SqlSessionFactory

(2)代码示例:

        ①  利用SqlSessionFactoryBuilder的build方法解析全局配置文件 

               

        ②  利用build()里的parse方法进行解析

       

        ③利用parse里的parseConfiguration解析成configuration对象   

         ④解析每一个标签结点(以mapper为例)

               

        ⑤  进入到this.mapperElement()方法,最后其实就是解析完该单个标签的值后给this.configuration赋值,最终返回该configuration(这里也完成了接口方法与mapper文件中的sql语句的绑定(MappedStatement对象))


             

 

2.SqlSessionFactory创建出SqlSession(默认是defaultSqlSession)

        

3.SqlSession创建出对应接口的代理类(接口式编程)

        (1)实现逻辑:Mybatis启动时会创建出以接口类型为key,MapperProcyFactory为Value的knownMappers,通过knownMappers就可以找到接口的MapperProxyFactory,进而创建出代理类的实例对象,而MapperProxyFactory的实例对象MapperProxy则是InvocationHandler接口实现类并实现了invoke方法(实际就是用反射创建了代理类)

        (2)代码示例

                ①通过sqlSession的getMapper()创建出对应的代理类

        

                ② 实际调用的是Configuration的getMapper方法,从mapper注册中心拿到对应的mapperProxyFactory,进而创建出MapperPeoxy实例

                

                ③:创建出MapperProxy实例

        

4.调用dao层方法:MapperProxy的invoke方法中会执行已经被映射的sql方法

        (1)实现逻辑:找到被绑定的sql语句,然后参数转换,参数设置等,然后利用执行器创建连接,创建语句对象,然后执行sql语句

        (2)代码示例

                ①:MapperProxy的invoke方法

        

                ②:最终是调用内部类PlainMethodInvoker的invoke方法,进而调用mapperMethod的execute方法

        

        ③:execute方法,就是利用判断语句类型,通过sqlSession去执行底层的数据库CRUD操作,并通过返回值处理器等进行返回值处理

5.最后利用返回值处理器处理ResultSetHandler把查询结果处理,最后层层返回

原文地址:https://blog.csdn.net/m0_57713282/article/details/121809674

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.pom.xml引入依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" &qu
准备工作 ① 创建数据库&数据表 ## 创建数据库 CREATE DATABASE `dbtest1`; ## 创建数据表 CREATE TABLE `t_user` ( `id` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR(20) DEF
MyBatis逆向工程是指根据数据库表结构自动生成对应的实体类、Mapper接口以及SQL映射文件的过程。这个过程可以通过MyBatis提供的逆向工程工具来完成,极大地方便了开发人员,避免了重复的代码编写,提高了开发效率。 创建逆向工程的步骤 1、添加依赖&插件 <!-- 控制Mave
MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值。 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自
resultMap作用是处理数据表中字段与java实体类中属性的映射关系。 准备工作 ① 创建数据库&数据表 CREATE DATABASE `dbtest1`; CREATE TABLE `t_emp` ( `emp_id` int NOT NULL AUTO_INCREMENT, `em
EHCache缓存针对于MyBatis的二级缓存。 MyBatis默认二级缓存是SqlSessionFactory级别的。 添加依赖 <!-- MyBatis-EHCache整合包 --> <dependency> <groupId>org.mybatis.cac
MyBatis 提供了一级缓存和二级缓存的支持,用于提高数据库查询的性能,减少不必要的数据库访问。 一级缓存(SqlSession 级别的缓存) 一级缓存是 MyBatis 中最细粒度的缓存,也称为本地缓存。它存在于每个 SqlSession 的生命周期中,当 SqlSession 被关闭或清空时,
动态SQL是 MyBatis 中非常强大且灵活的功能,允许你根据不同的条件构建SQL查询。 这主要通过 <if>、<choose>、<when>、<otherwise>、<foreach>等标签实现。 查询场景 /** * 根据条件查询员工
本教程操作系统:windows10系统、DELL G3电脑。 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在 MyBatis 中,配置数据库连接是非常重要的第一步。下面将详细介绍如何配置 MyBatis 的
今天小编给大家分享的是MyBatis批量查询、插入、更新、删除如何实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。
今天小编给大家分享的是Mybatis操作多数据源实现的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
本篇文章和大家了解一下mybatis集成到spring的方式有哪些。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1 前言1.1 集成spring前使用mybat...
今天小编给大家分享的是mybatis-plus分页查询的3种方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
本篇内容主要讲解“mybatis之BaseTypeHandler怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis...
这篇文章主要介绍了mybatisforeach怎么传两个参数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mybatisforeach怎...
这篇“MyBatis映射文件中parameterType与resultType怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的...
这篇文章主要介绍“MyBatis怎么获取自动生成的键值”,在日常操作中,相信很多人在MyBatis怎么获取自动生成的键值问题上存在疑惑,小编查阅了各式资料,整理出
这篇文章主要讲解了“怎么去掉IntelliJIDEA中mybatis对应的xml文件警告”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入...
这篇文章主要介绍“MybatisPlus使用@TableId主键id自增长无效如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这...