MyBatis 是什么?为什么 Java 新手都应该学一学
大家好,我是掘金上常写技术教程的全栈工程师,985科班出身,带过不少零基础学员。今天这篇《MyBatis 基础教程:Java 持久层框架入门》,就是专为完全没接触过后端数据库操作的新手准备的。
我当初学 Java 的时候,最头疼的就是怎么把程序里的数据存到数据库里。用原生 JDBC 写一堆 Connection、PreparedStatement、ResultSet,不仅代码冗长,还容易出错。后来接触到 MyBatis,才发现原来操作数据库可以这么简洁!所以今天我想带你从零开始,轻松入门这个超实用的 Java 持久层框架。
小提示:虽然本文讲的是 Java 技术,但如果你未来想转 Go(比如用 GORM),或者把项目放到 GitHub 上展示能力、优化简历,掌握 MyBatis 依然是非常有价值的起点——它能帮你理解“对象-关系映射”这一通用编程思想。
一、MyBatis 到底是干什么的?
简单说:MyBatis 是一个帮 Java 程序和数据库“对话”的工具。
想象你写了一个用户注册功能,用户填了用户名和密码,你想把这些信息存进 MySQL 数据库。没有 MyBatis 时,你需要:
- 手动加载数据库驱动
- 创建连接
- 拼接 SQL 字符串(比如
"INSERT INTO user(name, pwd) VALUES (?, ?)") - 设置参数
- 执行
- 关闭连接
- 处理异常……
而 MyBatis 帮你自动化了大部分重复工作。你只需要:
- 定义一个 Java 类(比如
User) - 写一条 SQL(在 XML 或注解里)
- 调用一个方法
剩下的,MyBatis 全包了!
二、环境准备:5 分钟搭好开发环境
我们用最主流的组合:IntelliJ IDEA + Maven + MySQL + MyBatis
1. 安装必备软件
| 工具 | 作用 | 是否必需 |
|---|---|---|
| JDK 8+ | Java 运行环境 | ✅ 必需 |
| IntelliJ IDEA | 开发 IDE | ✅ 推荐(也可用 Eclipse) |
| MySQL 5.7+ | 数据库 | ✅ 必需 |
| Maven | 项目依赖管理 | ✅ 必需 |
💡 如果你还没装 MySQL,可以用 Docker 一行命令启动:
docker run --name mysql-demo -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:8
2. 创建 Maven 项目
打开 IDEA → New Project → Maven → 不选模板 → 输入 GroupId(如 com.example)和 ArtifactId(如 mybatis-demo)
3. 添加依赖(pom.xml)
<dependencies>
<!-- MyBatis 核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- 单元测试(可选但推荐) -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
保存后,Maven 会自动下载依赖。
三、核心概念:用大白话讲清楚
1. 什么是“持久层”?
程序运行时数据在内存里(易失),关机就没了。持久化 = 把数据存到硬盘(如数据库)里,永久保存。负责这部分代码的模块,就叫“持久层”。
2. MyBatis 的三大核心组件
| 组件 | 作用 | 类比 |
|---|---|---|
SqlSessionFactory |
创建数据库会话的“工厂” | 像手机制造厂,批量生产手机 |
SqlSession |
一次数据库会话 | 像一部手机,用来打电话(执行 SQL) |
| Mapper 接口 + XML | 定义 SQL 操作 | 像通讯录 + 拨号盘,告诉你打给谁、说什么 |
📌 关键思想:MyBatis 不生成 SQL,而是让你写 SQL,它只负责传参、执行、映射结果。这和 Hibernate(全自动 ORM)完全不同。
四、实战:从零写一个用户管理系统
我们将实现一个最简单的功能:向数据库插入一个用户,并查询出来。
步骤 1:创建数据库和表
CREATE DATABASE mybatis_demo;
USE mybatis_demo;
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(100)
);
步骤 2:编写 MyBatis 配置文件 mybatis-config.xml
放在 src/main/resources 目录下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://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://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 注册 Mapper XML 文件 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
步骤 3:创建 User 实体类
// src/main/java/com/example/model/User.java
package com.example.model;
public class User {
private Integer id;
private String name;
private String email;
// 构造函数、getter/setter 省略(IDE 可自动生成)
public User(String name, String email) {
this.name = name;
this.email = email;
}
// Getter 和 Setter...
}
步骤 4:编写 Mapper 接口和 XML
接口(定义方法):
// src/main/java/com/example/mapper/UserMapper.java
package com.example.mapper;
import com.example.model.User;
import java.util.List;
public interface UserMapper {
void insertUser(User user);
List<User> findAllUsers();
}
XML(写 SQL):
<!-- src/main/resources/UserMapper.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO user(name, email) VALUES(#{name}, #{email})
</insert>
<select id="findAllUsers" resultType="com.example.model.User">
SELECT * FROM user
</select>
</mapper>
🔍 注意:
namespace必须和接口全路径一致;id必须和方法名一致。
步骤 5:写测试代码
// src/test/java/com/example/AppTest.java
import com.example.mapper.UserMapper;
import com.example.model.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
public class AppTest {
@Test
public void testMyBatis() throws Exception {
// 1. 读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
// 2. 创建 SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 3. 获取 SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
// 4. 获取 Mapper 接口代理对象
UserMapper mapper = session.getMapper(UserMapper.class);
// 5. 插入用户
mapper.insertUser(new User("张三", "zhangsan@example.com"));
// 6. 提交事务(重要!)
session.commit();
// 7. 查询所有用户
List<User> users = mapper.findAllUsers();
for (User u : users) {
System.out.println("ID: " + u.getId() + ", Name: " + u.getName());
}
}
}
}
运行测试,如果控制台输出用户信息,恭喜你!MyBatis 已成功跑通!
五、新手常见问题 & 避坑指南
❌ 问题 1:ClassNotFoundException: com.mysql.cj.jdbc.Driver
原因:MySQL 驱动版本问题(8.x 需要 cj 包)
解决:确保 pom.xml 中使用的是 mysql-connector-java 8.0+,且配置文件中 driver 写全:com.mysql.cj.jdbc.Driver
❌ 问题 2:插入数据成功但查不到?
原因:忘了 session.commit()!MyBatis 默认开启事务,不提交就不会写入数据库。
解决:每次写操作后调用 session.commit()
❌ 问题 3:属性名和数据库字段名不一致(如 userName vs user_name)
解决:用 <resultMap> 显式映射,或开启驼峰转换:
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
💡 额外建议:
- 把你的 MyBatis 小项目上传到 GitHub,哪怕只有几百行代码,也能体现你的工程能力。
- 在 简历 的“项目经验”里写上:“使用 MyBatis 实现用户数据持久化”,比只写“了解 Java”有力得多。
- 如果你以后学 Go,会发现 GORM 也是类似思路——先理解概念,再换语言就快了。
六、下一步怎么学?
MyBatis 只是持久层的第一步。建议按以下路径深入:
- 掌握动态 SQL:
<if>,<foreach>等标签,实现条件查询 - 学习关联映射:一对一、一对多(比如用户-订单)
- 整合 Spring Boot:用
@MapperScan自动注入,告别手动创建SqlSession - 性能优化:缓存机制(一级/二级缓存)、分页插件(PageHelper)
- 对比其他框架:试试 MyBatis-Plus(国产增强版),或 Hibernate(全自动 ORM)
最后送大家一句话:不要怕写 SQL,理解 SQL 才是后端工程师的核心竞争力。MyBatis 让你既享受 ORM 的便利,又不失对 SQL 的掌控力。
如果你跟着教程走通了,不妨在评论区留言“Hello MyBatis!” —— 这是你后端之路的第一个里程碑。坚持下去,下一个 GitHub 高星项目、下一份亮眼简历,可能就从今天开始。
加油,未来的架构师!

评论 0