零基础也能学会的 MyBatis 入门实战指南
大家好,我是开源项目维护者老张。过去几年里,我参与和维护了多个 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.xml 在 src/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,你就掌握了这种通用模式。
下一步学习建议
- 动手扩展功能:尝试实现
insertUser、updateUser,理解#{}和${}的区别(后者有 SQL 注入风险!) - 学习动态 SQL:
<if>、<foreach>等标签让你写出灵活的查询 - 整合 Spring:当项目变大,你会需要 Spring 管理 MyBatis 的生命周期
- 对比其他框架:试试 Hibernate(全自动 ORM) vs MyBatis(半自动),理解设计哲学差异
最后忠告:不要一上来就学 Spring Boot + MyBatis。先搞懂裸 MyBatis,你才能真正理解 Spring 做了什么封装。
结语
写这篇文章时,我特意避开了所有“高级概念”,只为让你迈出第一步。技术学习最难的不是理解,而是开始。
你现在拥有了一个可运行的 MyBatis 项目。接下来,改一改 SQL,加个字段,试着连真实 MySQL……每一次小改动,都是进步。
我是老张,一个喜欢写文档的开源维护者。如果你觉得这篇教程帮到了你,欢迎去 GitHub 给我的项目点个 Star(虽然本文没提具体项目 😄)。技术路上,我们一起前行。
记住:今天你能用 MyBatis 查用户,明天你就能用 Go 写链上合约,用 Trae 一键部署——因为底层逻辑,从未改变。

评论 0