零基础也能学会的 MyBatis 入门实战指南

知识库管理员
2026-06-01 21:43
阅读 3466

大家好,我是开源项目维护者老张。过去几年里,我参与和维护了多个 Java 后端项目,也写过不少技术文档。最近有不少刚入门的朋友问我:“MyBatis 到底该怎么学?网上教程要么太深,要么直接上 Spring Boot,让人摸不着头脑。”这让我想起自己当初学 MyBatis 的时候——文档混乱、概念抽象、连个像样的“Hello World”都跑不起来。

所以今天,我决定从零开始,手把手带你搭建一个最简单的 MyBatis 项目。不需要 Spring,不需要复杂配置,只要你会写基础 Java 和 SQL,就能跟着做出来

你可能会问:标题里提到的区块链、Trae、Go 跟 MyBatis 有什么关系?别急,我会在文末解释它们为什么出现在这里——不是为了强行凑关键词,而是想告诉你:技术是相通的,学好基础,未来无论转向 Go、Rust 还是开发区块链应用,底层逻辑都一脉相承


为什么选择 MyBatis?

MyBatis 是一个 Java 持久层框架。简单说,它帮你把 Java 对象和数据库记录“连起来”。

想象一下:你想把用户信息存进数据库,传统 JDBC 写法要手动拼 SQL、处理连接、关闭资源……代码又长又容易出错。而 MyBatis 让你只需关注“我要查什么数据”,剩下的交给它自动完成。

我当初第一次用 MyBatis,从写 JDBC 到写出第一个查询只用了 20 分钟——那种“原来可以这么简单”的震撼,至今难忘。


开发环境准备(超详细步骤)

你需要安装什么?

工具 版本建议 说明
JDK 8 或 11 Java 开发必备
Maven 3.6+ 项目依赖管理
IDE IntelliJ IDEA / Eclipse 推荐 IDEA,对新手更友好
数据库 MySQL 5.7+ / H2(内存数据库) 本文使用 H2,免安装

避坑提示:很多新手卡在环境配置上。如果你还没装 JDK 或 Maven,先去官网下载安装,再继续。不要跳过这一步!

创建项目结构

我们不用 Spring Boot,直接用 Maven 创建一个干净的 Java 项目:

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

进入项目目录:

cd mybatis-demo

编辑 pom.xml,添加 MyBatis 和 H2 数据库依赖:

<dependencies>
    <!-- MyBatis 核心 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.13</version>
    </dependency>
    
    <!-- H2 内存数据库(无需安装 MySQL) -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>2.2.224</version>
    </dependency>
    
    <!-- 单元测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

为什么用 H2? 因为它是个纯 Java 写的内存数据库,启动快、零配置,特别适合学习。等你熟悉后再换 MySQL 完全没问题。


MyBatis 的核心概念(用大白话讲)

1. SqlSessionFactory:数据库的“总开关”

你可以把它想象成工厂——每次你要操作数据库,就从这个工厂“生产”一个 SqlSession(会话)。

2. SqlSession:一次数据库对话

就像你和数据库聊天:你说“查用户”,它给你返回结果。用完记得关闭(就像挂电话)。

3. Mapper 接口 + XML 映射文件:你的 SQL 命令清单

  • Mapper 接口:定义方法,比如 User selectUser(int id)
  • XML 文件:写具体 SQL,比如 <select id="selectUser">SELECT * FROM users WHERE id = #{id}</select>

关键点:MyBatis 通过接口方法名自动匹配 XML 中的 SQL 语句 ID。这就是“约定优于配置”。


实战:从零搭建一个用户管理系统

我们将实现一个最简单的功能:根据 ID 查询用户信息

第一步:创建数据库表

src/main/resources 下创建 schema.sql

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

INSERT INTO users (id, name, email) VALUES
(1, '张三', 'zhangsan@example.com'),
(2, '李四', 'lisi@example.com');

第二步:编写 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>

注意:jdbc:h2:mem:testdb 表示使用内存数据库,程序一关数据就没了——但学习够用!

第三步:创建 Java 实体类

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

第四步:编写 Mapper 接口

创建 UserMapper.java

package com.example;

public interface UserMapper {
    User selectUser(int id);
}

第五步:编写 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="selectUser" resultType="com.example.User">
    SELECT * FROM users WHERE id = #{id}
  </select>
</mapper>

重点解释

  • namespace 必须和接口全路径一致
  • id="selectUser" 必须和接口方法名一致
  • #{id} 是安全的参数占位符(防 SQL 注入)

第六步:初始化数据库并运行测试

src/test/java/com/example 下创建 MyBatisTest.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 org.h2.tools.RunScript;
import org.junit.BeforeClass;
import org.junit.Test;

import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;

public class MyBatisTest {
    private static SqlSessionFactory sqlSessionFactory;

    @BeforeClass
    public static void setUp() throws Exception {
        // 1. 初始化 H2 数据库
        Connection conn = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", "");
        RunScript.execute(conn, Resources.getResourceAsReader("schema.sql"));
        conn.close();

        // 2. 创建 MyBatis 工厂
        Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        reader.close();
    }

    @Test
    public void testSelectUser() {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.selectUser(1);
            System.out.println(user); // 输出:User{id=1, name='张三', email='zhangsan@example.com'}
        }
    }
}

运行测试:

mvn test

如果看到控制台输出用户信息,恭喜你!MyBatis 第一个程序跑通了!


新手常见问题解答

Q1:为什么必须写无参构造函数?

MyBatis 通过反射创建对象,如果没有无参构造,会报 InstantiationException

Q2:XML 文件放错位置怎么办?

确保 UserMapper.xmlsrc/main/resources 下,并且 mybatis-config.xml 中的 <mapper resource="..."/> 路径正确。

Q3:如何打印 SQL 日志?

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

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

这样所有 SQL 都会打印到控制台,方便调试。

Q4:能不用 XML 吗?

可以!MyBatis 支持注解方式:

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

复杂 SQL(如多表关联)还是推荐 XML,更清晰、易维护。


关于区块链、Trae 和 Go 的一点思考

你可能纳闷:这篇讲 Java 的文章,为何提到区块链、Trae、Go?

其实我想说的是:无论你未来做什么,数据持久化都是绕不开的环节

  • 如果你转去做 区块链开发,智能合约的状态也需要存储,底层往往还是数据库。
  • 如果你用 Go 语言 写后端(比如用 GORM),你会发现 ORM 思想和 MyBatis 高度相似。
  • Trae(一个新兴的云原生开发工具)虽然简化了部署,但你的业务逻辑仍需和数据库打交道。

我维护过用 Go 写的区块链节点项目,里面同样有“对象-数据库映射”的模块。学好 MyBatis,你就掌握了这种通用模式。


下一步学习建议

  1. 动手扩展功能:尝试实现 insertUserupdateUser,理解 #{}${} 的区别(后者有 SQL 注入风险!)
  2. 学习动态 SQL<if><foreach> 等标签让你写出灵活的查询
  3. 整合 Spring:当项目变大,你会需要 Spring 管理 MyBatis 的生命周期
  4. 对比其他框架:试试 Hibernate(全自动 ORM) vs MyBatis(半自动),理解设计哲学差异

最后忠告:不要一上来就学 Spring Boot + MyBatis。先搞懂裸 MyBatis,你才能真正理解 Spring 做了什么封装。


结语

写这篇文章时,我特意避开了所有“高级概念”,只为让你迈出第一步。技术学习最难的不是理解,而是开始

你现在拥有了一个可运行的 MyBatis 项目。接下来,改一改 SQL,加个字段,试着连真实 MySQL……每一次小改动,都是进步。

我是老张,一个喜欢写文档的开源维护者。如果你觉得这篇教程帮到了你,欢迎去 GitHub 给我的项目点个 Star(虽然本文没提具体项目 😄)。技术路上,我们一起前行。

记住:今天你能用 MyBatis 查用户,明天你就能用 Go 写链上合约,用 Trae 一键部署——因为底层逻辑,从未改变。

评论 0

最热最新
暂无评论
知识库管理员Lv.1
0
影响力
0
文章
0
粉丝