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

在Java开发中,我们经常需要和数据库打交道。例如用户登录、商品下单、查询数据等操作,都需要从数据库中读写信息。
但是直接使用JDBC(Java Database Connectivity)来操作数据库,代码非常繁琐,且容易出错。于是出现了许多ORM框架,来简化这一过程。其中 MyBatis 就是一个非常流行的选择。
什么是ORM?
ORM(Object Relational Mapping,对象关系映射)是将 Java 对象与数据库中的表进行映射的技术。简单地说,就是让你可以用面向对象的方式去操作数据库,而不需要频繁写 SQL 语句。
MyBatis有什么特点?
- 灵活:允许你自定义 SQL。
- 轻量:不强制你完全脱离 SQL,适合对性能有要求的项目。
- 易学易用:学习门槛低,适合初学者入门 ORM 框架。
环境准备:搭建你的第一个MyBatis环境

为了顺利学习 MyBatis,你需要先准备好以下开发环境:
1. 安装 JDK 和 Maven
- JDK:建议使用 JDK 8 或更高版本。
- Maven:用来管理项目的依赖(也就是需要用到的库文件)。
你可以通过命令行检查是否安装成功:
java -version
mvn -v
2. 创建Maven项目
使用IDEA或者手动创建一个 Maven 项目,在 pom.xml 中添加 MyBatis 的依赖和 MySQL 驱动依赖:
<dependencies>
<!-- MyBatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
</dependencies>
3. 准备MySQL数据库
假设我们创建了一个名为 test_db 的数据库,并新建了一张用户表:
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(100)
);
插入几条测试数据:
INSERT INTO user (name, email) VALUES ('张三', 'zhangsan@example.com');
INSERT INTO user (name, email) VALUES ('李四', 'lisi@example.com');
核心概念:理解MyBatis的关键术语

要使用 MyBatis,你需要先了解几个基本概念:
1. SqlSessionFactory
这是 MyBatis 的核心工厂类,用来创建一个数据库连接会话。通常在整个应用程序中只初始化一次。
2. SqlSession
它代表一次数据库连接,可以执行SQL语句、提交事务、回滚事务等。
3. Mapper接口 + XML映射文件
这是 MyBatis 的精华所在。你可以写一个接口,比如 UserMapper,然后通过 XML 文件告诉 MyBatis 如何执行对应的 SQL。
示例:接口与映射文件配对
接口文件 UserMapper.java:
public interface UserMapper {
List<User> getAllUsers();
}
XML文件 UserMapper.xml:
<mapper namespace="com.example.mapper.UserMapper">
<select id="getAllUsers" resultType="com.example.model.User">
SELECT * FROM user;
</select>
</mapper>
这样你就可以通过调用 userMapper.getAllUsers() 来获取所有用户的数据,而不用每次都写JDBC代码!
4. resultMap 和 resultType
这两个是用来指定 SQL 查询结果应该转换成哪种 Java 类型。
resultType:如果数据库字段和Java类属性名一致时使用。resultMap:当不一致时,可以自己定义映射关系。
实战项目:实现一个简单的“用户管理系统”
我们现在做一个小项目:查询并输出所有用户的信息。
第一步:创建 User 实体类
package com.example.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 + '\'' +
'}';
}
}
第二步:创建 UserMapper 接口
package com.example.mapper;
import java.util.List;
import com.example.model.User;
public interface UserMapper {
List<User> getAllUsers();
}
第三步:编写 UserMapper.xml 文件
放在 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.mapper.UserMapper">
<select id="getAllUsers" resultType="com.example.model.User">
SELECT * FROM user
</select>
</mapper>
第四步:配置 mybatis-config.xml
这是 MyBatis 的全局配置文件,放在 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="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
第五步:主程序中使用 MyBatis 查询数据
package com.example;
import java.io.InputStream;
import java.util.List;
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;
public class App {
public static void main(String[] args) {
// 1. 加载MyBatis配置文件
InputStream inputStream = App.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
// 2. 创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 3. 打开SqlSession
try (SqlSession session = sqlSessionFactory.openSession()) {
// 4. 获取Mapper接口
UserMapper mapper = session.getMapper(UserMapper.class);
// 5. 调用方法查询数据
List<User> users = mapper.getAllUsers();
// 6. 输出结果
for (User user : users) {
System.out.println(user);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行后你会看到控制台输出类似这样的信息:
User{id=1, name='张三', email='zhangsan@example.com'}
User{id=2, name='李四', email='lisi@example.com'}
恭喜你!你已经完成了第一个 MyBatis 程序!
常见问题解答
Q1:为什么我运行时报错 “Invalid bound statement (not found): com.example.mapper.UserMapper.getAllUsers”
答:这个错误通常是由于没有正确加载 XML 文件造成的。请检查以下几点:
- XML 文件是否放到 resources 下的正确路径。
mybatis-config.xml中<mapper>是否引用了正确的 XML 文件。- XML 文件里的
namespace是否和接口的全限定名一致。
Q2:MyBatis 报错说找不到数据库驱动?
答:请确认你在 pom.xml 中已经引入了 MySQL 的驱动依赖,并确保 JDBC URL、用户名和密码都正确。
Q3:User类中的属性和表字段名不同,会不会影响查询?
答:如果你使用的是 resultType 并且字段名不一致,会导致无法自动映射。此时你应该使用 resultMap 自定义映射规则。
学习建议:下一步怎么走?
掌握以上内容后,你可以继续深入学习如下方向:
✅ 进阶知识
- 使用注解方式代替 XML(如 @Select)
- 动态SQL(if、foreach、choose等标签)
- 多表关联查询与复杂映射
- 分页插件 PageHelper 的使用
- 事务管理与批量操作
✅ 推荐练习项目
- 学生信息管理系统
- 商品订单管理系统
- 博客文章管理系统
✅ 学习资源推荐
- MyBatis官网
- 《MyBatis从入门到精通》书籍
- B站上搜索“MyBatis 入门”相关视频教程
通过本教程,你应该已经掌握了 MyBatis 的基础使用方式。记住,实践是最好的老师,多动手、多写代码,你会发现 MyBatis 并不像想象中那么难。希望你能在 Java 持久层的路上越走越远!

评论 0