---
title: MyBatis 原理
date: 2022-02-17 22:34:30
order: 02
categories:
- Java
- 框架
- ORM
tags:
- Java
- 框架
- ORM
- MyBatis
permalink: /pages/ae7b258f/
---
# MyBatis 原理
> MyBatis 的前身就是 iBatis ,是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。本文以一个 MyBatis 完整示例为切入点,结合 MyBatis 底层源码分析,图文并茂的讲解 MyBatis 的核心工作机制。
## MyBatis 完整示例
> 这里,我将以一个入门级的示例来演示 MyBatis 是如何工作的。
>
> 注:本文后面章节中的原理、源码部分也将基于这个示例来进行讲解。
>
> [完整示例源码地址](https://github.com/dunwu/spring-tutorial/blob/master/codes/data/spring-data-mybatis/src/main/java/io/github/dunwu/spring/orm/MybatisDemo.java)
### 数据库准备
在本示例中,需要针对一张用户表进行 CRUD 操作。其数据模型如下:
```sql
CREATE TABLE IF NOT EXISTS user (
id BIGINT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Id',
name VARCHAR(10) NOT NULL DEFAULT '' COMMENT '用户名',
age INT(3) NOT NULL DEFAULT 0 COMMENT '年龄',
address VARCHAR(32) NOT NULL DEFAULT '' COMMENT '地址',
email VARCHAR(32) NOT NULL DEFAULT '' COMMENT '邮件',
PRIMARY KEY (id)
) COMMENT = '用户表';
INSERT INTO user (name, age, address, email)
VALUES ('张三', 18, '北京', 'xxx@163.com');
INSERT INTO user (name, age, address, email)
VALUES ('李四', 19, '上海', 'xxx@163.com');
```
### 添加 MyBatis
如果使用 Maven 来构建项目,则需将下面的依赖代码置于 pom.xml 文件中:
```xml
org.mybatis
mybatis
x.x.x
```
### MyBatis 配置
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
本示例中只是给出最简化的配置。
【示例】MyBatis-config.xml 文件
```xml
```
> 说明:上面的配置文件中仅仅指定了数据源连接方式和 User 表的映射配置文件。
### Mapper
#### Mapper.xml
个人理解,Mapper.xml 文件可以看做是 MyBatis 的 JDBC SQL 模板。
【示例】UserMapper.xml 文件
下面是一个通过 MyBatis Generator 自动生成的完整的 Mapper 文件。
```xml
delete from user
where id = #{id,jdbcType=BIGINT}
insert into user (id, name, age,
address, email)
values (#{id,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER},
#{address,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR})
update user
set name = #{name,jdbcType=VARCHAR},
age = #{age,jdbcType=INTEGER},
address = #{address,jdbcType=VARCHAR},
email = #{email,jdbcType=VARCHAR}
where id = #{id,jdbcType=BIGINT}
```
#### Mapper.java
Mapper.java 文件是 Mapper.xml 对应的 Java 对象。
【示例】UserMapper.java 文件
```java
public interface UserMapper {
int deleteByPrimaryKey(Long id);
int insert(User record);
User selectByPrimaryKey(Long id);
List selectAll();
int updateByPrimaryKey(User record);
}
```
对比 UserMapper.java 和 UserMapper.xml 文件,不难发现:
UserMapper.java 中的方法和 UserMapper.xml 的 CRUD 语句元素( ``、``、``、`