文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java MyBatis是怎么执行一条SQL语句的

2023-07-02 15:43

关注

今天小编给大家分享一下Java MyBatis是怎么执行一条SQL语句的的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

阅读环境

源码环境,github直接下载的main分支代码,版本号为 3.5.11-SNAPSHOT

Ide Jetbrain Idea 2021.2.1 社区版
Maven 3.8.2
JDK 17

配置文件:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>  <environments default="development">    <environment id="development">      <transactionManager type="JDBC"/>      <dataSource type="POOLED">        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>        <property name="url" value="jdbc:mysql:/**"/>        <property name="username" value="****"/>        <property name="password" value="******"/>      </dataSource>    </environment>  </environments>  <mappers>    <mapper resource="LogChartMapper.xml"/>  </mappers></configuration>

测试主方法:

public class Main {  public static void main(String[] args) throws IOException {    InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");    SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);    SqlSession sqlSession = build.openSession();    LogChartMapper mapper = sqlSession.getMapper(LogChartMapper.class);    List<LogChart> logCharts = mapper.selectList();    System.out.println(JSONUtil.toJsonStr(logCharts));  }}

mapper

public interface LogChartMapper {  @Select(value = "select * from log_chart")  List<LogChart> selectList();}

mapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="org.mybatis.test.mapper.LogChartMapper"></mapper>

阅读过程

加载XML的过程

从上方的测试主方法可以看到,比较重要的是 SqlSessionFactory,第一步需要看的就是他是被如何构建出来的,点击build方法,跟进去。

Java MyBatis是怎么执行一条SQL语句的

Build方法追到最下面,构建了一个XMLConfigBuilder,那么这个Parser方法,有必要进去看一下。

Java MyBatis是怎么执行一条SQL语句的

这段代码比较简短,可以看到两个信息点。第一个返回的类型是Configuration类,调用了一个parseConfiguration方法,并且传入的configuration的xml节点。
说明方法进入是对的,后续我们继续跟一下 parseConfiguration方法

Java MyBatis是怎么执行一条SQL语句的

针对这个方法,看到几个眼熟的东西。分别是解析 plugins、objectFactory、mappers 这些标签的。其他的我们这里不关心,我们主要看一下处理 Mappers 标签的这个方法。

Java MyBatis是怎么执行一条SQL语句的

这里通过遍历我们写的每个mapper标签,会得到resource、url、mapperClass这三个变量。他们在配置时是互斥的。 这里的三个if,也对应了每个不为空的情况。

我们的XML使用的是Resources属性,可以回到上面翻XML,我们这里看Resource标签不为空的 if 判断即可。

Java MyBatis是怎么执行一条SQL语句的

这里注意看,Myabtis去读取了Mapper指向的xml,然后new了一个XmlMapperBuilder,随后调用了parse方法,这里的逻辑和刚刚开头的地方很相似。值得注意的是在创建XmlMapperBuilder的时候吧Configuration传了进去,也就是说在parse中是会改变这个configuration里面的东西的。到这里接着往里面跟代码。

Java MyBatis是怎么执行一条SQL语句的

看名字有两个比较重要的方法,ConfigurationElement、binMapperForNameScpace。
configurationElement 看这个方法的入参,大概率是对XML做一些处理,像ResultMap、sql、select这些标签做处理,我这里没有用到就不说了,感兴趣的可以自己阅读一下。

后面主要看一下BindMapperForNameSpace方法。

创建Mapper

Java MyBatis是怎么执行一条SQL语句的

上面的代码中,看到了AddMapper这个方法,传入的值,是刚刚xml中配置的nameSpace,也就是Mapper类的完整类名,追进去看一下。

Java MyBatis是怎么执行一条SQL语句的

看到这里,知道了一个知识点,为什么Mapper类一定要是 Interface,如果不是interface,这个方法就进不来了。

注意看了,有一个细节,向knownMappers中,以这个class为键,放入了一个MapperProxyFactory。到达这里,就可以得知。所有的Mapper方法,都是由代理类去调用的。

接下来往下,又看到一个相似的,parse方法,看他的类名 MapperAnnotationBuilder 是用来处理注解的,往里追看一下。

Java MyBatis是怎么执行一条SQL语句的

这里的圈出来的 IF 判断,判断方法上有Select 或者 SelectProvider注解,并且没有ResultMap注解的。会去解析ResultMap,这里大概率是根据返回值,去遍历属性这里就跳过了,进入下一个方法。

parseStatement方法像是去解析方法了,代码有点多,这里就不粘贴了,感兴趣可以自己看一下,知道这里是去解析方法就可以了。

到这里结束,最后返回了SqlSessionFactory类。

获得一个Mapper

SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = build.openSession();LogChartMapper mapper = sqlSession.getMapper(LogChartMapper.class);

Java MyBatis是怎么执行一条SQL语句的

knownMapper 这个对象很眼熟是不是,这个在上面有提到过,以Class为Key,value时MapperProxyFactory,所以这里可以Get出来一个工厂,然后点用了newInstance方法,追进去看一下。

Java MyBatis是怎么执行一条SQL语句的

这里看到是Java原生的动态代理,这里返回的是一个代理对象。

执行一个Mapper的方法

因为看到这里时Java的动态代理,所以也很显而易见的得知。MapperProxy实现了InvocationHandler接口。

Java MyBatis是怎么执行一条SQL语句的

实现这个接口,会重写Invoke方法。也就是说,我们虽然代码上写的是调用的我们Mapper中指向的方法,但是其实jvm会去调用这个invoke方法,接下来直接去追Invoke方法。

Java MyBatis是怎么执行一条SQL语句的

由于我们mapper是接口,所以上面的if是为false的,也就是else是我们执行的代码,接着往里追。

Java MyBatis是怎么执行一条SQL语句的

这里可以看到new了一个PlainMethodInvoker,然后调用他的invoke方法,追进来。

Java MyBatis是怎么执行一条SQL语句的

接下来这个Execute就是他的具体执行Select语句的地方了。

Java MyBatis是怎么执行一条SQL语句的

Java MyBatis是怎么执行一条SQL语句的

由于后面的代码有点长,我这里就摘取了一小段关键的地方。看一下即可。

以上就是“Java MyBatis是怎么执行一条SQL语句的”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯