在Java后端开发中,数据库交互是核心必备能力,而MyBatis是目前企业使用最广泛、性价比最高的半自动ORM持久层框架。
它完美弥补了原生JDBC和全自动框架Hibernate的短板,三者核心对比:
原生JDBC:代码极度繁琐、SQL硬编码、手动处理结果集与事务、冗余代码多
Hibernate(全自动ORM):无需手写SQL,但SQL不可控、复杂查询性能差、灵活性极低
MyBatis(半自动ORM) :SQL可控、代码与SQL解耦、轻量高效、适配所有业务场景
一、适配环境版本
-
JDK:1.8
-
MySQL:5.7 / 8.0
-
Maven:3.6+
-
MyBatis:3.5.16
-
数据库驱动:mysql-connector-java 8.0.33
二、MyBatis核心底层原理
3.1 原生JDBC开发痛点(为什么要用MyBatis?)面试题
原生JDBC是最基础的数据库交互方式,但存在大量致命问题,完全不适合企业开发:
-
资源严重浪费:每次数据库操作都需要手动创建、关闭连接,频繁IO交互,性能损耗极大。
-
代码高度耦合:SQL语句直接硬编码在Java代码中,修改SQL必须改动Java代码,维护成本极高。
-
冗余代码过多:需要手动处理参数赋值、结果集封装、资源释放,重复代码量大。
-
事务操作繁琐:事务提交、回滚、异常捕获全部需要手动编码,极易出错。
3.2 MyBatis核心解决方案
MyBatis针对性解决了JDBC的所有痛点,核心优势如下:
-
内置连接池管理:自动复用数据库连接,避免频繁创建销毁,大幅提升性能。
-
SQL与代码完全解耦:SQL统一编写在XML/注解中,修改SQL无需改动Java业务代码。
-
自动结果集映射:无需手动封装ResultSet,自动将数据库数据映射为Java实体对象。
-
简化事务管理:封装事务提交、回滚逻辑,支持自动/手动事务,降低开发难度。
-
半自动ORM特性:实体与数据表手动映射,开发者完全掌控SQL,适配复杂业务查询。
3.3 MyBatis完整执行流程(面试必考)
MyBatis 核心执行流程
SqlSessionFactoryBuilder 解析配置
加载 mybatis-config.xml 全局配置文件
解析 XML 构建 Configuration 配置对象
创建全局唯一的 SqlSessionFactory 实例
SqlSessionFactory 生产会话
通过 openSession() 方法创建 SqlSession
支持事务隔离级别、执行器类型等参数配置
每个 SqlSession 对应一次数据库会话
SqlSession 操作执行
方式一:getMapper() 获取接口代理对象
方式二:直接调用 select/insert/update 方法
底层通过 Executor 执行器处理 SQL
JDBC 交互层
通过 StatementHandler 创建 PreparedStatement
自动处理参数绑定(ParameterHandler)
结果集转换(ResultSetHandler)
资源释放阶段
自动/手动调用 close() 释放连接
将连接归还连接池
清理一级缓存作用域
关键对象职责说明
关键对象职责说明表格
| 对象名称 | 职责描述 |
|---|---|
| Configuration | 存储所有映射器、类型处理器等配置,作为 MyBatis 运行时的核心配置容器 |
| Executor | 执行 SQL 的核心接口,包含 Base/Reuse/Batch 三种实现,管理一级缓存和事务 |
| MapperProxy | 动态代理生成的接口实现类,将方法调用转为 SqlSession 操作,方法签名与映射文件严格匹配 |
四、Maven依赖配置
在项目 pom.xml 文件中导入全套依赖,包含MyBatis核心、数据库驱动、日志框架、单元测试,每个依赖均标注核心作用,适配上述环境版本。
以下是转换后的代码格式(Markdown代码块形式):
XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mybatis</groupId>
<artifactId>mybatis-study</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- MyBatis核心依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.16</version>
</dependency>
<!-- MySQL8.0数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
<!-- 日志核心依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>
<!-- JUnit5单元测试 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
关键组件说明
- MyBatis核心:3.5.16版本提供ORM框架功能
- MySQL驱动:8.0.33版本支持JDBC连接
- 日志系统:SLF4J接口+Simple实现组合
- 测试框架:JUnit5用于单元测试
依赖细节详解
mybatis:框架核心依赖,提供配置解析、SQL执行、结果映射、事务管理所有核心能力。
mysql-connector-java:runtime作用域,仅项目运行时生效,编译阶段无需加载,优化项目编译效率。
slf4j:日志框架,MyBatis无自带日志组件,必须导入,否则无法查看执行的SQL语句,难以调试排错。
junit:单元测试框架,快速验证MyBatis数据库操作是否正常执行。
三、企业标准项目结构
遵循企业开发规范搭建目录结构,结构清晰、职责分明,所有MyBatis项目均可通用:
mybatis-study
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── mybatis
│ │ ├── pojo
│ │ │ └── User.java
│ │ ├── mapper
│ │ ├── util
│ │ │ └── MyBatisUtil.java
│ │ └── test
│ └── resources
│ ├── mybatis-config.xml
│ ├── UserMapper.xml
│ └── logback.xml
└── test
功能说明
以下是整理后的POJO与数据库映射开发规范表格,按模块分类说明核心文件作用及关联关系:
| 模块类型 | 文件示例 | 核心职责 | 关联文件 |
|---|---|---|---|
| POJO实体类 | User.java | 定义与数据库表字段对应的属性(如id、username),需包含Getter/Setter方法 | UserMapper.xml / UserMapper.java |
| Mapper接口 | UserMapper.java | 声明数据库操作方法(如insertUser),通过@Select等注解或XML实现SQL绑定 |
UserMapper.xml |
| 工具类 | MyBatisUtil.java | 封装SqlSessionFactory创建逻辑,提供线程安全的SqlSession获取与关闭方法 | mybatis-config.xml |
| MyBatis配置 | mybatis-config.xml | 配置数据源(DataSource)、事务管理器(TransactionManager)、别名扫描路径等全局参数 | 无 |
| SQL映射文件 | UserMapper.xml | 编写动态SQL(如<select id="selectUser">),通过namespace绑定Mapper接口 |
UserMapper.java |
| 日志配置 | logback.xml | 设置MyBatis日志级别(如DEBUG显示SQL语句),输出到控制台或文件 | 无 |
| 单元测试 | UserMapperTest.java | 使用JUnit测试Mapper方法,验证SQL执行结果是否符合预期 | UserMapper.java |
关键映射关系说明
- POJO与表字段 :User.java的
private String username对应数据库表的username字段,需确保命名一致(或通过@Column注解显式映射)。 - Mapper与XML :UserMapper.java的
List<User> selectAll()方法,需在UserMapper.xml中定义对应的<select id="selectAll">SQL语句。 - 工具类调用链:测试类通过MyBatisUtil获取SqlSession → 调用Mapper接口方法 → 执行XML中SQL → 返回POJO实体对象。
四、数据库初始化(测试数据准备)
提前创建数据库、数据表并插入测试数据,为后续CRUD实操提供数据支撑,直接复制SQL执行即可。
4.1 创建数据库
CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4; USE mybatis_test;
4.2 创建用户表 + 初始化测试数据
SQL 表创建与数据插入示例:以下是一个 MySQL 表的创建语句和对应的数据插入操作。
表结构定义
sql
CREATE TABLE t_user(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键id',
username VARCHAR(20) NOT NULL COMMENT '用户名',
password VARCHAR(20) NOT NULL COMMENT '密码',
age INT COMMENT '年龄',
email VARCHAR(50) COMMENT '邮箱'
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
数据插入操作
sql
INSERT INTO t_user(username,password,age,email)
VALUES
('张三','123456',20,'zs@163.com'),
('李四','654321',22,'ls@qq.com');
小技巧:实体类属性名尽量与数据库字段名保持一致,可省略手动映射配置。
五、MyBatis全局核心配置文件
mybatis-config.xml 是MyBatis项目的总配置入口 ,负责数据库连接、多环境配置、日志开启、映射文件注册等全局核心功能,必须放置在 resources 根目录。
⚠️ 重磅注意 :配置文件标签有固定顺序,顺序错乱会直接启动报错!优先级:properties → settings → typeAliases → environments → mappers
5.1 完整可运行配置代码
XML
<?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>
<settings>
<setting name="logImpl" value="SLF4J"/>
</settings>
<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://localhost:3306/mybatis_test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="你的数据库密码"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
5.2 细节解析
-
DTD约束:固定模板,用于校验XML语法合法性,禁止修改、删除。
-
settings全局配置:MyBatis全局功能开关,可开启日志、驼峰命名、二级缓存等核心功能。
-
environments多环境:可配置多套数据库环境,通过default属性一键切换,适配开发、测试、生产场景。
-
transactionManager事务管理器
-
JDBC:使用原生JDBC事务,手动控制提交、回滚(独立MyBatis项目使用)
-
MANAGED:交由Spring容器管理事务(框架整合场景使用)
-
-
dataSource数据源类型
-
POOLED:内置数据库连接池,复用连接、性能高,开发首选
-
UNPOOLED:无连接池,每次操作新建连接,仅用于简单测试
-
JNDI:服务器容器连接池,用于企业生产环境
-
-
URL关键参数
-
serverTimezone=Asia/Shanghai:解决MySQL8.0时区异常报错 -
&:XML文件中&符号必须转义,否则语法报错
-
-
mappers映射注册:告知MyBatisSQL映射文件的位置,必须注册否则无法执行SQL。
六、MyBatis四大核心对象 & 生命周期
四大核心对象是MyBatis底层运行的核心支撑,生命周期是高频面试题,必须精准记忆:
6.1 SqlSessionFactoryBuilder(配置构建器)
-
核心作用:读取全局配置文件、解析配置信息,构建SqlSessionFactory工厂对象。
-
生命周期 :方法级,仅创建工厂时使用,用完即销毁,无需全局保存。
6.2 SqlSessionFactory(会话工厂)
-
核心作用:生产数据库会话SqlSession对象,是全局核心工厂。
-
生命周期 :应用级(全局单例),项目启动创建、项目关闭销毁。
-
核心特点:线程安全,全局仅需一个实例,重复创建会造成资源浪费。
6.3 SqlSession(数据库会话)
-
核心作用 :执行SQL语句、管理事务、获取Mapper代理对象、完成数据库交互。
-
生命周期 :请求/方法级,单次数据库操作有效,用完必须关闭释放资源。
-
核心特点 :线程不安全,多线程环境下禁止共享,否则会出现数据错乱。
-
两种创建方式:
-
openSession():默认关闭自动提交,增删改操作需手动commit -
openSession(true):开启自动提交,无需手动处理事务
-
8.4 Mapper(映射器代理对象)
-
核心作用 :绑定XML中自定义SQL语句,通过接口方法调用即可执行数据库操作。
-
生命周期:与SqlSession绑定,会话销毁,代理对象随之失效。
七、本课核心知识点总结
-
MyBatis定位:轻量级半自动ORM持久层框架,SQL可控、代码解耦、性能优异。
-
核心执行流程:配置文件解析 → 构建会话工厂 → 创建数据库会话 → 执行SQL → 结果映射 → 释放资源。
-
生命周期优先级:SqlSessionFactory(应用级) > SqlSession(请求级) > 构建器(方法级)。
-
核心配置要点:标签顺序固定、URL需适配MySQL8.0、开发首选POOLED连接池。
-
事务区别:自动提交适合查询,手动提交适合增删改,保障数据一致性。