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