JAVA:MyBatis 核心组件详解的技术指南

admin
5
2025-08-25

1、简述

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

image-3pv1.png


2、核心组件

MyBatis 的核心组件主要包括以下几个:

SqlSessionFactoryBuilder

🔹 负责构建 SqlSessionFactory

🔹 一般应用程序只需要一个 SqlSessionFactory

SqlSessionFactory

🔹 用于创建 SqlSession

🔹 线程安全,建议单例管理。

SqlSession

🔹 提供了执行 SQL 命令的方法,如 selectOneselectListinsertupdatedelete

🔹 管理事务(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 的模板代码量,非常适合中大型企业项目。

动物装饰