简介
什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
使用方式
- 编程式:通过代码手动注入配置,创建 SqlSessionFactory、SqlSession、Mapper 等对象。
- 集成式:集成 Spring 等容器
Mapper 的 XML 和 Annotation 形式
Mapper 的使用形式要统一,不要既使用 XML 形式又使用 Annotation 形式,容易出错。建议项目中使用 XML 形式,项目中肯定会出现复杂 SQL,而 XML 对复杂 SQL 的可读性更好。
兼容形式
Mapper 的 XML 和 Annotation 是互补的兼容形式,同一个方法名不能既存在 XML 又存在 Annotation。
优缺点
优点 | 缺点 | |
---|---|---|
XML | - 跟接口分离,统一管理 - 复杂的语句可以不影响接口的可读性 |
- 过多的 XML 文件 |
Annotation | - 接口就能看到 SQL 语句,可读性高,不需要再去找 XML 文件 |
- 复杂的联合查询不好维护,代码可读性差 |
核心组件
概述
- SqlSessionFactoryBuilder(构造器):它会根据配置信息或者代码来生成 SqlSessionFactory(工厂接口)。
- SqlSessionFactory:依靠工厂来生成 SqlSession(会话)。
- SqlSession:一个既可以发送 SQL 去执行并返回结果,也可以获取 Mapper 的接口。
- SQL Mapper:它是 MyBatis 新设计的组件, 它是由一个 Java 接口和 XML 文件(或注解)构成的,需要给出对应的 SQL 和映射规则。它负责发送 SQL 语句,并返回结果。
生命周期
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 是利用 XML 或者 Java 编码获得资源来构建 SqlSessionFactory 的,通过它可以构建多个 SessionFactory。它的作用就是一个构建器,一旦我们构建了 SqlSessionFactory,它的作用就已经完结了,失去了存在的意义。所以它的生命周期只存在于方法的内部。
SqlSessionFactory
SqlSessionFactory 的作用是创建 SqlSession,而 SqlSession 就是一个会话,相当于 JDBC 中的 Connection 对象。每次应用程序访问数据库,我们都需要 SqlSessionFactory 创建 SqlSession,所以 SqlSessionFactory 应该在 MyBatis 应用的整个生命周期中。而如果我们多次创建同一个数据库的 SqlSessionFactory,则每次创建 SqlSessionFactory 会打开更多的数据库连接资源,那么连接资源就很快会被耗尽。因此 SqlSessionFactory 的责任是唯一的,它的责任就是创建 SqlSession,所以应该采用单利模式。正确的做法是使得每一个数据库只对应一个 SqlSessionFactory,管理好数据库资源的分配,避免过多的 Connection 被消耗。
SqlSession
SqlSession 是一个会话,相当于 JDBC 的一个 Connection 对象,它的生命周期应该是在请求数据库处理事务的过程中。它是一个线程不安全的对象,在涉及多线程的时候我们需要特别小心,操作数据库需要注意其隔离级别,数据库锁等高级特效。此外,每次创建的 SqlSession 都必须及时关闭它,它的长期存在会使数据库连接池的活动资源减少,对系统性能的影响太大。我们往往通过 finally 语句保证我们正确的关闭 SqlSession。它存活于一个应用的请求和操作,可以执行多条 SQL,保证事务的一致性。
Mapper
Mapper 是一个接口,而没有具体的实现类,它的作用是发送 SQL,然后返回我们需要的结果,或者执行 SQL 从而修改数据库的数据,因此它应该在一个 SqlSession 事务方法之内,是一个方法级别的东西。
用一张图描述 MyBatis 组件的生命周期:
作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/fbpkao 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。