1. Mybatis 快速开始
本节笔者将根据Mybatis的官方文档,创建一个基本的Mybatis Demo,以达到演示Mybatis基本功能的目的。
传统的业务开发中,我们都是使用Mybatis与数据库进行交互,因此使用Mybatis的主要功能就是进行数据持久化,虽然这部分传统的JDBC已经完成了这个功能,但是JDBC的使用相对比较麻烦,因此,也就有了大量的框架出现。接下来,我们根据文档,搭建一个Mybatis的Demo,并根据这个Demo介绍一些Mybatis中的基本定义。
本Demo使用包管理工具的是传统的maven,读者如果要进行本地调试,请保证maven已安装,安装方式请参考maven官网。
1.1 版本选择
根据Mybatis官方文档中的说明,如果需要使用Mybatis,需要在pom文件中引入对应的包。

需要注意,Mybatis自身提供的功能对于开发而言,并不简易,因此许多开发者都对其进行了自定义,因此在maven仓库中搜索时会出现许多名称的包,这里,我们使用mybatis原生的包进行分析。笔者当前是在2020-12-15写的这篇文章,此时,maven仓库中最新的包是3.5.6版本,故本次使用该版本的包进行源码分析。
1.2 数据库创建
由于mybatis是一个持久化框架,因此,数据库的搭建是必不可少的。
这里我们基于Docker临时创建一个数据库实例,并在实例中创建一个数据库名为mybatis,创建一张名为blog的表。表中字段如下:
| 字段名 | 类型 | 描述 |
|---|---|---|
| id | int(11) | 自增id,主键 |
| title | varchar(30) | 名称 |
| content | varchar(255) | 内容 |
建表语句如下:
create database mybatis;
use mybatis;
create table `mybatis`.`blog` (
`id` int(11) AUTO_INCREMENT NOT NULL,
`title` varchar(30),
`content` varchar(255),
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
对应的POJO代码为:
package com.jllsq;
public class Blog {
private Integer id;
private String title;
private String content;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
笔者这里提供了一个压缩包,读者可以直接解压,然后cd到压缩包目录后,运行start.sh就可以使用docker运行起本次源码分析所需要的数据库了。
同样,使用该压缩包中的脚本需要本地安装docker,安装教程请查看docker官网。也可以本地直接安装mysql建表,效果相同。
1.3 代码编写
根据Mybatis的官方文档,使用Mybatis的基本功能需要如下几部:
- 构建 SqlSessionFactory
- 从 SqlSessionFactory 中获取 SqlSession
- 使用SqlSession进行与数据库的交互。
1.3.1 构建 SqlSessionFactory
Mybatis中的一个核心概念是SqlSession,我们需要通过SqlSession与数据库进行交互,而SqlSession是通过SqlSessionFactory进行创建的(工厂模式)。因此,我们需要先创建一个SqlSessionFactory。
可能部分读者有疑问,那SqlSession和Mysql的session有什么关系么?
关于SqlSession的细节,后面再继续进行讨论。
SqlSessionFactory的创建可以基于XML文件或者基于代码创建。Mybatis在文档中也提供了这两种方式的示例。


这里我们采用基于XML文件的方式创建SqlSessionFactory,原因是,其实基于XML文件的方式最终还是需要基于Java代码创建SqlSessionFactory,只不过多了一步解析配置文件。为了给读者完全诠释Mybatis,这里我们采用基于XML文件的方式来写这个Demo。
首先需要准备配置文件:
<?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://127.0.0.1:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/jllsq/BlogMapper.xml"/>
</mappers>
</configuration>
配置文件中仅声明了Mysql的基本信息以及一个Mapper,这个Mapper的配置文件在com/jllsq/BlogMapper.xml目录。关于这个Mapper,我们一会儿再仔细讲解。
只需要拥有这个配置文件,我们就可以创建一个SqlSessionFactory了。如果不需要使用到SqlSession,Mapper甚至可以不指定。
那么接下来需要写代码,读取配置文件,生成SqlSessionFactory。
public class Main {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
Mybatis提供了一个SqlSessionFactoryBuilder用于解析配置文件,生成SqlSessionFactory,我们只需要将文件流传输给它即可。
截止到现在为止,SqlSessionFactory就已经生成了。
1.3.2 从 SqlSessionFactory 中获取 SqlSession
SqlSessionFactory作为一个工厂方法,提供了一个名为openSession()的方法,它的重载形式有很多,后面我们会对其进行分析。该方法会创建一个SqlSession。所以获取SqlSession的方法很简单:
public class Main {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
}
}
1.3.3 通过SqlSession与数据库进行交互
使用SqlSession与数据库进行交互时,需要一个Mapper的配置文件。在讨论配置文件之前,我们先看一下Mapper这个名字,映射器。Mybatis的持久化方法与Sql语句是通过一个xml文件进行映射的。为了形象的解释这句话,我们举个例子。
例如对于上面的Demo,由于数据库里还没有数据,我们希望插入一条,因此,我们希望执行一条insert语句。这时我们尝试使用SqlSession,发现它有如下这样的方法:
int insert(String statement);
int insert(String statement, Object parameter);
由于之前使用过jdbc,读者可能会想这么写:
sqlSession.insert("insert into blog (title,content) value (\"first\",\"first\");");
那么问题来了,这与直接使用jdbc有什么区别呢,除了我们不再需要去显示创建Connection了,但是还需要创建SqlSession啊。而且Sql还是没法复用。Mybatis并不是这样使用的。接下来我们用正确的方式打开Mybatis。
在使用SqlSession操作数据库之前,我们需要创建一个Mapper配置文件(映射器),就是1.3.1节所提到的。
创建这个映射器的目的是什么呢?
传统使用Jdbc的一个缺点就是:sql是强编码的,不能复用。我们可以将sql封装成一个方法,sql的可变参数变为方法的参数,那么这样sql就可以复用了,这样就形成了一个方法名与sql的映射。这时就需要映射器了。
Mybatis的映射器就是做了这样一件事。mybatis通过一个id来唯一确定一条sql。这个id就是Mapper名+方法名。举个例子,现在我们需要去插入一条数据到数据库中。这时我们需要创建一个mapper,这里我们将其声明为com.jllsq.BlogMapper,表示这个是博客表的映射器,这个表可能要声明许多的模板sql,因此,mybatis为每个sql提供了一个id,我们设置插入一条数据的sql的id为insertOne,那么此时,这个Mapper的配置文件就可以写出来了。
<?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="com.jllsq.BlogMapper">
<insert id="insertOne" keyColumn="id" keyProperty="id" parameterType="com.jllsq.Blog" useGeneratedKeys="true">
insert into blog (title,content) value (#{title},#{content})
</insert>
</mapper>
此时,你就将insert into blog (title,content) value (#{title},#{content})这条插入语句映射到了com.jllsq.BlogMapper.insertOne这个id上。然后你就可以使用com.jllsq.BlogMapper.insertOne这个id调用sql了。 完整的代码如下:
public class Main {
public static void main(String[] args) throws IOException {
// 创建SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 设置要插入的Blog的属性
Blog blog = new Blog();
blog.setTitle("first");
blog.setContent("first");
// 创建一个SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 将Blog插入到数据库
sqlSession.insert("com.jllsq.BlogMapper.insertOne",blog);
// 提交事务
sqlSession.commit();
// 关闭SqlSession
sqlSession.close();
}
}
执行完毕之后,你的数据库就被插入了一条语句,至于删改查操作,使用方式都是相同的,这里就不多赘述了。
源码我会放在下面的压缩包中。
总结
本篇文章介绍了Mybatis的基本功能——sql与配置文件映射使用的简单用法。
Mybatis使用了两类配置文件:
- SqlSessionFactory的配置文件
- 映射器的配置文件
进行了如下操作:
- 创建SqlSessionFactory(使用配置文件1)
- 通过SqlSessionFactory创建SqlSession
- 创建Sql与唯一id的映射——即Mapper(映射器)(使用配置文件2)
- 通过唯一id,使用SqlSession对数据库进行操作
- 清理SqlSession
接下来,我们会对这部分源代码进行分析。敬请期待。