MyBatis 是什么?为什么 Java 新手都应该学一学

Prompt造梦师
2025-12-21 06:57
阅读 2474

大家好,我是掘金上常写技术教程的全栈工程师,985科班出身,带过不少零基础学员。今天这篇《MyBatis 基础教程:Java 持久层框架入门》,就是专为完全没接触过后端数据库操作的新手准备的。

我当初学 Java 的时候,最头疼的就是怎么把程序里的数据存到数据库里。用原生 JDBC 写一堆 ConnectionPreparedStatementResultSet,不仅代码冗长,还容易出错。后来接触到 MyBatis,才发现原来操作数据库可以这么简洁!所以今天我想带你从零开始,轻松入门这个超实用的 Java 持久层框架。

小提示:虽然本文讲的是 Java 技术,但如果你未来想转 Go(比如用 GORM),或者把项目放到 GitHub 上展示能力、优化简历,掌握 MyBatis 依然是非常有价值的起点——它能帮你理解“对象-关系映射”这一通用编程思想。


一、MyBatis 到底是干什么的?

简单说:MyBatis 是一个帮 Java 程序和数据库“对话”的工具

想象你写了一个用户注册功能,用户填了用户名和密码,你想把这些信息存进 MySQL 数据库。没有 MyBatis 时,你需要:

  1. 手动加载数据库驱动
  2. 创建连接
  3. 拼接 SQL 字符串(比如 "INSERT INTO user(name, pwd) VALUES (?, ?)"
  4. 设置参数
  5. 执行
  6. 关闭连接
  7. 处理异常……

而 MyBatis 帮你自动化了大部分重复工作。你只需要:

  • 定义一个 Java 类(比如 User
  • 写一条 SQL(在 XML 或注解里)
  • 调用一个方法

剩下的,MyBatis 全包了!


二、环境准备:5 分钟搭好开发环境

我们用最主流的组合:IntelliJ IDEA + Maven + MySQL + MyBatis

1. 安装必备软件

工具 作用 是否必需
JDK 8+ Java 运行环境 ✅ 必需
IntelliJ IDEA 开发 IDE ✅ 推荐(也可用 Eclipse)
MySQL 5.7+ 数据库 ✅ 必需
Maven 项目依赖管理 ✅ 必需

💡 如果你还没装 MySQL,可以用 Docker 一行命令启动
docker run --name mysql-demo -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:8

2. 创建 Maven 项目

打开 IDEA → New Project → Maven → 不选模板 → 输入 GroupId(如 com.example)和 ArtifactId(如 mybatis-demo

3. 添加依赖(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>
</dependencies>

保存后,Maven 会自动下载依赖。


三、核心概念:用大白话讲清楚

1. 什么是“持久层”?

程序运行时数据在内存里(易失),关机就没了。持久化 = 把数据存到硬盘(如数据库)里,永久保存。负责这部分代码的模块,就叫“持久层”。

2. MyBatis 的三大核心组件

组件 作用 类比
SqlSessionFactory 创建数据库会话的“工厂” 像手机制造厂,批量生产手机
SqlSession 一次数据库会话 像一部手机,用来打电话(执行 SQL)
Mapper 接口 + XML 定义 SQL 操作 像通讯录 + 拨号盘,告诉你打给谁、说什么

📌 关键思想:MyBatis 不生成 SQL,而是让你写 SQL,它只负责传参、执行、映射结果。这和 Hibernate(全自动 ORM)完全不同。


四、实战:从零写一个用户管理系统

我们将实现一个最简单的功能:向数据库插入一个用户,并查询出来

步骤 1:创建数据库和表

CREATE DATABASE mybatis_demo;
USE mybatis_demo;

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

步骤 2:编写 MyBatis 配置文件 mybatis-config.xml

放在 src/main/resources 目录下:

<?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="123456"/>
      </dataSource>
    </environment>
  </environments>
  
  <!-- 注册 Mapper XML 文件 -->
  <mappers>
    <mapper resource="UserMapper.xml"/>
  </mappers>
</configuration>

步骤 3:创建 User 实体类

// src/main/java/com/example/model/User.java
package com.example.model;

public class User {
    private Integer id;
    private String name;
    private String email;
    
    // 构造函数、getter/setter 省略(IDE 可自动生成)
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
    
    // Getter 和 Setter...
}

步骤 4:编写 Mapper 接口和 XML

接口(定义方法):

// src/main/java/com/example/mapper/UserMapper.java
package com.example.mapper;

import com.example.model.User;
import java.util.List;

public interface UserMapper {
    void insertUser(User user);
    List<User> findAllUsers();
}

XML(写 SQL):

<!-- 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.mapper.UserMapper">
  
  <insert id="insertUser" parameterType="com.example.model.User">
    INSERT INTO user(name, email) VALUES(#{name}, #{email})
  </insert>
  
  <select id="findAllUsers" resultType="com.example.model.User">
    SELECT * FROM user
  </select>
  
</mapper>

🔍 注意:namespace 必须和接口全路径一致;id 必须和方法名一致。

步骤 5:写测试代码

// src/test/java/com/example/AppTest.java
import com.example.mapper.UserMapper;
import com.example.model.User;
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.junit.Test;
import java.io.InputStream;
import java.util.List;

public class AppTest {
    @Test
    public void testMyBatis() throws Exception {
        // 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. 获取 Mapper 接口代理对象
            UserMapper mapper = session.getMapper(UserMapper.class);
            
            // 5. 插入用户
            mapper.insertUser(new User("张三", "zhangsan@example.com"));
            
            // 6. 提交事务(重要!)
            session.commit();
            
            // 7. 查询所有用户
            List<User> users = mapper.findAllUsers();
            for (User u : users) {
                System.out.println("ID: " + u.getId() + ", Name: " + u.getName());
            }
        }
    }
}

运行测试,如果控制台输出用户信息,恭喜你!MyBatis 已成功跑通!


五、新手常见问题 & 避坑指南

❌ 问题 1:ClassNotFoundException: com.mysql.cj.jdbc.Driver

原因:MySQL 驱动版本问题(8.x 需要 cj 包)
解决:确保 pom.xml 中使用的是 mysql-connector-java 8.0+,且配置文件中 driver 写全:com.mysql.cj.jdbc.Driver

❌ 问题 2:插入数据成功但查不到?

原因:忘了 session.commit()!MyBatis 默认开启事务,不提交就不会写入数据库。
解决:每次写操作后调用 session.commit()

❌ 问题 3:属性名和数据库字段名不一致(如 userName vs user_name

解决:用 <resultMap> 显式映射,或开启驼峰转换:

<settings>
  <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

💡 额外建议:

  • 把你的 MyBatis 小项目上传到 GitHub,哪怕只有几百行代码,也能体现你的工程能力。
  • 简历 的“项目经验”里写上:“使用 MyBatis 实现用户数据持久化”,比只写“了解 Java”有力得多。
  • 如果你以后学 Go,会发现 GORM 也是类似思路——先理解概念,再换语言就快了。

六、下一步怎么学?

MyBatis 只是持久层的第一步。建议按以下路径深入:

  1. 掌握动态 SQL<if>, <foreach> 等标签,实现条件查询
  2. 学习关联映射:一对一、一对多(比如用户-订单)
  3. 整合 Spring Boot:用 @MapperScan 自动注入,告别手动创建 SqlSession
  4. 性能优化:缓存机制(一级/二级缓存)、分页插件(PageHelper)
  5. 对比其他框架:试试 MyBatis-Plus(国产增强版),或 Hibernate(全自动 ORM)

最后送大家一句话:不要怕写 SQL,理解 SQL 才是后端工程师的核心竞争力。MyBatis 让你既享受 ORM 的便利,又不失对 SQL 的掌控力。


如果你跟着教程走通了,不妨在评论区留言“Hello MyBatis!” —— 这是你后端之路的第一个里程碑。坚持下去,下一个 GitHub 高星项目、下一份亮眼简历,可能就从今天开始。

加油,未来的架构师!

评论 0

最热最新
暂无评论
Prompt造梦师Lv.1
0
影响力
0
文章
0
粉丝