MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

下载

Maven

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
 

手动

Github:https://github.com/mybatis/mybatis-3/releases 最新mybatis-3.5.13直链:https://github.com/mybatis/mybatis-3/releases/download/mybatis-3.5.13/mybatis-3.5.13.zip

配置文件

官方中文文档:https://mybatis.org/mybatis-3/zh/configuration.html

通过单独的XML配置文件而不是在JAVA代码中配置,使得硬编码的部分大大减少,我们随时都可以去修改,就变得很方便了,同时代码量也大幅度减少,配置文件填写完成后,我们只需要关心项目的业务逻辑而不是如何去读取配置文件。

mybatis-config.xml

配置文件完成后,我们需要在Java程序启动时,让Mybatis对配置文件进行读取并得到一个SqlSessionFactory对象:

public static void main(String[] args) throws FileNotFoundException {
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("mybatis-config.xml"));
    try (SqlSession sqlSession = sqlSessionFactory.openSession(true)){
			//暂时还没有业务
    }
}

之后Mybatis就会自动处理JDBC连接数据库等操作。

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的,我们可以通过SqlSessionFactory来创建多个新的会话,SqlSession对象,每个会话就相当于我不同的地方登陆一个账号去访问数据库,你也可以认为这就是之前JDBC中的Statement对象,会话之间相互隔离,没有任何关联。

而通过SqlSession就可以完成几乎所有的数据库操作,接口中定义了大量数据库操作的方法,因此,只需要通过一个对象就能完成数据库交互,极大简化了之前的流程。

使用 Mybatis 的三种方式

XML 方式

接口方式

注解方式

缓存机制

所谓缓存就是内存中的一部分空间,用于提前放置少数内容,下次需要获取数据时直接从缓存读取,而非再次向数据库索要数据,效率更高。

MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。

Mybatis存在一级缓存和二级缓存。默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存(一级缓存无法关闭,只能调整)。

缓存读写顺序

读取顺序:二级缓存 一级缓存 数据库

Mybatis 数据源

JDBC 中需要用 DriverManager 来提供链接对象,通过使用 DriverManager.getConnection() 来创建连接,在连接内才能进行数据库操作。

Mybatis 中使用 SqlSesionFactory 来提供 SqlSession 会话,并在会话内进行数据库操作。而在Mybatis中,并非通过 DriverManager 来获取连接,而是使用 DataSource 实现类来获取,因为数据库建立和关闭很耗费系统资源。

数据库链接的建立和关闭是极其耗费系统资源的操作,通过DriverManager获取的数据库连接,一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完后立即关闭连接,频繁的打开、关闭连接会持续消耗网络资源,造成整个系统性能的低下。

常见的 DataSource 实现类都采用池化技术,即一开始就创建好N个连接,这样之后使用就无需再次进行连接,而是直接使用现成的Connection对象进行数据库操作。

我们也可以设置切换为其他数据源实现:配置Mybatis数据源实现

Mybatis 事务管理

事务遵循一个ACID原则,简单来说,事务就是要么完成,要么就啥都别做!并且不同的事务之间相互隔离,互不干扰。

而实现该原则是通过隔离机制

Mybatis 一个事务被抽象为创建,提交,回滚,关闭等,成为一个接口:

public interface Transaction {
    Connection getConnection() throws SQLException;
 
    void commit() throws SQLException;
 
    void rollback() throws SQLException;
 
    void close() throws SQLException;
 
    Integer getTimeout() throws SQLException;
}

对该接口的实现分为两种:

JDBC

使用JDBC的事务管理机制:即利用对应数据库的驱动生成的Connection对象完成对事务的提交(commit())、回滚(rollback())、关闭(close())等,对应的实现类为JdbcTransaction

JdbcTransaction 源码

相当于JdbcTransaction只是为数据库驱动提供的Connection对象套了层壳,所有的事务操作实际上是直接调用Connection对象。

ManagedTransaction

public class ManagedTransaction implements Transaction {
    ...
 
    public void commit() throws SQLException {
    }
 
    public void rollback() throws SQLException {
    }
 
    ...
}

大体内容和JdbcTransaction差不多,但是它并没有实现任何的事务操作。也就是说,它希望将实现交给其他的管理框架来完成,而Spring就为Mybatis提供了一个非常好的事务管理实现。