MyBatis到底是什么?零基础也能学会的Java数据库操作神器!

模型接口玩家
2026-01-13 21:22
阅读 1644

大家好,我是你们的老朋友阿杰!在某大厂干了三年后端开发,平时下班后喜欢在B站分享一些技术干货。最近收到不少私信,很多刚学完Java基础的同学问我:“学完面向对象、集合、IO流之后,下一步该学什么?”“面试官总问MyBatis,但我连它是什么都不知道……”

我当初学的时候也是一头雾水——明明写了SQL,为什么还要框架?结果后来发现,MyBatis简直就是连接Java和数据库的“翻译官”,让咱们不用再手动拼接字符串写SQL,也不用处理繁琐的连接关闭逻辑。

今天这篇教程,我就带完全零基础的你,从0到1搞懂MyBatis,并完成一个能运行的小项目。文末还会附上几道高频面试题挑战,助你在求职路上多一分底气!


一、MyBatis:让Java和数据库“说人话”

想象一下:你想让Java程序从MySQL里查出所有用户信息。传统做法是:

  1. 加载数据库驱动
  2. 建立连接(Connection)
  3. 创建SQL语句(Statement/PreparedStatement)
  4. 执行查询
  5. 遍历结果集(ResultSet)
  6. 手动把每一行数据封装成Java对象
  7. 最后还得记得关连接、关结果集……

光是第7步,多少人忘了关连接导致服务器崩溃? 😅

而MyBatis的作用,就是把这些重复、易错的操作全部封装好。你只需要:

  • 写好SQL
  • 定义好Java对象(比如User类)
  • 告诉MyBatis“这条SQL对应哪个方法”

剩下的,它全帮你搞定!这就是所谓的持久层框架——专门负责“把内存中的Java对象,持久化到数据库”的工具。


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

✅ 前提:你已经安装了JDK 8+、Maven、IDEA(或Eclipse)、MySQL

第1步:创建Maven项目

打开IDEA,新建一个Maven项目,不选任何模板(archetype),命名为 mybatis-demo

第2步:添加依赖(pom.xml)

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会自动下载所需jar包。

第3步:准备数据库

打开你的MySQL,执行以下SQL创建数据库和表:

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'),
('李四', 'lisi@example.com');

三、核心概念:三要素搞定MyBatis

MyBatis的核心就三个东西,记住它们,你就入门了!

组件 作用 文件位置示例
SqlSessionFactory 工厂,用来生产SqlSession(相当于“数据库连接管家”) 通过配置文件或代码创建
Mapper接口 定义你要执行的数据库操作方法(如 findAllUsers() src/main/java/com/example/mapper/UserMapper.java
Mapper XML 写具体SQL的地方,和接口方法一一对应 src/main/resources/mapper/UserMapper.xml

💡 小贴士:MyBatis还有注解写法(直接在接口上写@Select),但XML方式更灵活、更适合复杂SQL,我们这里用XML。


四、实战:手把手写一个用户查询功能

步骤1:创建User实体类

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

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

    // 必须要有无参构造器!
    public User() {}

    // getter 和 setter 省略(IDEA可自动生成)
    public Integer getId() { return id; }
    public void setId(Integer 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>
  <!-- 设置别名,后续XML中可以直接写User而不是全路径 -->
  <typeAliases>
    <typeAlias alias="User" type="com.example.entity.User"/>
  </typeAliases>

  <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="你的密码"/>
      </dataSource>
    </environment>
  </environments>

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

⚠️ 注意:& 在XML中要写成 &amp;

步骤3:创建Mapper接口

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

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

public interface UserMapper {
    List<User> findAll();
}

步骤4:编写Mapper XML

创建 src/main/resources/mapper/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">

<!-- namespace必须是接口的全限定名 -->
<mapper namespace="com.example.mapper.UserMapper">

  <!-- id对应接口方法名,resultType指定返回类型 -->
  <select id="findAll" resultType="User">
    SELECT * FROM user
  </select>

</mapper>

步骤5:编写测试代码

// src/test/java/com/example/TestMyBatis.java
package com.example;

import com.example.entity.User;
import com.example.mapper.UserMapper;
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 TestMyBatis {

    @Test
    public void testFindAll() 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. 调用方法
            List<User> users = mapper.findAll();
            
            // 6. 打印结果
            for (User user : users) {
                System.out.println(user);
            }
        }
    }
}

运行 testFindAll(),如果看到控制台输出两个用户信息,恭喜你!MyBatis跑通了!


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

❓ 问题1:ClassNotFoundException 或驱动找不到?

✅ 检查:

  • MySQL驱动版本是否匹配(8.x用 com.mysql.cj.jdbc.Driver
  • Maven是否成功下载了依赖(看External Libraries)

❓ 问题2:BindingException: Invalid bound statement

✅ 这是最常见的错误!原因通常是:

  • Mapper XML的 namespace 写错了(必须是接口全路径)
  • XML中的 id 和接口方法名不一致
  • XML文件没被Maven打包(确保放在 resources 目录下)

❓ 问题3:中文乱码?

✅ 在JDBC URL后面加上:&characterEncoding=utf8

❓ 问题4:每次都要写try-with-resources好麻烦?

✅ 后续可以整合Spring Boot,用 @MapperScan 自动注入,彻底告别手动管理SqlSession!


六、求职加分项:3道MyBatis面试题挑战

学完基础,来试试这几道真实面试题(答案思路已给出):

🧩 面试题1:MyBatis中 #{} 和 ${} 有什么区别?

  • #{} 是预编译处理,会生成 ? 占位符,防止SQL注入(推荐使用)
  • ${} 是字符串替换,直接拼接,有SQL注入风险(仅用于动态表名、字段名等场景)
    例如:SELECT * FROM user WHERE name = #{name} 安全;ORDER BY ${column} 可用于排序字段

🧩 面试题2:MyBatis的一级缓存和二级缓存是什么?

  • 一级缓存:默认开启,基于SqlSession级别。同一个SqlSession中,相同查询只查一次数据库
  • 二级缓存:需手动开启,基于Mapper(namespace)级别。不同SqlSession可共享缓存(需实体类实现Serializable)

🧩 面试题3:如何实现MyBatis的分页查询?


简单分页可用 LIMIT #{offset}, #{size}
复杂项目通常集成 PageHelper 插件,只需调用 PageHelper.startPage(pageNum, pageSize) 即可。


七、下一步怎么学?

MyBatis只是持久层的起点!建议你按这个路径继续深入:

  1. 学MyBatis-Plus:国产增强工具,CRUD不用写SQL!
  2. 整合Spring Boot:告别手动创建SqlSession,用注解@Autowired注入Mapper
  3. 理解事务管理:@Transactional怎么保证数据一致性?
  4. 性能优化:懒加载、批量插入、缓存策略……

我在B站更新了《MyBatis从入门到源码》系列,搜索“阿杰讲后端”就能找到。如果你觉得这篇教程帮到了你,欢迎点赞关注,我会持续输出更多求职向的干货!

记住:每一个大厂程序员,都是从“Hello World”开始的。你现在迈出的这一步,可能就是未来Offer的起点!

加油,未来的开发者!🚀

评论 0

最热最新
暂无评论
模型接口玩家Lv.1
0
影响力
0
文章
0
粉丝