MyBatis基础教程:Java持久层框架入门
作者:一位开源项目维护者 & 后端讲师
写作初衷:我在GitHub上维护过多个Java后端项目,也带过不少刚毕业的同学。很多人在学完Java基础后,面对数据库操作一脸茫然——尤其是看到XML配置、SQL映射这些术语就头疼。今天我就用最“接地气”的方式,手把手带你入门MyBatis,哪怕你连“持久层”是啥都不知道也没关系!
为什么我要写这篇教程?
我当初学Java的时候,也是从JDBC开始的——手动加载驱动、写Connection、处理ResultSet……不仅代码冗长,还特别容易出错。后来接触到MyBatis,才发现原来操作数据库可以这么优雅!但可惜的是,很多教程一上来就讲“ORM”、“映射器”、“动态SQL”,完全不考虑零基础读者的感受。
所以,这篇教程不堆术语、不讲理论,只用一个简单案例,带你从零搭建一个能真正运行的MyBatis程序。顺便澄清一点:虽然标题里提到了 Go 和 前端,但它们和MyBatis本身无关——我会在文末说明它们在实际开发中的位置,以及为什么你在写简历时要突出MyBatis技能。
一、MyBatis是什么?它能帮你做什么?
简单说:MyBatis 是一个帮你把 Java 对象和数据库记录“自动对接”的工具。
想象一下,你想把用户信息存到数据库里:
- 没有MyBatis:你得手写几十行
PreparedStatement和ResultSet代码。 - 有了MyBatis:你只需要写一句SQL,剩下的交给它处理。
💡 类比理解:MyBatis 就像是你和数据库之间的“翻译官”。你说Java语言,数据库说SQL语言,它负责两边沟通。
二、环境准备(5分钟搞定)
我们不需要复杂的IDE,只要以下工具:
| 工具 | 版本要求 | 说明 |
|---|---|---|
| JDK | 8 或以上 | Java开发基础 |
| Maven | 3.6+ | 项目依赖管理(也可用Gradle,本文用Maven) |
| MySQL | 5.7+ 或 8.0 | 数据库(可用H2等内存数据库替代) |
| IDE | IntelliJ IDEA / VS Code | 推荐IDEA,对Java支持更好 |
步骤1:创建Maven项目
打开终端,执行:
mvn archetype:generate -DgroupId=com.example -DartifactId=mybatis-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
进入项目目录:
cd mybatis-demo
步骤2:添加依赖(编辑 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>
✅ 提示:如果你没有MySQL,可以用H2内存数据库(适合学习),只需替换驱动为
com.h2database:h2。
步骤3:创建数据库和表
假设你已安装MySQL,登录后执行:
CREATE DATABASE mybatis_demo;
USE mybatis_demo;
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(100)
);
插入一条测试数据:
INSERT INTO user (name, email) VALUES ('张三', 'zhangsan@example.com');
三、核心概念:用大白话解释
1. SqlSessionFactory:MyBatis的“总开关”
- 它读取配置文件,创建数据库连接池。
- 整个应用通常只需要一个实例(单例)。
2. Mapper接口 + XML/注解:你的SQL在哪里写?
- 你可以用 XML文件 写SQL(推荐初学者)
- 也可以直接在 Java接口方法上加注解(适合简单SQL)
3. POJO(Plain Old Java Object):就是普通的Java类
比如 User.java,用来对应数据库的 user 表。
🌰 举个栗子:
数据库有一行:id=1, name='李四'
MyBatis 会自动创建一个User对象:new User(1, "李四", ...)
这就是“对象-关系映射”(ORM)的核心思想。
四、实战:5步完成一个用户查询功能
目标:通过ID查询用户信息,并打印出来。
第1步:创建 User 类(POJO)
在 src/main/java/com/example 下新建 User.java:
package com.example;
public class User {
private int id;
private String name;
private String email;
// 必须提供无参构造函数(MyBatis需要)
public User() {}
// Getter 和 Setter
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
@Override
public String toString() {
return "User{id=" + id + ", name='" + name + "', email='" + email + "'}";
}
}
第2步:编写 MyBatis 配置文件
在 src/main/resources 下创建 mybatis-config.xml:
<?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="your_password"/> <!-- 改成你的密码 -->
</dataSource>
</environment>
</environments>
<!-- 注册 Mapper XML 文件 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
第3步:创建 Mapper XML 文件
在 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.UserMapper">
<select id="selectUserById" resultType="com.example.User" parameterType="int">
SELECT id, name, email FROM user WHERE id = #{id}
</select>
</mapper>
🔍 关键点解释:
namespace:必须和后面Mapper接口的全类名一致(即使我们现在不用接口)id="selectUserById":这个SQL的唯一标识#{id}:安全地传入参数(防止SQL注入)
第4步:编写主程序
修改 App.java(位于 src/main/java/com/example/App.java):
package com.example;
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 java.io.IOException;
import java.io.InputStream;
public class App {
public static void main(String[] args) throws IOException {
// 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. 执行查询:namespace + id
User user = session.selectOne("com.example.UserMapper.selectUserById", 1);
System.out.println(user);
}
}
}
第5步:运行!
在项目根目录执行:
mvn compile exec:java -Dexec.mainClass="com.example.App"
输出应为:
User{id=1, name='张三', email='zhangsan@example.com'}
🎉 恭喜!你已经成功运行了第一个MyBatis程序!
五、新手常见问题解答(FAQ)
Q1:为什么报 ClassNotFoundException?
- 检查
pom.xml是否正确添加了MySQL驱动。 - 如果用MySQL 8.0,驱动类名是
com.mysql.cj.jdbc.Driver(不是老版本的com.mysql.jdbc.Driver)。
Q2:SQL写错了怎么办?
MyBatis会在控制台打印完整的SQL语句(开启日志后更清晰)。建议在开发时开启日志:
在 mybatis-config.xml 的 <configuration> 内加入:
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
Q3:能不能不用XML,直接用注解?
可以!但仅限简单SQL。例如:
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectUserById(int id);
}
然后在 mybatis-config.xml 中注册接口:
<mappers>
<mapper class="com.example.UserMapper"/>
</mappers>
⚠️ 注意:复杂SQL(如多表关联、动态WHERE)还是推荐用XML。
Q4:和 Hibernate 有什么区别?
| 特性 | MyBatis | Hibernate |
|---|---|---|
| SQL控制 | 完全由你写SQL | 自动生成SQL |
| 学习曲线 | 低(适合SQL熟悉者) | 高 |
| 灵活性 | 高 | 低(抽象层厚) |
| 性能调优 | 容易(SQL可见) | 较难 |
国内互联网公司(如阿里、腾讯)普遍使用MyBatis,因为它更贴近SQL,便于优化。
六、关于 Go、前端 和 简历 的说明
你可能会疑惑:标题里提到 Go 和 前端,但全文没出现?
- Go:是一种后端编程语言(类似Java),和MyBatis无关。如果你未来想转Go开发,会用到GORM等ORM框架,但那是另一个生态。
- 前端:指网页、App界面,通常用JavaScript/Vue/React开发。MyBatis属于后端技术,前端通过API(如RESTful接口)和后端交互。
- 简历:如果你正在找工作,在“技术栈”一栏写上 MyBatis 非常加分!尤其应届生,掌握一个主流持久层框架,远比只会JDBC强得多。建议这样写:
项目经验:使用 Spring Boot + MyBatis 开发用户管理系统,实现CRUD操作,QPS达1000+
七、下一步学习建议
进阶MyBatis:
- 学习
resultMap(处理复杂映射) - 掌握动态SQL(
<if>,<foreach>) - 使用
@Param传递多个参数
- 学习
结合Spring Boot:
- 实际项目几乎都用
MyBatis-Spring-Boot-Starter - 自动配置,无需手动管理
SqlSession
- 实际项目几乎都用
动手做个小项目:
- 用户增删改查(CRUD)
- 分页查询
- 事务管理(如转账操作)
避坑指南:
- 不要在循环里调用数据库(N+1问题)
- SQL尽量用
#{}而不是${}(防注入) - 生产环境务必关闭
STDOUT_LOGGING
结语
我当初学MyBatis时,也卡在配置文件和命名空间上。但只要你跟着这个教程一步步敲代码,一定能跑通。记住:所有复杂的技术,拆解后都是简单的步骤。
现在,你已经跨过了第一道门槛。接下来,去 GitHub 上找几个开源项目(搜索 mybatis example),看看别人是怎么用的。实践,才是最好的老师。
祝你编码愉快!如果这篇教程帮到了你,欢迎在评论区留言 👋

评论 0