GLM-4.7深度推理与Agentic Coding实战指南
2026/6/21 11:49:32
大家好,我是锋哥。今天分享关于【Java GC是任意时候都能进行的吗?】面试题。希望对大家有帮助;
超硬核AI学习资料,现在永久免费了!
MyBatis 的工作流程可以分为六个核心阶段,理解这个过程能帮助你更好地掌握它的运行原理、调试思路和性能优化方向。
MyBatis 的运行核心是:
通过映射文件(Mapper XML/注解)将 Java 方法与 SQL 语句绑定,在执行时动态生成 SQL 并通过 JDBC 与数据库交互。
其整体流程如下:
用户调用 Mapper 接口方法 ↓ MapperProxy 代理拦截方法调用↓ MappedStatement 获取对应 SQL 信息 ↓ SQLSource 生成 BoundSql(绑定参数的 SQL) ↓ Executor 执行 SQL(通过 JDBC) ↓ ResultSetHandler 处理结果集并映射为对象返回SqlSessionFactoryBuilder根据配置构建出SqlSessionFactory,用于创建数据库会话。🔹 类似于 Hibernate 的 SessionFactory,线程安全且全局唯一。
通过SqlSessionFactory.openSession()创建一个 SqlSession 对象。
它相当于一次数据库会话,内部封装了:
Executor(执行器)ConfigurationTransaction(事务)-Connection(JDBC连接)⚠️ SqlSession 是非线程安全的,必须在使用后及时关闭。
当你调用:
UserMapper mapper = sqlSession.getMapper(UserMapper.class);时,MyBatis 使用JDK动态代理生成一个代理对象MapperProxy。
之后你调用mapper.selectUserById(1)时,会被拦截到MapperMethod中处理。
MapperMethod会通过MappedStatement查找到对应的 SQL 定义:
<selectid="selectUserById" parameterType="int" resultType="User"> SELECT * FROM user WHERE id = #{id} </select>随后:
<if>,<where>,<foreach>)SimpleExecutor或CachingExecutor)Executor调用StatementHandler:ParameterHandler将参数填充到 PreparedStatement;- 执行 SQL(executeQuery()或executeUpdate());ResultSet。🔹 执行器可被插件拦截,例如分页插件 PageHelper、性能日志插件等。
MyBatis 将查询结果集转换为 Java 对象:
resultType或resultMap定义完成字段映射;这一阶段可通过
TypeHandler控制类型转换(例如 Date↔ String)。
| 组件名 | 作用 | 举例说明 |
|---|---|---|
| Configuration | 全局配置中心 | 存放数据源、Mapper、插件、类型处理器 |
| SqlSession | 核心会话对象 | 执行 SQL、管理事务 |
| Executor | SQL 执行器 | SimpleExecutor / BatchExecutor |
| MappedStatement | SQL 映射信息 | 保存 SQL、参数映射、结果映射 |
| Handler 层 | 处理 JDBC 各阶段 | 包含 StatementHandler、ParameterHandler、ResultSetHandler |
mybatis-config.xml + Mapper.xml│ ▼ SqlSessionFactoryBuilder │ ▼ SqlSessionFactory │ ▼ SqlSession │ ▼ MapperProxy(动态代理) │ ▼ Executor执行SQL │ ▼ StatementHandler → JDBC │ ▼ResultSetHandler 映射结果 │ ▼ 返回对象| 阶段 | 核心对象 | 关键任务 |
|---|---|---|
| 配置加载 | Configuration | 读取全局与Mapper配置 |
| 会话建立 | SqlSession | 管理连接与事务 |
| SQL执行 | Executor | 执行JDBC操作 |
| 结果映射 | ResultSetHandler | 转换为Java对象 |
如果你想进一步理解,我可以帮你画一个MyBatis工作流程时序图或者展示源码级调用栈(从 getMapper 到 executeQuery),要看哪一个?