MyBatis基础教程:Java持久层框架入门

何庆丰
2025-12-18 07:37
阅读 2081

作者:985毕业的全栈工程师,掘金专栏作者
写作初衷:很多初学者一听到“持久层”“ORM”就望而却步,其实没那么难!我当初学的时候也踩过坑,今天就用最直白的方式带你上手 MyBatis。


为什么你需要 MyBatis?

在 Java 开发中,后端程序经常需要和数据库打交道——比如用户注册、商品查询、订单保存等。这个“和数据库交互”的过程,在专业术语中叫做 数据持久化

你可能会问:“那我直接用 JDBC 不行吗?”
当然可以!但 JDBC 写起来很繁琐:要手动管理连接、写 SQL、处理 ResultSet、还要防止内存泄漏……对于初学者来说,这简直是“劝退三连”。

于是,MyBatis 应运而生。它是一个轻量级的 Java 持久层框架,帮你自动完成大部分重复工作,让你专注于写 SQL 和业务逻辑。

技术选型对比:MyBatis vs Hibernate vs JDBC

方案 学习成本 灵活性 SQL 控制力 适合场景
JDBC 完全控制 小项目或学习原理
Hibernate 中高 几乎无(自动生成) 快速开发、领域模型复杂
MyBatis 完全控制 大多数企业项目(尤其国内)

💡 我的实战经验:在国内互联网公司,MyBatis 是主流选择。因为它既简化了 JDBC 的样板代码,又保留了对 SQL 的完全掌控——这对性能调优和复杂查询至关重要。


一、环境准备:5 分钟搭建开发环境

我们将使用最简单的 Java SE + MyBatis + H2(内存数据库)来演示,无需安装 MySQL。

所需工具

  • JDK 8 或以上
  • Maven(推荐)或 Gradle
  • 任意 IDE(IntelliJ IDEA / Eclipse)

步骤 1:创建 Maven 项目

<!-- pom.xml -->
<dependencies>
    <!-- MyBatis 核心 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.13</version>
    </dependency>
    
    <!-- H2 内存数据库(免安装) -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>2.2.224</version>
    </dependency>
    
    <!-- 日志(方便看 SQL) -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.4.11</version>
    </dependency>
</dependencies>

步骤 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="org.h2.Driver"/>
        <property name="url" value="jdbc:h2:mem:testdb"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
      </dataSource>
    </environment>
  </environments>
  
  <!-- 映射文件位置 -->
  <mappers>
    <mapper resource="UserMapper.xml"/>
  </mappers>
</configuration>

✅ 小贴士:H2 数据库是纯内存的,程序一跑就自动建表,关掉就清空,非常适合学习!


二、核心概念:3 个关键角色

MyBatis 的核心非常简单,记住这 3 个东西就够了:

1. SqlSessionFactory

工厂对象,用来创建 SqlSession。整个应用只需要一个。

2. SqlSession

代表一次数据库会话,你可以用它执行 SQL、提交事务等。

3. Mapper(映射器)

这是你写 SQL 的地方!通常是一个 XML 文件(也可以用注解),把 Java 方法和 SQL 绑定在一起。

🤔 我当初学的时候总搞不清 Mapper 是啥——其实就是“方法 ↔ SQL”的映射表!


三、实战项目:实现一个用户管理系统

我们来做一个最简单的功能:新增用户 + 查询所有用户

步骤 1:创建 User 实体类

// src/main/java/com/example/User.java
public class User {
    private Long id;
    private String name;
    private String email;

    // 构造函数、getter/setter 省略(可用 Lombok 简化)
}

步骤 2:编写 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="UserMapper">
  
  <!-- 插入用户 -->
  <insert id="insertUser" parameterType="com.example.User">
    INSERT INTO users (name, email) VALUES (#{name}, #{email})
  </insert>

  <!-- 查询所有用户 -->
  <select id="findAllUsers" resultType="com.example.User">
    SELECT id, name, email FROM users
  </select>
  
</mapper>

🔍 注意:

  • namespace 必须唯一,通常用类名
  • #{name} 是 MyBatis 的占位符,会自动防 SQL 注入!

步骤 3:初始化数据库表(H2 自动执行)

mybatis-config.xml 同级目录下创建 schema.sql(非必须,但推荐):

CREATE TABLE IF NOT EXISTS users (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100)
);

然后在代码中加载:

// 初始化 H2 表结构(仅演示用)
try (Connection conn = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", "")) {
    Statement stmt = conn.createStatement();
    stmt.execute("CREATE TABLE IF NOT EXISTS users (id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100))");
}

步骤 4:编写主程序

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.InputStream;
import java.util.List;

public class Main {
    public static void main(String[] args) throws Exception {
        // 1. 加载配置文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        
        // 2. 创建 SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
        // 3. 获取 SqlSession
        try (SqlSession session = sqlSessionFactory.openSession()) {
            
            // 4. 插入用户
            User user = new User();
            user.setName("张三");
            user.setEmail("zhangsan@example.com");
            session.insert("UserMapper.insertUser", user);
            
            // 5. 提交事务(重要!)
            session.commit();
            
            // 6. 查询所有用户
            List<User> users = session.selectList("UserMapper.findAllUsers");
            for (User u : users) {
                System.out.println("ID: " + u.getId() + ", Name: " + u.getName());
            }
        }
    }
}

⚠️ 新手常见错误:忘记 session.commit()!默认 MyBatis 不自动提交,插入/更新后必须手动 commit。


四、常见问题 & 避坑指南

Q1:为什么查不到数据?SQL 明明是对的!

原因:很可能忘了 session.commit(),或者 Mapper 的 namespace 写错了。

检查清单

  • 是否调用了 session.commit()
  • Mapper XML 的 namespace 和代码中的字符串是否一致?
  • resultType 是否写全了包名?(如 com.example.User

Q2:能不用 XML 吗?我想用注解!

当然可以!MyBatis 支持注解方式:

public interface UserMapper {
    @Insert("INSERT INTO users (name, email) VALUES (#{name}, #{email})")
    void insertUser(User user);

    @Select("SELECT * FROM users")
    List<User> findAllUsers();
}

但在实际项目中,复杂 SQL 还是推荐用 XML,更清晰、支持动态 SQL。

Q3:前端怎么和 MyBatis 对接?

注意:MyBatis 是后端技术,不直接和前端交互!

典型流程:

前端(Vue/React) → HTTP 请求 → Spring Boot Controller → Service → MyBatis → 数据库

所以你在学 MyBatis 时,暂时不用管前端,专注 Java 和数据库即可。


五、下一步学习建议

你已经掌握了 MyBatis 最核心的部分!接下来可以:

  1. 整合 Spring Boot
    使用 mybatis-spring-boot-starter,告别手动创建 SqlSessionFactory。

  2. 学习动态 SQL
    比如 <if><foreach>,实现条件查询、批量插入等。

  3. 理解 #{} 和 ${} 的区别
    #{} 是预编译(安全),${} 是字符串拼接(有注入风险)!

  4. 尝试 PageHelper 分页插件
    企业级分页必备。

📌 我的建议:不要一上来就学 Spring Boot + MyBatis,先搞懂原生 MyBatis 的工作原理,后面整合才不会“魔法感”太强。


结语

MyBatis 并不难,它只是帮你把 JDBC 的脏活累活自动化了。你依然是 SQL 的主人,这也是它在国内经久不衰的原因。

我当初学的时候,也是从一行 INSERT 开始的。只要你动手敲一遍上面的代码,你就已经超过了 50% 只看不练的人。

记住:编程没有捷径,但有正确的路径。

👋 如果你觉得这篇教程对你有帮助,欢迎关注我的掘金主页,我会持续更新《零基础学 Java》系列文章。下一期:《Spring Boot + MyBatis 整合实战》!

评论 0

最热最新
暂无评论
何庆丰Lv.1
0
影响力
0
文章
0
粉丝