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

在开发一个Java应用程序时,我们经常需要与数据库打交道。比如注册用户、查询订单、更新个人信息等操作,都需要访问数据库。
传统的做法是使用JDBC(Java Database Connectivity)来直接操作数据库,这虽然可行,但写起来很繁琐,而且容易出错。为了解决这个问题,市面上出现了很多“持久层框架”,它们可以帮助我们更高效、更安全地进行数据库操作。
MyBatis就是一个这样的框架。它并不是完全隐藏SQL语句,而是让程序员可以更方便地编写和管理SQL,同时减少重复代码。它特别适合那些希望控制SQL语句结构,又不想手写太多JDBC代码的人。
简单来说:
- MyBatis是一个轻量级的Java ORM框架(对象关系映射)
- 它帮助我们将Java对象与数据库中的表记录相互转换
- 它简化了对数据库的操作,提高了开发效率
二、环境准备:搭建开发环境


1. 开发工具准备
我们需要以下开发工具:
- Java JDK 1.8及以上
- Maven(用于项目依赖管理)
- 数据库(如MySQL、PostgreSQL等)
- IDE(推荐IntelliJ IDEA或Eclipse)
本文以MySQL数据库为例。
2. 创建一个Maven项目
如果你使用的是IDEA,可以这样创建项目:
- 打开IDEA → File → New → Project
- 选择 Maven
- 输入Group Id(例如 com.example)
- 输入Artifact Id(例如 mybatis-demo)
- 点击Finish完成创建
3. 引入MyBatis依赖
打开 pom.xml 文件,在 <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>
<!-- 日志支持 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
注意:你可以到官网查找最新版本号。
4. 配置数据库连接信息
在资源目录下创建 resources/mybatis-config.xml 文件,这是MyBatis的核心配置文件:
<?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>
替换其中的数据库地址、用户名、密码为你本地的设置。
5. 初始化数据库表
我们新建一个简单的用户表用于测试:
CREATE DATABASE test_db;
USE test_db;
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的关键要素

1. SqlSessionFactory 和 SqlSession:MyBatis工作的起点
MyBatis的工作流程如下:
- 通过读取配置文件得到一个
SqlSessionFactory - 由它创建一个
SqlSession实例 - 使用这个实例执行SQL语句并获取结果
示例代码:加载配置并打开会话
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 MyBatisDemo {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
// 使用session执行SQL
}
}
}
2. Mapper接口与XML映射文件:实现Java对象与数据库字段的对应
我们先创建一个Java类:
public class User {
private int id;
private String name;
private String email;
// getter/setter略
}
再创建一个接口 UserMapper.java:
public interface UserMapper {
User selectUser(int id);
}
然后在资源目录下创建映射文件 resources/mappers/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="UserMapper">
<select id="selectUser" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
这段代码的意思是:
- 查询用户信息
- 使用参数
#{id}构造SQL语句 - 将结果自动映射到
User类的对象上
3. 使用Mapper接口调用SQL方法
修改主程序:
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUser(1);
System.out.println("用户名称:" + user.getName());
}
运行后应该输出:
用户名称:张三
四、实战项目:跟着教程一步步完成一个简单项目

目标功能:
我们来实现一个简单的用户信息管理系统,包含以下功能:
- 查询所有用户
- 新增用户
- 修改用户
- 删除用户
1. 添加更多方法到UserMapper接口
public interface UserMapper {
User selectUser(int id);
List<User> getAllUsers();
int insertUser(User user);
int updateUser(User user);
int deleteUser(int id);
}
2. 在XML文件中定义SQL
修改 UserMapper.xml:
<select id="getAllUsers" resultType="User">
SELECT * FROM user
</select>
<insert id="insertUser" parameterType="User">
INSERT INTO user(name, email) VALUES(#{name}, #{email})
</insert>
<update id="updateUser" parameterType="User">
UPDATE user SET name=#{name}, email=#{email} WHERE id=#{id}
</update>
<delete id="deleteUser">
DELETE FROM user WHERE id=#{id}
</delete>
3. 编写完整的测试类
public class TestMyBatis {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession(true)) {
UserMapper mapper = session.getMapper(UserMapper.class);
// 查询所有用户
for (User user : mapper.getAllUsers()) {
System.out.println(user.getName() + ", " + user.getEmail());
}
// 插入用户
User newUser = new User();
newUser.setName("李四");
newUser.setEmail("lisi@example.com");
mapper.insertUser(newUser);
// 更新用户
newUser.setName("李四更新");
mapper.updateUser(newUser);
// 删除用户
mapper.deleteUser(newUser.getId());
}
}
}
这样我们就完成了一个完整的小型CRUD系统!
五、常见问题解答(FAQ)
Q1:为什么我运行时报错 “Cannot find class User”?
答:确保你在MyBatis配置文件或XML文件中正确引入了 User 类的位置。你可以在配置文件中添加包扫描:
<typeAliases>
<package name="com.example.model"/>
</typeAliases>
或将 resultType="User" 改为完整的包路径,如:
resultType="com.example.model.User"
Q2:报错“无效的SQL语句”或者列名不对?
答:检查你的SQL语句是否和表字段一致,尤其是字段名是否拼写错误。也可以开启MyBatis的日志打印功能,查看实际执行的SQL语句。
Q3:事务提交失败怎么办?
答:默认情况下MyBatis不会自动提交事务,除非你设置了:
try (SqlSession session = sqlSessionFactory.openSession(true)) { ... }
true 表示自动提交。
如果想手动控制提交,则去掉参数,并显式调用:
session.commit();
六、学习建议:接下来该学什么?
恭喜你已经掌握了MyBatis的基础用法!下面是一些建议继续深入学习的方向:
✅ 学习Spring整合MyBatis
MyBatis单独使用虽好,但在企业级项目中通常要与 Spring框架 结合使用,利用Spring管理Bean生命周期。
✅ 掌握动态SQL语法
MyBatis的强大之处在于它的动态SQL能力,你可以使用 <if>、<choose>、<foreach> 等标签构建复杂查询条件。
✅ 学习延迟加载与缓存机制
MyBatis提供了二级缓存和延迟加载等功能,这对提高系统性能非常有帮助。
✅ 学习使用注解代替XML
除了使用XML文件,你还可以使用Java注解方式来编写SQL,更加简洁直观:
@Select("SELECT * FROM user WHERE id = #{id}")
User selectUser(int id);
总结
本教程从零开始介绍了MyBatis的基本使用,包括环境搭建、核心概念讲解、项目实战以及新手常见问题。希望你能通过动手实践快速上手这项技术,并逐步掌握其精髓。记住,编程最重要的是多写代码、勤加练习!
如果你是初学者,建议一边看教程一边敲代码,亲手运行每一段示例,遇到问题随时查阅文档或搜索引擎。坚持下来,你也能成为熟练使用MyBatis的Java开发者!
作者:一名有着多年教学与实战经验的Java后端讲师

评论 0