JAVA:MyBatis 核心组件详解的技术指南
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 configurationPUBLIC "-//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 mapperPUBLIC "-//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. 获取 SqlSessiontry (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 的模板代码量,非常适合中大型企业项目。