MyBatis到底是什么?零基础也能学会的Java数据库操作神器!
大家好,我是你们的老朋友阿杰!在某大厂干了三年后端开发,平时下班后喜欢在B站分享一些技术干货。最近收到不少私信,很多刚学完Java基础的同学问我:“学完面向对象、集合、IO流之后,下一步该学什么?”“面试官总问MyBatis,但我连它是什么都不知道……”
我当初学的时候也是一头雾水——明明写了SQL,为什么还要框架?结果后来发现,MyBatis简直就是连接Java和数据库的“翻译官”,让咱们不用再手动拼接字符串写SQL,也不用处理繁琐的连接关闭逻辑。
今天这篇教程,我就带完全零基础的你,从0到1搞懂MyBatis,并完成一个能运行的小项目。文末还会附上几道高频面试题挑战,助你在求职路上多一分底气!
一、MyBatis:让Java和数据库“说人话”
想象一下:你想让Java程序从MySQL里查出所有用户信息。传统做法是:
- 加载数据库驱动
- 建立连接(Connection)
- 创建SQL语句(Statement/PreparedStatement)
- 执行查询
- 遍历结果集(ResultSet)
- 手动把每一行数据封装成Java对象
- 最后还得记得关连接、关结果集……
光是第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&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中要写成&
步骤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只是持久层的起点!建议你按这个路径继续深入:
- 学MyBatis-Plus:国产增强工具,CRUD不用写SQL!
- 整合Spring Boot:告别手动创建SqlSession,用注解@Autowired注入Mapper
- 理解事务管理:@Transactional怎么保证数据一致性?
- 性能优化:懒加载、批量插入、缓存策略……
我在B站更新了《MyBatis从入门到源码》系列,搜索“阿杰讲后端”就能找到。如果你觉得这篇教程帮到了你,欢迎点赞关注,我会持续输出更多求职向的干货!
记住:每一个大厂程序员,都是从“Hello World”开始的。你现在迈出的这一步,可能就是未来Offer的起点!
加油,未来的开发者!🚀

评论 0