MyBatis基础教程:Java持久层框架入门
大家好,我是掘金上的一名全栈工程师,也是985高校计算机专业的毕业生。这几年带过不少实习生,也面试过上百位Java后端候选人。我发现很多初学者在接触数据库操作时,常常被JDBC的繁琐写法劝退,或者在面试中被问到“MyBatis和JPA有什么区别”时一脸茫然。
我当初学的时候,也踩过不少坑:XML配置写错、SQL参数传不进去、事务不生效……所以今天,我想用最简单的方式,带你从零开始掌握 MyBatis ——这个国内使用最广泛的 Java 持久层框架。
无论你是刚学完 Java 基础,还是正在准备校招面试,这篇文章都能帮你打下扎实的底子。更重要的是,MyBatis 是 Spring Boot 项目中最常用的 ORM 方案之一,掌握它,等于拿到了企业级开发的“入场券”。
一、MyBatis 是什么?为什么用它?
简单说:
- MyBatis 是一个 Java 持久层框架,用来简化数据库操作。
- 它把 SQL 语句从 Java 代码中分离出来(通常写在 XML 文件里),让你不用再手写
PreparedStatement和结果集映射。 - 它不是全自动 ORM(像 Hibernate 那样),而是“半自动”——你写 SQL,它帮你执行和映射。
对比传统 JDBC:
| 操作 | JDBC | MyBatis |
|---|---|---|
| 写 SQL | 在 Java 代码里拼字符串 | 在 XML 或注解中写 |
| 参数设置 | 手动 setInt, setString |
自动映射 |
| 结果集处理 | 手动 ResultSet.getXXX() |
自动映射到 Java 对象 |
| 资源管理 | 手动 close() |
框架自动管理 |
💡 资源提示:MyBatis 内部会自动管理数据库连接、PreparedStatement 等资源,避免内存泄漏。
二、环境准备:5 分钟搭建开发环境
我们将基于 Spring Boot + MyBatis + MySQL 构建项目。这是当前企业最主流的技术组合。
步骤 1:创建 Spring Boot 项目
访问 https://start.spring.io,选择:
- Project: Maven
- Language: Java
- Spring Boot: 3.x(或 2.7.x 兼容性更好)
- Dependencies:
- Spring Web
- MyBatis Framework
- MySQL Driver
点击 “Generate”,下载并解压项目。
步骤 2:配置数据库连接
在 application.yml 中添加:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=UTC
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml # 指定 XML 映射文件位置
type-aliases-package: com.example.demo.entity # 实体类包路径,可省略全限定名
⚠️ 注意:确保本地已安装 MySQL,并创建了
mybatis_demo数据库。
步骤 3:添加依赖(如果未通过 Spring Initializr 添加)
在 pom.xml 中确认包含:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
三、核心概念:3 个关键组件
MyBatis 的核心就三个东西:
- Entity(实体类):对应数据库表的 Java 对象
- Mapper 接口:定义数据库操作方法
- Mapper XML:写 SQL 语句的地方
✅ 性能优化小贴士:MyBatis 的 SQL 是你写的,所以你可以精准控制查询字段,避免
SELECT *,提升性能。
示例:用户表操作
1. 创建实体类 User.java
package com.example.demo.entity;
public class User {
private Long id;
private String name;
private Integer age;
// getter/setter 省略(可用 Lombok 简化)
}
2. 创建 Mapper 接口 UserMapper.java
package com.example.demo.mapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper // 关键注解!告诉 Spring 这是一个 MyBatis Mapper
public interface UserMapper {
List<User> findAll();
User findById(Long id);
void insert(User user);
void deleteById(Long id);
}
3. 创建 XML 映射文件 UserMapper.xml
放在 src/main/resources/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.example.demo.mapper.UserMapper">
<select id="findAll" resultType="User">
SELECT id, name, age FROM user
</select>
<select id="findById" resultType="User" parameterType="Long">
SELECT id, name, age FROM user WHERE id = #{id}
</select>
<insert id="insert" parameterType="User">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
<delete id="deleteById" parameterType="Long">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
🔍 注意:
namespace必须是 Mapper 接口的全限定名,id必须和接口方法名一致。
四、实战:写一个完整的 CRUD 接口
现在,我们用 Spring Boot Controller 调用 Mapper,实现 RESTful API。
1. 编写 Service(可选,但推荐)
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getAllUsers() {
return userMapper.findAll();
}
public void addUser(User user) {
userMapper.insert(user);
}
}
2. 编写 Controller
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> getUsers() {
return userService.getAllUsers();
}
@PostMapping
public void createUser(@RequestBody User user) {
userService.addUser(user);
}
}
3. 测试
启动应用,用 Postman 或 curl 测试:
# 获取所有用户
GET http://localhost:8080/users
# 添加用户
POST http://localhost:8080/users
Content-Type: application/json
{"name": "张三", "age": 25}
✅ 成功返回数据?恭喜你,第一个 MyBatis 项目跑通了!
五、新手常见问题 & 面试题
❓ 问题 1:启动报错 “Invalid bound statement (not found)”
原因:Mapper XML 未被扫描到。
解决:
- 检查
mybatis.mapper-locations配置路径是否正确 - 确保 XML 文件在
resources/mapper/下(不是 java 包里!)
❓ 问题 2:插入后 ID 为 null?
原因:没开启主键回填。
解决:在 <insert> 标签加 useGeneratedKeys="true" 和 keyProperty="id":
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>
❓ 面试题:MyBatis 和 Hibernate 有什么区别?
| 维度 | MyBatis | Hibernate |
|---|---|---|
| SQL 控制 | 手写 SQL,灵活 | 自动生成 HQL,抽象高 |
| 性能 | 可优化到极致 | 有 ORM 开销 |
| 学习曲线 | 低(会 SQL 就行) | 高(需理解缓存、延迟加载等) |
| 适用场景 | 复杂查询、高性能要求 | 快速开发、简单 CRUD |
🎯 面试建议:国内互联网公司(如阿里、腾讯)普遍用 MyBatis,因为它更贴近 SQL,便于 DBA 优化。
六、学习建议 & 下一步
✅ 今日收获
- 理解了 MyBatis 的核心组件
- 搭建了 Spring Boot + MyBatis 项目
- 实现了基本 CRUD 操作
🔜 下一步该学什么?
- 动态 SQL:
<if>,<foreach>处理复杂查询 - 关联查询:
<resultMap>处理一对一、一对多 - 分页插件:集成 PageHelper 实现分页
- 缓存机制:一级缓存 vs 二级缓存
- 与 Spring Boot 整合最佳实践:事务管理、异常处理
💡 避坑指南
- 不要滥用
resultType="map",尽量用实体类 - SQL 写在 XML 中,便于 DBA 审核和优化
- 开发时开启 MyBatis 日志:在
application.yml加logging: level: com.example.demo.mapper: debug
结语
MyBatis 看似简单,却是 Java 后端工程师的必备技能。我见过太多同学因为不会写 Mapper 而在面试中卡壳。希望这篇教程能帮你迈出坚实的第一步。
记住:框架只是工具,真正值钱的是你对 SQL 和数据库的理解。
如果你觉得这篇文章对你有帮助,欢迎点赞收藏,也欢迎在评论区留言你的问题。我是你们的全栈工程师朋友,下期我们讲《MyBatis 动态 SQL 详解》,不见不散!
📚 延伸资源推荐:
- 官方文档:https://mybatis.org/mybatis-3/zh/
- GitHub 示例项目:搜索 “springboot-mybatis-demo”
- 面试题合集:《Java 后端面试高频 100 题》(掘金专栏)

评论 0