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

接口调不通
2025-12-13 19:15
阅读 1641

作者:一位开源项目维护者 & 后端讲师
写作初衷:我在GitHub上维护过多个Java后端项目,也带过不少刚毕业的同学。很多人在学完Java基础后,面对数据库操作一脸茫然——尤其是看到XML配置、SQL映射这些术语就头疼。今天我就用最“接地气”的方式,手把手带你入门MyBatis,哪怕你连“持久层”是啥都不知道也没关系!


为什么我要写这篇教程?

我当初学Java的时候,也是从JDBC开始的——手动加载驱动、写Connection、处理ResultSet……不仅代码冗长,还特别容易出错。后来接触到MyBatis,才发现原来操作数据库可以这么优雅!但可惜的是,很多教程一上来就讲“ORM”、“映射器”、“动态SQL”,完全不考虑零基础读者的感受。

所以,这篇教程不堆术语、不讲理论,只用一个简单案例,带你从零搭建一个能真正运行的MyBatis程序。顺便澄清一点:虽然标题里提到了 Go前端,但它们和MyBatis本身无关——我会在文末说明它们在实际开发中的位置,以及为什么你在写简历时要突出MyBatis技能。


一、MyBatis是什么?它能帮你做什么?

简单说:MyBatis 是一个帮你把 Java 对象和数据库记录“自动对接”的工具。

想象一下,你想把用户信息存到数据库里:

  • 没有MyBatis:你得手写几十行PreparedStatementResultSet代码。
  • 有了MyBatis:你只需要写一句SQL,剩下的交给它处理。

💡 类比理解:MyBatis 就像是你和数据库之间的“翻译官”。你说Java语言,数据库说SQL语言,它负责两边沟通。


二、环境准备(5分钟搞定)

我们不需要复杂的IDE,只要以下工具:

工具 版本要求 说明
JDK 8 或以上 Java开发基础
Maven 3.6+ 项目依赖管理(也可用Gradle,本文用Maven)
MySQL 5.7+ 或 8.0 数据库(可用H2等内存数据库替代)
IDE IntelliJ IDEA / VS Code 推荐IDEA,对Java支持更好

步骤1:创建Maven项目

打开终端,执行:

mvn archetype:generate -DgroupId=com.example -DartifactId=mybatis-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

进入项目目录:

cd mybatis-demo

步骤2:添加依赖(编辑 pom.xml

<dependencies> 标签内加入:

<!-- MyBatis 核心 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.13</version>
</dependency>

<!-- MySQL 驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.33</version>
</dependency>

<!-- 单元测试(可选) -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

✅ 提示:如果你没有MySQL,可以用H2内存数据库(适合学习),只需替换驱动为 com.h2database:h2

步骤3:创建数据库和表

假设你已安装MySQL,登录后执行:

CREATE DATABASE mybatis_demo;
USE mybatis_demo;

CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    email VARCHAR(100)
);

插入一条测试数据:

INSERT INTO user (name, email) VALUES ('张三', 'zhangsan@example.com');

三、核心概念:用大白话解释

1. SqlSessionFactory:MyBatis的“总开关”

  • 它读取配置文件,创建数据库连接池。
  • 整个应用通常只需要一个实例(单例)。

2. Mapper接口 + XML/注解:你的SQL在哪里写?

  • 你可以用 XML文件 写SQL(推荐初学者)
  • 也可以直接在 Java接口方法上加注解(适合简单SQL)

3. POJO(Plain Old Java Object):就是普通的Java类

比如 User.java,用来对应数据库的 user 表。

🌰 举个栗子:
数据库有一行:id=1, name='李四'
MyBatis 会自动创建一个 User 对象:new User(1, "李四", ...)
这就是“对象-关系映射”(ORM)的核心思想。


四、实战:5步完成一个用户查询功能

目标:通过ID查询用户信息,并打印出来。

第1步:创建 User 类(POJO)

src/main/java/com/example 下新建 User.java

package com.example;

public class User {
    private int id;
    private String name;
    private String email;

    // 必须提供无参构造函数(MyBatis需要)
    public User() {}

    // 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 + "'}";
    }
}

第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="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&amp;serverTimezone=UTC"/>
        <property name="username" value="root"/>
        <property name="password" value="your_password"/> <!-- 改成你的密码 -->
      </dataSource>
    </environment>
  </environments>

  <!-- 注册 Mapper XML 文件 -->
  <mappers>
    <mapper resource="UserMapper.xml"/>
  </mappers>
</configuration>

第3步:创建 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="com.example.UserMapper">
  <select id="selectUserById" resultType="com.example.User" parameterType="int">
    SELECT id, name, email FROM user WHERE id = #{id}
  </select>
</mapper>

🔍 关键点解释:

  • namespace:必须和后面Mapper接口的全类名一致(即使我们现在不用接口)
  • id="selectUserById":这个SQL的唯一标识
  • #{id}:安全地传入参数(防止SQL注入)

第4步:编写主程序

修改 App.java(位于 src/main/java/com/example/App.java):

package com.example;

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 App {
    public static void main(String[] args) throws IOException {
        // 1. 读取配置文件
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 2. 创建 SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 3. 打开 SqlSession(代表一次数据库会话)
        try (SqlSession session = sqlSessionFactory.openSession()) {
            // 4. 执行查询:namespace + id
            User user = session.selectOne("com.example.UserMapper.selectUserById", 1);
            System.out.println(user);
        }
    }
}

第5步:运行!

在项目根目录执行:

mvn compile exec:java -Dexec.mainClass="com.example.App"

输出应为:

User{id=1, name='张三', email='zhangsan@example.com'}

🎉 恭喜!你已经成功运行了第一个MyBatis程序!


五、新手常见问题解答(FAQ)

Q1:为什么报 ClassNotFoundException

  • 检查 pom.xml 是否正确添加了MySQL驱动。
  • 如果用MySQL 8.0,驱动类名是 com.mysql.cj.jdbc.Driver(不是老版本的 com.mysql.jdbc.Driver)。

Q2:SQL写错了怎么办?

MyBatis会在控制台打印完整的SQL语句(开启日志后更清晰)。建议在开发时开启日志:

mybatis-config.xml<configuration> 内加入:

<settings>
  <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

Q3:能不能不用XML,直接用注解?

可以!但仅限简单SQL。例如:

public interface UserMapper {
    @Select("SELECT * FROM user WHERE id = #{id}")
    User selectUserById(int id);
}

然后在 mybatis-config.xml 中注册接口:

<mappers>
  <mapper class="com.example.UserMapper"/>
</mappers>

⚠️ 注意:复杂SQL(如多表关联、动态WHERE)还是推荐用XML。

Q4:和 Hibernate 有什么区别?

特性 MyBatis Hibernate
SQL控制 完全由你写SQL 自动生成SQL
学习曲线 低(适合SQL熟悉者)
灵活性 低(抽象层厚)
性能调优 容易(SQL可见) 较难

国内互联网公司(如阿里、腾讯)普遍使用MyBatis,因为它更贴近SQL,便于优化。


六、关于 Go、前端 和 简历 的说明

你可能会疑惑:标题里提到 Go前端,但全文没出现?

  • Go:是一种后端编程语言(类似Java),和MyBatis无关。如果你未来想转Go开发,会用到GORM等ORM框架,但那是另一个生态。
  • 前端:指网页、App界面,通常用JavaScript/Vue/React开发。MyBatis属于后端技术,前端通过API(如RESTful接口)和后端交互。
  • 简历:如果你正在找工作,在“技术栈”一栏写上 MyBatis 非常加分!尤其应届生,掌握一个主流持久层框架,远比只会JDBC强得多。建议这样写:

    项目经验:使用 Spring Boot + MyBatis 开发用户管理系统,实现CRUD操作,QPS达1000+


七、下一步学习建议

  1. 进阶MyBatis

    • 学习 resultMap(处理复杂映射)
    • 掌握动态SQL(<if>, <foreach>
    • 使用 @Param 传递多个参数
  2. 结合Spring Boot

    • 实际项目几乎都用 MyBatis-Spring-Boot-Starter
    • 自动配置,无需手动管理 SqlSession
  3. 动手做个小项目

    • 用户增删改查(CRUD)
    • 分页查询
    • 事务管理(如转账操作)
  4. 避坑指南

    • 不要在循环里调用数据库(N+1问题)
    • SQL尽量用 #{} 而不是 ${}(防注入)
    • 生产环境务必关闭 STDOUT_LOGGING

结语

我当初学MyBatis时,也卡在配置文件和命名空间上。但只要你跟着这个教程一步步敲代码,一定能跑通。记住:所有复杂的技术,拆解后都是简单的步骤

现在,你已经跨过了第一道门槛。接下来,去 GitHub 上找几个开源项目(搜索 mybatis example),看看别人是怎么用的。实践,才是最好的老师。

祝你编码愉快!如果这篇教程帮到了你,欢迎在评论区留言 👋

评论 0

最热最新
暂无评论
接口调不通Lv.1
0
影响力
0
文章
0
粉丝