Mybatis 概述

本文最后更新于:2024年9月8日 晚上

Mybatis 概述

MyBatis

  • MyBatis 是一款优秀的持久层框架。
  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程。
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的实体类 [Plain Old Java Objects,普通的 Java对象]映射成数据库中的记录。
  • MyBatis 本是apache的一个开源项目ibatis, 2010年这个项目由apache 迁移到了google code,并且改名为MyBatis

持久化

  • 持久化是将程序数据在持久状态和瞬时状态间转换的机制
    • 即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘),持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中, XML数据文件中等等。
    • JDBC就是一种持久化机制,文件IO也是一种持久化机制。
  • 为什么需要持久化服务呢?那是由于内存本身的缺陷引起的
    • 内存断电后数据会丢失,但有一些对象是无论如何都不能丢失的,比如银行账号等,遗憾的是,人们还无法保证内存永不掉电。
    • 内存过于昂贵,与硬盘,光盘等外存相比,内存的价格要高2~3个数量级,而且维持成本也高,至少需要一直供电吧,所以即使对象不需要永久保存,也会因为内存的容量限制不能一直呆在内存中,需要持久化来缓存到外存。

持久层

  • 完成持久化工作的代码块:DAO层(Data Access Object)数据访问对象。
  • 大多数情况下特别是企业级应用,数据持久化往往也就意味着将内存中的数据保存到磁盘上加以固化,而持久化的实现过程则大多通过各种关系数据库来完成。
  • 不过这里有一个字需要特别强调,也就是所谓的"层”,对于应用系统而言,数据持久功能大多是必不可少的组成部分,也就是说,我们的系统中,已经天然的具备了"持久层”概念?也许是,但也许实际情况并非如此,之所以要独立出一个"持久层”的概念,而不是"持久模块”, "持久单元”,也就意味着,我们的系统架构中,应该有一个相对独立的逻辑层面,专注于数据持久化逻辑的实现。
  • 与系统其他部分相对而言,这个层面应该具有一个较为清晰和严格的逻辑边界。

为什么需要Mybatis

  • Mybatis就是帮助程序猿将数据存入数据库中,和从数据库中取数据。

  • 传统的jdbc操作,有很多重复代码块。比如:数据取出时的封装,数据库的建立连接等等… ,通过框架可以减少重复代码,提高开发效率。

  • MyBatis 是一个半自动化的ORM框架(Object Relationship Mapping) -->对象关系映射

  • 所有的事情,不用Mybatis依旧可以做到,只是用了它,所有实现会更加简单。

  • MyBatis的优点。

    • 简单易学:本身就很小且简单,没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件就可以了,易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
    • 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响,sql写在xml里,便于统一管理和优化,通过sql语句可以满足操作数据库的所有需求。
    • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试,sql和代码的分离,提高了可维护性。
    • 提供xml标签:支持编写动态sql

生命周期和作用域

  • 理解目前已经讨论过的不同作用域和生命周期类是至关重要的,因为错误的使用会导致非常严重的并发问题。
  • 可以先画一个流程图,分析一下Mybatis的执行过程。

作用域理解

  • SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,创建成功后, SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在,因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)
  • SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象,因为 MyBatis 的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。
  • 由于 SqlSessionFactory 是一个对数据库的连接池,所以它占据着数据库的连接资源,如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。
  • 因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例,让它在应用中被共享,所以说 SqlSessionFactory 的最佳作用域是应用作用域,
  • 如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit, rollback 等方法,提交或者回滚事务,所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try…catch…finally… 语句来保证其正确关闭。
  • 所以 SqlSession 的最佳的作用域是请求或方法作用域,

Mybatis 运行流程


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!