MyBatis是怎么实现的?
1 个回答
回眸一笑百媚生,六宫粉黛无颜色。苏月MyBatis 的实现可以从它的核心原理、运行流程、关键组件三个方面来看 ## 1. 核心思想 MyBatis 是 **半自动 ORM 框架**,它不完全屏蔽 SQL,而是用 **映射机制(Mapping)** 将 SQL 结果与 Java 对象绑定,并支持动态 SQL。核心目标: * 开发者专注写 SQL(XML/注解),不需要手动封装 JDBC 结果集。 * 框架负责 SQL 执行、参数绑定、结果映射、事务控制(配合 Spring)。 ## 2. 核心流程(执行一次 SQL 的过程) 以 `SqlSession.selectList()` 为例: 1. **加载配置** * 读取 `mybatis-config.xml`(或 Java 配置类),构建 `Configuration` 对象(包含数据源、Mapper 映射信息等)。 * 每个 `<mapper>` XML 解析成 `MappedStatement`,保存 SQL、参数映射、结果映射等元信息。 2. **创建 SqlSession** * 由 `SqlSessionFactory` 创建,内部持有一个 `Executor`(执行器)和 `Configuration`。 * `Executor` 决定 SQL 执行策略(`SimpleExecutor`、`ReuseExecutor`、`BatchExecutor`)。 3. **执行 Mapper 方法** * Mapper 接口是动态代理生成的(`MapperProxy` 实现 `InvocationHandler`)。 * 调用 Mapper 方法 → 代理对象查找对应的 `MappedStatement` → 调用 `Executor` 执行。 4. **SQL 执行** * 先走二级缓存(Mapper 范围),再走一级缓存(SqlSession 范围)。 * 缓存未命中时,`Executor` 调用 `StatementHandler`: * **参数处理**:`ParameterHandler` 把方法参数绑定到 `PreparedStatement` 占位符上。 * **SQL 执行**:通过 JDBC 执行 SQL。 5. **结果映射** * `ResultSetHandler` 将结果集映射为 Java 对象: * 按 `<resultMap>` 或自动映射规则(列名→属性名)赋值。 * 支持级联映射、一对多等复杂映射。 6. **返回结果** * 封装成 List / 对象返回给调用者。 ## 3. 核心组件实现 * **Configuration**:全局配置对象,保存所有 Mapper、TypeHandler、拦截器等。 * **MappedStatement**:封装一条 SQL 的完整信息(SQL、参数映射、结果映射等)。 * **SqlSession**:对外 API,内部调用 Executor。 * **Executor**:执行器接口,控制 SQL 执行和缓存。 * **StatementHandler**:封装 JDBC Statement 操作。 * **ParameterHandler**:负责参数绑定。 * **ResultSetHandler**:负责结果集映射。 * **TypeHandler**:Java 类型与 JDBC 类型互转。 * **插件机制(Interceptor)**:可拦截四大对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)的指定方法。 ## 4. 特点 * 灵活的 SQL 控制:适合复杂业务,不强行 ORM。 * Mapper 动态代理:减少模板代码。 * 缓存机制:一级缓存(会话级)、二级缓存(Mapper 级,可自定义实现)。 * 动态 SQL:支持 `<if>`、`<choose>`、`<foreach>` 等标签拼接 SQL。发布于 2025-08-13 08:40 •IP属地 上海举报评论收藏
公众号进入网站体验更佳

