一、MyBatis 原生方式:查询 user 表全量数据
核心步骤(对应第一张图)
-
数据库准备 :创建
tb_user表并插入测试数据 -
工程搭建:创建 Maven 模块,导入 MyBatis、MySQL 驱动等依赖坐标
-
核心配置文件 :编写
mybatis-config.xml,配置数据源(解决 JDBC 硬编码)xml
<dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///db1?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> -
SQL 映射文件 :编写
UserMapper.xml,统一管理 SQL 语句(解决代码硬编码)xml
<select id="selectAll" resultType="com.itheima.pojo.User"> select * from tb_user; </select> -
编码执行
- 定义与表结构对应的 POJO 类
User - 加载核心配置文件,构建
SqlSessionFactory - 获取
SqlSession,执行selectList("test.selectAll") - 释放资源
- 定义与表结构对应的 POJO 类
原生方式的痛点
- 执行 SQL 时需要硬编码
statement id(如"test.selectAll"),一旦 XML 中 id 修改,代码会报错 - 代码冗余,维护成本高,不符合面向对象开发思想
二、Mapper 代理开发:解决原生方式的硬编码问题
核心目的(对应第二张图)
- ✅ 彻底解决原生方式中
statement id的硬编码问题 - ✅ 简化 SQL 执行流程,完全面向接口编程
- ✅ 提升代码可维护性,符合 Spring 生态的开发规范
两种方式的核心对比
表格
| 对比项 | 原生方式 | Mapper 代理方式 |
|---|---|---|
| SQL 调用 | sqlSession.selectList("test.selectAll")(硬编码 id) |
userMapper.selectAll()(接口方法调用) |
| 代码风格 | 面向过程 | 面向接口 |
| 维护性 | 差(id 修改需同步修改所有调用处) | 高(接口与 XML 自动绑定) |
| 开发效率 | 低 | 高 |
三、Mapper 代理开发的完整步骤(对应第三张图)
核心绑定规则(必须严格遵守)
-
命名与路径一致 :Mapper 接口名与 SQL 映射文件名完全相同,且放在同一目录 下
- 接口:
com.itheima.mapper.UserMapper.java - XML:
com.itheima.mapper.UserMapper.xml
- 接口:
-
namespace 绑定 :XML 的
namespace必须等于 Mapper 接口的全限定名xml
<mapper namespace="com.itheima.mapper.UserMapper"> -
方法与 SQL 一一对应 :接口方法名 = XML 中 SQL 的
id,参数类型、返回值类型完全一致java
运行
// 接口方法 List<User> selectAll();xml
<!-- 对应SQL --> <select id="selectAll" resultType="com.itheima.pojo.User"> select * from tb_user; </select>
简化配置:包扫描加载映射文件
当接口与 XML 同目录、同名时,可在核心配置中使用包扫描,无需逐个加载 XML:
xml
<mappers>
<!-- 原方式:逐个加载,繁琐 -->
<!-- <mapper resource="com/itheima/mapper/UserMapper.xml"/> -->
<!-- 简化方式:包扫描,自动加载该包下所有XML -->
<package name="com.itheima.mapper"/>
</mappers>
完整可落地代码示例
1. Mapper 接口定义
java
运行
package com.itheima.mapper;
import com.itheima.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
// @Mapper 注解用于SpringBoot整合时自动扫描,纯MyBatis可省略
public interface UserMapper {
// 查询所有用户
List<User> selectAll();
}
2. SQL 映射文件(UserMapper.xml)
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.itheima.mapper.UserMapper">
<select id="selectAll" resultType="com.itheima.pojo.User">
select * from tb_user;
</select>
</mapper>
3. 测试代码
java
运行
public class MyBatisTest {
public static void main(String[] args) throws IOException {
// 1. 加载核心配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 2. 获取SqlSession
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
// 3. 获取Mapper代理对象(核心!MyBatis自动生成代理实现类)
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 4. 调用方法执行SQL(无硬编码!)
List<User> users = userMapper.selectAll();
users.forEach(System.out::println);
}
}
}
四、核心优势总结
表格
| 优势 | 说明 |
|---|---|
| 消除硬编码 | 彻底告别statement id硬编码,避免修改 XML 导致的代码报错 |
| 面向接口编程 | 符合 Java 开发规范,代码更优雅,便于单元测试 |
| 简化配置 | 包扫描自动加载 XML,无需手动维护映射文件路径 |
| 无缝整合 Spring | 完美适配 Spring/SpringBoot 的依赖注入,是企业级开发的标准方案 |
| 类型安全 | 编译期即可检查方法参数、返回值是否匹配,避免运行时错误 |



