Mybatis 连接mysql数据库底层运行的原理分析

 更新时间:2022年03月11日 11:08:51   作者:TNT_D  
这篇文章主要介绍了Mybatis 连接mysql数据库底层运行的原理分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

工作中一直在用spring+springmvc+mybatis,只是知道它是用于持久层框架,但是一直不知道原理是什么,通过网上视频解释,自己做一个笔记,方便以后查阅。

什么是mybatis

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

首先拆解mybatis架构

我将mybatis主要拆分成三个部分

  • 数据源:如何获取mysql的数据库地址。
  • 执行语句:如何将我们在mybatis配置文件中生成的sql语句映射到mysql中。
  • 操作者:连接mysql数据库,执行sql语句,得到sql语句的查询结果。好比打开mysql图形化工具,Navicat for MySQL,首先连接到需要的数据库,编写sql语句,执行语句,并得到结果。

在mybatis官网上找的入门代码

// 获取数据源
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取执行语句
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
// 执行sql并得到返回结果
SqlSession session = sqlSessionFactory.openSession();
try {
  Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
  session.close();
}

第一点、数据源的获取

第二点、获取执行语句

在获取sql语句的时候,最主要的类的就是mapperstatement。

第三点、操作数据源

在操作数据库的时候,其实底层封装还是java.sql中的JDBC操作,核心类还是会用到mapperstatement。

mybatis加载mapper文件有4中方式,分别是:

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
<!-- 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
  <mapper url="file:///var/mappers/BlogMapper.xml"/>
  <mapper url="file:///var/mappers/PostMapper.xml"/>
</mappers>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
  <mapper class="org.mybatis.builder.BlogMapper"/>
  <mapper class="org.mybatis.builder.PostMapper"/>
</mappers>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>

其中优先级最高的是package方式。 

mybatis的执行器有3中,默认的是simple。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2

    SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2

    SSH框架网上商城项目第1战之整合Struts2、Hibernate4.3和Spring4.2,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Java中ArrayList与顺序表的概念与使用实例

    Java中ArrayList与顺序表的概念与使用实例

    顺序表是指用一组地址连续的存储单元依次存储各个元素,使得在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中的线性表,下面这篇文章主要介绍了Java ArrayList与顺序表的相关资料,需要的朋友可以参考下
    2022-01-01
  • Java实现迷你图书管理系统案例全程

    Java实现迷你图书管理系统案例全程

    这篇文章主要为大家详细介绍了如何利用java语言实现简单的图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-12-12
  • Java设计模式七大原则之接口隔离原则详解

    Java设计模式七大原则之接口隔离原则详解

    接口隔离原则(Interface Segregation Principle),又称为ISP原则,就是在一个类中不要定义过多的方法,接口应该尽量简单细化。本文将为大家具体介绍一下Java设计模式七大原则之一的接口隔离原则,需要的可以参考一下
    2022-02-02
  • Java面向对象之内部类详解

    Java面向对象之内部类详解

    在 Java 中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。这篇文章将总结一下内部类的使用,感兴趣的可以了解一下
    2022-10-10
  • SpringBoot 指标监控actuator的专题

    SpringBoot 指标监控actuator的专题

    未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-11-11
  • java中实现Comparable接口实现自定义排序的示例

    java中实现Comparable接口实现自定义排序的示例

    下面小编就为大家带来一篇java中实现Comparable接口实现自定义排序的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • SpringMVC静态资源访问问题如何解决

    SpringMVC静态资源访问问题如何解决

    这篇文章主要介绍了SpringMVC静态资源访问问题如何解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • IDEA报错:无效的源发行版解决方案

    IDEA报错:无效的源发行版解决方案

    很多小伙伴在刷新maven的时候总会报 Error:java:无效的源发行版,下面这篇文章主要给大家介绍了关于IDEA报错:无效的源发行版的解决方案,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • Java Object类和包装类深入解读

    Java Object类和包装类深入解读

    Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类,所谓包装类,就是能够直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类
    2022-02-02

最新评论