1、简述
在企业级开发中,ORM(对象关系映射)框架被广泛应用,而 MyBatis 是其中最灵活、最常用的框架之一。它不像 Hibernate 那样高度自动化,而是通过 SQL 映射 的方式,将数据库操作和 Java 对象绑定起来。
要想深入掌握 MyBatis,就必须理解它的 核心组件。

2、核心组件
MyBatis 的核心组件主要包括以下几个:
SqlSessionFactoryBuilder
🔹 负责构建 SqlSessionFactory。
🔹 一般应用程序只需要一个 SqlSessionFactory。
SqlSessionFactory
🔹 用于创建 SqlSession。
🔹 线程安全,建议单例管理。
SqlSession
🔹  提供了执行 SQL 命令的方法,如 selectOne、selectList、insert、update、delete。
🔹  管理事务(commit / rollback)。
🔹  生命周期短,类似于 JDBC 的 Connection。
Mapper 接口(DAO 层接口)
🔹 通过 MyBatis 的动态代理机制,将接口方法与 SQL 映射文件中的 SQL 语句绑定。
🔹 极大减少了模板代码。
映射器(Mapper XML 文件)
🔹 定义了 SQL 语句以及输入输出参数映射规则。
🔹 将 SQL 和 Java 对象解耦。
4、核心组件之间的关系
SqlSessionFactoryBuilder → SqlSessionFactory → SqlSession → Mapper → SQL
流程:
🔹 通过 SqlSessionFactoryBuilder 解析 MyBatis 配置文件;
🔹 创建 SqlSessionFactory;
🔹 从工厂获取 SqlSession;
🔹 通过 Mapper 接口 执行 SQL;
🔹 MyBatis 自动完成 SQL 与 Java 对象的映射。
5、实践样例
5.1 数据库表
创建一张 users 表:
CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(50),
  email VARCHAR(100)
);
插入数据:
INSERT INTO users(username, email) VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.com');
5.2 Maven 依赖
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.19</version>
</dependency>
5.3 MyBatis 配置文件(mybatis-config.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://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/testdb?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>
</configuration>
5.4 实体类
public class User {
    private Integer id;
    private String username;
    private String email;
    // Getter & Setter
}
5.5 Mapper 接口
public interface UserMapper {
    User selectUserById(Integer id);
    List<User> selectAllUsers();
    int insertUser(User user);
}
5.6 Mapper XML 文件(mapper/UserMapper.xml)
<?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="UserMapper">
    <select id="selectUserById" parameterType="int" resultType="User">
        SELECT id, username, email FROM users WHERE id = #{id}
    </select>
    <select id="selectAllUsers" resultType="User">
        SELECT id, username, email FROM users
    </select>
    <insert id="insertUser" parameterType="User">
        INSERT INTO users(username, email) VALUES (#{username}, #{email})
    </insert>
</mapper>
5.7 测试代码
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 java.io.InputStream;
import java.util.List;
public class MyBatisDemo {
    public static void main(String[] args) throws Exception {
        // 1. 加载 MyBatis 配置文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 2. 获取 SqlSession
        try (SqlSession session = sqlSessionFactory.openSession(true)) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            // 查询单个用户
            User user = mapper.selectUserById(1);
            System.out.println("单个用户:" + user.getUsername());
            // 查询所有用户
            List<User> users = mapper.selectAllUsers();
            users.forEach(u -> System.out.println("用户:" + u.getUsername()));
            // 插入用户
            User newUser = new User();
            newUser.setUsername("Charlie");
            newUser.setEmail("charlie@example.com");
            mapper.insertUser(newUser);
            System.out.println("插入成功");
        }
    }
}
6、总结
🔹 SqlSessionFactoryBuilder:构建工厂
🔹 SqlSessionFactory:生产 SqlSession(线程安全)
🔹 SqlSession:执行 SQL(生命周期短)
🔹 Mapper 接口:面向接口编程,简化 DAO
🔹 Mapper XML:管理 SQL 与对象映射
这种设计既保留了 SQL 的灵活性,又大幅降低了 JDBC 的模板代码量,非常适合中大型企业项目。