MyBatis基础教程:Java持久层框架入门
一、MyBatis是什么?能做什么?

在我们学习Java编程时,经常要和数据库打交道。比如你写了一个博客系统,用户的数据(如用户名、密码)通常是要存储在数据库里的。
但问题来了:Java程序怎么操作数据库?
最原始的方式是使用JDBC(Java Database Connectivity),它允许Java代码直接调用SQL语句来查询、插入、更新数据。虽然功能强大,但JDBC的代码繁琐重复,开发效率不高。
这时候就出现了像MyBatis这样的工具 —— 它是一个 Java持久层框架,帮助我们简化数据库操作。
那么MyBatis到底能做什么呢?
- 把Java对象和数据库中的记录对应起来(例如一个User类对应一张user表)
- 可以执行SQL语句,自动把结果转换成Java对象
- 提供了更好的方式管理SQL语句,提升可维护性
- 支持连接池、事务管理等功能
换句话说,它就是帮你更方便地操作数据库!
✅ 简单说一句:MyBatis = 更容易写的数据库操作代码 + 更灵活的SQL控制能力
二、环境准备(超详细)

为了使用MyBatis,你需要准备好以下开发环境:
1. Java开发环境
- JDK 8或以上(推荐JDK 17)
- IDE:可以使用 IntelliJ IDEA 或 Eclipse(本文以IDEA为例)
2. 数据库环境
建议使用 MySQL(免费好用),安装步骤如下:
- 访问官网 https://dev.mysql.com/downloads/mysql/
- 下载适合你系统的版本并安装
- 安装后运行
mysql -u root -p登录数据库(默认账号root,密码自己设置)
📌 小提示:如果对命令行不太熟悉,也可以安装一个图形化工具,比如 Navicat 或 DBeaver 来查看和操作数据库。
3. 创建测试数据库
我们先创建一个简单的数据库和一张表用于后续练习:
-- 创建数据库 blog_db
CREATE DATABASE blog_db;
-- 切换到这个数据库
USE blog_db;
-- 创建表 user
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(100)
);
然后插入一条测试数据:
INSERT INTO user (name, email) VALUES ('张三', 'zhangsan@example.com');
三、MyBatis核心概念通俗讲解

刚开始学MyBatis会遇到几个陌生的概念,别慌,下面我用生活化的例子解释这些术语。
1. Mapper接口(映射接口)
你可以把它看作一个“请求接口”,就像点外卖的时候你要告诉服务员你要什么菜一样。
在MyBatis中,我们写一个接口,声明一些方法,告诉MyBatis:“我想查某个用户”、“我想插入一个新的用户”。
举个例子:
public interface UserMapper {
User selectUserById(int id);
}
👉 表示你要根据id查找一个用户。
2. XML文件(SQL配置文件)
这是存放具体SQL的地方。有点像是菜单,接口是点餐的内容,XML里才是具体的菜怎么做。
<!-- UserMapper.xml -->
<select id="selectUserById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
这段XML说明了上面那个 selectUserById 方法对应的SQL语句。
⚠️ 注意:
#{id}是参数占位符,不是拼接字符串,防止SQL注入resultType表示返回值类型,这里就是User类
3. Configuration 文件(配置文件)
这相当于你的餐厅介绍页,告诉顾客这家餐厅的基本信息:
- 数据库的地址、用户名、密码
- 哪些Mapper需要加载进来
<!-- mybatis-config.xml -->
<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/blog_db"/>
<property name="username" value="root"/>
<property name="password" value="your_password"/>
</dataSource>
</environment>
</environments>
<!-- 加载 Mapper 文件 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
4. SqlSession(会话)
可以理解为一次“用餐过程”。你通过这个会话去执行SQL、获取结果。
简单用法如下:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
SqlSession session = factory.openSession();
try {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user.getName());
} finally {
session.close();
}
四、从零开始实战项目:用户查询系统
现在我们来一起完成一个小项目 —— 实现一个可以通过ID查询用户的简单系统。
目标:输入用户ID,输出该用户的名字和邮箱。
步骤1:新建Maven项目
- 打开IntelliJ IDEA → New Project → Maven
- 给项目命名,例如叫 mybatis-demo
- 等待下载依赖
步骤2:添加MyBatis依赖
编辑项目的 pom.xml 文件,在 <dependencies> 标签中添加:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
✅ 注意:确保版本号正确,目前MyBatis最新稳定版是3.5.x系列。
步骤3:创建实体类 User.java
在 src/main/java 包下新建 model.User 类:
package model;
public class User {
private int id;
private String name;
private String email;
// 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 + '\'' +
'}';
}
}
步骤4:创建Mapper接口 UserMapper.java
同样在这个包下新建 mapper.UserMapper 接口:
package mapper;
import model.User;
public interface UserMapper {
User selectUserById(int id);
}
步骤5:创建Mapper XML文件 UserMapper.xml
在 resources/mapper 路径下新建 UserMapper.xml:
<?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="mapper.UserMapper">
<select id="selectUserById" resultType="model.User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
📌 注意:
namespace要与你的Mapper接口类名一致resultType指定返回的Java类路径
步骤6:创建配置文件 mybatis-config.xml
放在 resources 目录下:
<?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>
<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/blog_db?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="your_password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
步骤7:编写主程序进行测试
新建一个 App.java 文件,用来运行程序:
import model.User;
import mapper.UserMapper;
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;
public class App {
public static void main(String[] args) throws IOException {
// 加载配置文件
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(Resources.getResourceAsStream("mybatis-config.xml"));
try (SqlSession session = factory.openSession()) {
// 获取Mapper接口的实现
UserMapper mapper = session.getMapper(UserMapper.class);
// 查询用户(假设我们要查id=1的用户)
User user = mapper.selectUserById(1);
if (user != null) {
System.out.println("查询结果:" + user);
} else {
System.out.println("没有找到该用户");
}
}
}
}

步骤8:运行并查看结果
点击 Run 后,你应该能看到类似输出:
查询结果:User{id=1, name='张三', email='zhangsan@example.com'}
✅ 恭喜!你完成了第一个基于MyBatis的查询功能!
五、新手常见问题解答
Q1:为什么报错说找不到驱动?
可能原因:
- MySQL驱动未加入依赖
- driver类名写错了(注意是否带 cj)
解决办法:
确认 pom.xml 中有 mysql-connector-java 的依赖,并且url和driver配置如下:
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/blog_db?useSSL=false&serverTimezone=UTC"/>
Q2:运行时报 NullPointerException,说 mapper 为 null?
这是因为 MyBatis 没有正确扫描到你的Mapper接口或者XML。
检查以下几点:
- Mapper接口的
package和 XML的namespace是否完全一致 - 在
mybatis-config.xml中是否正确引入了你的mapper文件
Q3:为什么明明数据库有数据,却查不出来?
可能原因:
- 数据库字段名和类属性不匹配(比如字段是userName而类属性是name)
- SQL语句本身有问题(建议手动在数据库中执行试试)
解决方案:
- 使用日志打印出实际执行的SQL(后面章节讲)
- 使用调试器逐步查看返回值
Q4:什么时候要用 #{},什么时候用 ${}?
#{}:安全参数占位符,推荐使用,防止SQL注入${}:直接替换SQL语句,用于动态排序等特殊场景
示例:
SELECT * FROM user ORDER BY ${columnName} -- 使用${}动态排序
六、下一步学习建议
恭喜你成功入门MyBatis啦!接下来你可以继续深入学习以下内容:
推荐学习路线:
- 🔹 插入、更新、删除操作
- 🔹 动态SQL(if、choose、foreach等)
- 🔹 注解方式代替XML(@Select、@Insert等)
- 🔹 一对多、多对一关联查询
- 🔹 与Spring集成使用(SSM框架整合)
- 🔹 缓存机制(一级缓存、二级缓存)
- 🔹 分页插件 PageHelper
- 🔹 日志集成(如Log4j、SLF4J)
总结一下

| 学习要点 | 内容 |
|---|---|
| MyBatis的作用 | 简化数据库操作,提高效率 |
| 核心组成 | Mapper接口、XML、配置文件、SqlSession |
| 实战目标 | 编写一个基于MyBatis的简单查询系统 |
| 关键技术点 | 数据库连接、SQL执行、对象映射 |
| 后续进阶方向 | 插入更新、动态SQL、整合Spring |
如果你觉得这篇教程对你有用,请动手跟着做一遍!实践是最好的老师。
祝你早日成为MyBatis高手 👨💻✨

评论 0