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

霸气_学者
2025-12-17 21:37
阅读 948

大家好,我是掘金上的一名全栈工程师,也是985高校计算机专业的毕业生。这几年带过不少实习生,也面试过上百位Java后端候选人。我发现很多初学者在接触数据库操作时,常常被JDBC的繁琐写法劝退,或者在面试中被问到“MyBatis和JPA有什么区别”时一脸茫然。

我当初学的时候,也踩过不少坑:XML配置写错、SQL参数传不进去、事务不生效……所以今天,我想用最简单的方式,带你从零开始掌握 MyBatis ——这个国内使用最广泛的 Java 持久层框架。

无论你是刚学完 Java 基础,还是正在准备校招面试,这篇文章都能帮你打下扎实的底子。更重要的是,MyBatis 是 Spring Boot 项目中最常用的 ORM 方案之一,掌握它,等于拿到了企业级开发的“入场券”。


一、MyBatis 是什么?为什么用它?

简单说:

  • MyBatis 是一个 Java 持久层框架,用来简化数据库操作。
  • 它把 SQL 语句从 Java 代码中分离出来(通常写在 XML 文件里),让你不用再手写 PreparedStatement 和结果集映射。
  • 它不是全自动 ORM(像 Hibernate 那样),而是“半自动”——你写 SQL,它帮你执行和映射。

对比传统 JDBC:

操作 JDBC MyBatis
写 SQL 在 Java 代码里拼字符串 在 XML 或注解中写
参数设置 手动 setInt, setString 自动映射
结果集处理 手动 ResultSet.getXXX() 自动映射到 Java 对象
资源管理 手动 close() 框架自动管理

💡 资源提示:MyBatis 内部会自动管理数据库连接、PreparedStatement 等资源,避免内存泄漏。


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

我们将基于 Spring Boot + MyBatis + MySQL 构建项目。这是当前企业最主流的技术组合。

步骤 1:创建 Spring Boot 项目

访问 https://start.spring.io,选择:

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.x(或 2.7.x 兼容性更好)
  • Dependencies:
    • Spring Web
    • MyBatis Framework
    • MySQL Driver

点击 “Generate”,下载并解压项目。

步骤 2:配置数据库连接

application.yml 中添加:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=UTC
    username: root
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  mapper-locations: classpath:mapper/*.xml  # 指定 XML 映射文件位置
  type-aliases-package: com.example.demo.entity  # 实体类包路径,可省略全限定名

⚠️ 注意:确保本地已安装 MySQL,并创建了 mybatis_demo 数据库。

步骤 3:添加依赖(如果未通过 Spring Initializr 添加)

pom.xml 中确认包含:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

三、核心概念:3 个关键组件

MyBatis 的核心就三个东西:

  1. Entity(实体类):对应数据库表的 Java 对象
  2. Mapper 接口:定义数据库操作方法
  3. Mapper XML:写 SQL 语句的地方

性能优化小贴士:MyBatis 的 SQL 是你写的,所以你可以精准控制查询字段,避免 SELECT *,提升性能。

示例:用户表操作

1. 创建实体类 User.java

package com.example.demo.entity;

public class User {
    private Long id;
    private String name;
    private Integer age;
    
    // getter/setter 省略(可用 Lombok 简化)
}

2. 创建 Mapper 接口 UserMapper.java

package com.example.demo.mapper;

import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;

@Mapper // 关键注解!告诉 Spring 这是一个 MyBatis Mapper
public interface UserMapper {
    List<User> findAll();
    User findById(Long id);
    void insert(User user);
    void deleteById(Long id);
}

3. 创建 XML 映射文件 UserMapper.xml

放在 src/main/resources/mapper/ 目录下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.demo.mapper.UserMapper">
    
    <select id="findAll" resultType="User">
        SELECT id, name, age FROM user
    </select>

    <select id="findById" resultType="User" parameterType="Long">
        SELECT id, name, age FROM user WHERE id = #{id}
    </select>

    <insert id="insert" parameterType="User">
        INSERT INTO user(name, age) VALUES(#{name}, #{age})
    </insert>

    <delete id="deleteById" parameterType="Long">
        DELETE FROM user WHERE id = #{id}
    </delete>

</mapper>

🔍 注意namespace 必须是 Mapper 接口的全限定名,id 必须和接口方法名一致。


四、实战:写一个完整的 CRUD 接口

现在,我们用 Spring Boot Controller 调用 Mapper,实现 RESTful API。

1. 编写 Service(可选,但推荐)

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public List<User> getAllUsers() {
        return userMapper.findAll();
    }

    public void addUser(User user) {
        userMapper.insert(user);
    }
}

2. 编写 Controller

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping
    public List<User> getUsers() {
        return userService.getAllUsers();
    }

    @PostMapping
    public void createUser(@RequestBody User user) {
        userService.addUser(user);
    }
}

3. 测试

启动应用,用 Postman 或 curl 测试:

# 获取所有用户
GET http://localhost:8080/users

# 添加用户
POST http://localhost:8080/users
Content-Type: application/json
{"name": "张三", "age": 25}

✅ 成功返回数据?恭喜你,第一个 MyBatis 项目跑通了!


五、新手常见问题 & 面试题

❓ 问题 1:启动报错 “Invalid bound statement (not found)”

原因:Mapper XML 未被扫描到。
解决

  • 检查 mybatis.mapper-locations 配置路径是否正确
  • 确保 XML 文件在 resources/mapper/ 下(不是 java 包里!)

❓ 问题 2:插入后 ID 为 null?

原因:没开启主键回填。
解决:在 <insert> 标签加 useGeneratedKeys="true"keyProperty="id"

<insert id="insert" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user(name, age) VALUES(#{name}, #{age})
</insert>

❓ 面试题:MyBatis 和 Hibernate 有什么区别?

维度 MyBatis Hibernate
SQL 控制 手写 SQL,灵活 自动生成 HQL,抽象高
性能 可优化到极致 有 ORM 开销
学习曲线 低(会 SQL 就行) 高(需理解缓存、延迟加载等)
适用场景 复杂查询、高性能要求 快速开发、简单 CRUD

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


六、学习建议 & 下一步

✅ 今日收获

  • 理解了 MyBatis 的核心组件
  • 搭建了 Spring Boot + MyBatis 项目
  • 实现了基本 CRUD 操作

🔜 下一步该学什么?

  1. 动态 SQL<if>, <foreach> 处理复杂查询
  2. 关联查询<resultMap> 处理一对一、一对多
  3. 分页插件:集成 PageHelper 实现分页
  4. 缓存机制:一级缓存 vs 二级缓存
  5. 与 Spring Boot 整合最佳实践:事务管理、异常处理

💡 避坑指南

  • 不要滥用 resultType="map",尽量用实体类
  • SQL 写在 XML 中,便于 DBA 审核和优化
  • 开发时开启 MyBatis 日志:在 application.yml
    logging:
      level:
        com.example.demo.mapper: debug
    

结语

MyBatis 看似简单,却是 Java 后端工程师的必备技能。我见过太多同学因为不会写 Mapper 而在面试中卡壳。希望这篇教程能帮你迈出坚实的第一步。

记住:框架只是工具,真正值钱的是你对 SQL 和数据库的理解。

如果你觉得这篇文章对你有帮助,欢迎点赞收藏,也欢迎在评论区留言你的问题。我是你们的全栈工程师朋友,下期我们讲《MyBatis 动态 SQL 详解》,不见不散!

📚 延伸资源推荐

  • 官方文档:https://mybatis.org/mybatis-3/zh/
  • GitHub 示例项目:搜索 “springboot-mybatis-demo”
  • 面试题合集:《Java 后端面试高频 100 题》(掘金专栏)

评论 0

最热最新
暂无评论
霸气_学者Lv.1
0
影响力
0
文章
0
粉丝