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

你是否曾经为如何让Java程序与数据库打交道而感到困惑?是不是觉得直接写JDBC代码又繁琐又容易出错?别担心,MyBatis就是来帮助你的!
MyBatis 是一个轻量级的 Java持久层框架,它封装了我们操作数据库时重复的工作,比如创建连接、执行SQL语句、处理结果集等等。但与Hibernate这样的全自动ORM框架不同,MyBatis采用的是 半自动映射策略,也就是说——你可以灵活地控制SQL的编写和优化。
使用场景举例:
- Web项目中需要对数据进行增删改查
- 需要自定义复杂的查询逻辑
- 希望在保留SQL灵活性的同时提高开发效率
简单来说:如果你正在开发一个需要用 Java 连接数据库的项目,并希望减少底层操作带来的麻烦,那么 MyBatis 会是一个非常适合的选择。
二、环境准备:搭建第一个MyBatis开发环境

为了顺利开始我们的学习之旅,首先要确保环境已经准备好:
第一步:安装JDK & IDE
- 安装 JDK(推荐 JDK17 或以上版本)
- 推荐使用 IntelliJ IDEA 作为开发工具(社区版即可)
第二步:添加Maven依赖
如果使用 Maven 项目,只需在 pom.xml 中加入如下依赖:
<!-- MyBatis 核心库 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- JDBC驱动,以MySQL为例 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
小贴士:如果你不熟悉Maven,请先了解它的基本用法,它是现代Java项目不可或缺的构建工具。
第三步:创建测试数据库和表
创建一个简单的数据库 test_db 和一张用户表 users:
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(100)
);
三、核心概念:MyBatis的关键术语解释

学好任何一个框架,理解其关键概念是第一步。让我们从最基础的几个点开始介绍:
1. SqlSessionFactoryBuilder —— 构建工厂对象的工具类
这是用于创建 SqlSessionFactory 的构建器类,通常只用一次。
2. SqlSessionFactory —— 数据库工厂
就像工厂一样,用来生产数据库会话(SqlSession)。
3. SqlSession —— 数据库会话
可以理解为我们与数据库交互的一个“会话窗口”,所有数据库操作都通过它完成。
4. Mapper接口 + XML文件 —— SQL的管理和绑定
Mapper是一个接口,用于定义我们要执行哪些数据库方法,XML文件中则定义具体SQL语句,并与接口绑定。
示例说明:
假设我们想要查询所有用户信息,我们需要:
- 编写一个名为
UserMapper的接口 - 编写一个对应的 XML 文件定义查询语句
这样设计的好处是:接口定义行为(方法),XML描述实现(SQL)。
四、实战项目:一步步完成一个简单的CRUD应用
我们将通过一个实战小项目掌握MyBatis的核心操作:实现对用户信息的增删改查功能。
Step 1: 准备实体类 User.java
创建一个代表用户的Java类,用于存储数据。
public class User {
private Integer id;
private String name;
private String email;
// Getters and Setters
}
Step 2: 创建Mapper接口 UserMapper.java
import java.util.List;
public interface UserMapper {
List<User> getAllUsers(); // 获取所有用户
User getUserById(Integer id); // 按ID查询用户
void insertUser(User user); // 插入新用户
void updateUser(User user); // 更新用户信息
void deleteUserById(Integer id); // 删除用户
}
Step 3: 创建Mapper XML文件 UserMapper.xml
将该文件放在 resources/mappers/ 目录下:
<?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.mapper.UserMapper">
<!-- 查询所有用户 -->
<select id="getAllUsers" resultType="com.example.model.User">
SELECT * FROM users
</select>
<!-- 按ID查询 -->
<select id="getUserById" parameterType="int" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
<!-- 插入用户 -->
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
<!-- 更新用户 -->
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users SET name=#{name}, email=#{email} WHERE id=#{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUserById" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
Step 4: 配置MyBatis配置文件 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/test_db?useSSL=false&serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="your_password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
</configuration>
Step 5: 编写主程序测试MyBatis功能 TestMain.java
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 com.example.mapper.UserMapper;
import com.example.model.User;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class TestMain {
public static void main(String[] args) throws IOException {
// 加载MyBatis配置
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
// 测试查询全部
List<User> users = mapper.getAllUsers();
System.out.println("当前用户列表:");
for (User u : users) {
System.out.println(u.getName() + " - " + u.getEmail());
}
// 添加一个用户
User newUser = new User();
newUser.setName("张三");
newUser.setEmail("zhangsan@example.com");
mapper.insertUser(newUser);
session.commit();
// 打印新增结果
System.out.println("\n新增后:");
users = mapper.getAllUsers();
for (User u : users) {
System.out.println(u.getName() + " - " + u.getEmail());
}
}
}
}

五、常见问题解答

以下是新手常见的几个问题及解决办法:
❓ Q1:出现 “Invalid bound statement not found” 异常怎么办?
🔍 原因:MyBatis找不到对应的SQL语句,可能是因为命名空间(namespace)或SQL ID不匹配。
✅ 解决方案:
- 确保 XML 中的
<mapper>的namespace与 Mapper 接口类路径一致。 - 确认 SQL 标签如
<select>的id与接口方法名相同。 - 确认 XML 文件被正确加载到配置中。
❓ Q2:无法获取数据库连接怎么办?
🔍 原因:可能是数据库配置错误、驱动未导入或网络异常。
✅ 解决方案:
- 检查
mybatis-config.xml中的 driver、url、用户名和密码是否正确。 - 确保 MySQL 服务运行正常,且端口 3306 可访问。
- 如果用的是远程数据库,确认防火墙设置允许连接。
❓ Q3:插入记录后,主键字段没有返回?
🔍 MyBatis默认不会自动设置生成的主键值。
✅ 解决方案:
- 在
<insert>标签中增加useGeneratedKeys="true"以及指定keyProperty="id"属性:
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
六、学习建议:下一步怎么走?
恭喜你完成了MyBatis的第一个练习!接下来你可以尝试以下几个方向继续提升:
✔️ 学习动态SQL
MyBatis支持条件判断、循环等动态生成SQL的能力,如 <if>、<foreach> 等标签。
✔️ 集成Spring Boot
学会如何在实际Web项目中整合Spring Boot和MyBatis,能更好地应用于真实开发环境。
✔️ 学习MyBatis注解方式
除了XML方式,也可以使用纯Java注解来写SQL,更简洁也更适合小项目。
✔️ 练手项目推荐
试着做一个“员工管理系统”或者“博客系统”,完整练习增删改查+分页功能。
到这里,你就掌握了MyBatis的基础知识和初步实践能力。记住一句话:
“编程不是靠记笔记学会的,而是靠多敲代码练出来的。”
继续动手写吧,你会越来越熟练的!

评论 0