MyBatis 的核心组件
MyBatis 的核心组件包括以下几个部分,它们协同工作完成 SQL 映射和执行:
SqlSessionFactory
是 MyBatis 的核心工厂类,负责创建 SqlSession 对象。通常由 SqlSessionFactoryBuilder 基于 XML 配置文件或 Java 注解构建。生命周期应为应用级(全局唯一),避免重复创建消耗资源。
SqlSession
代表与数据库的一次会话,提供了执行 SQL、获取 Mapper 接口的方法。生命周期为请求级或方法级,用完需及时关闭,避免连接泄漏。包含 selectOne()、selectList()、insert()、update()、delete() 等操作数据库的方法。
Mapper 接口
定义数据库操作方法的接口,方法名与 SQL 语句的 ID 对应。无需手动实现,MyBatis 通过动态代理自动生成实现类。
Mapper XML 文件 / 注解
存放 SQL 语句,通过命名空间(namespace)与 Mapper 接口关联。支持动态 SQL(如
Executor
MyBatis 的内部执行器,负责 SQL 的实际执行。有三种类型:SIMPLE(默认,简单执行器)、REUSE(复用预处理语句)、BATCH(批量执行)。
StatementHandler
处理 JDBC 的 Statement 操作,包括参数设置、SQL 执行、结果集映射。
ResultMap
定义查询结果与 Java 对象的映射关系,解决列名与属性名不一致的问题。
Mapper 接口为什么不需要实现类就能执行 SQL?
MyBatis 通过动态代理机制为 Mapper 接口自动生成实现类,核心原理如下:
接口与 SQL 的绑定Mapper 接口的全限定名(如 com.example.UserMapper)与 XML 文件的 namespace 一致,接口中的方法名与 XML 中
动态代理生成实现类当调用 sqlSession.getMapper(UserMapper.class) 时,MyBatis 会通过 MapperProxyFactory 创建 MapperProxy(实现 InvocationHandler 接口),并生成代理对象。
代理对象的方法执行调用代理对象的方法(如 userMapper.selectById(1))时,会触发 MapperProxy.invoke() 方法:
解析方法信息(接口名、方法名、参数),找到对应的 SQL 语句。委托 SqlSession 执行 SQL,并处理结果映射。
动态代理的实现流程
MyBatis 动态代理的底层逻辑可拆解为以下步骤:
获取 Mapper 代理对象
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class); // 生成代理对象
session.getMapper() 调用 Configuration.getMapper(),最终由 MapperProxyFactory 创建代理。
创建代理实例MapperProxyFactory 通过 JDK 动态代理生成代理对象:
protected T newInstance(MapperProxy
return (T) Proxy.newProxyInstance(
mapperInterface.getClassLoader(),
new Class[] { mapperInterface },
mapperProxy
);
}
代理对象实现了 Mapper 接口,MapperProxy 作为调用处理器。
方法调用的拦截与处理当执行 userMapper.selectById(1) 时,MapperProxy.invoke() 被触发:
检查方法是否为 Object 类的方法(如 toString()),若是则直接执行。否则,通过 MapperMethod 解析方法签名,生成 MappedStatement(封装 SQL 信息)。调用 SqlSession 的对应方法(如 selectOne)执行 SQL,并返回结果。
SQL 执行与结果映射MyBatis 内部通过 Executor、StatementHandler 等组件完成 JDBC 操作,最终将结果映射为 Java 对象返回。
总结
MyBatis 的核心组件通过分层设计实现了 SQL 与 Java 代码的解耦,而动态代理是 Mapper 接口无需手动实现的关键。其本质是通过 JDK 代理机制,在运行时生成接口的实现类,将方法调用转换为对 SQL 的执行,简化了数据库操作的编码流程。
友情链接:
©Copyright © 2022 2006年世界杯歌曲_冰岛世界杯排名 - guoyunzhan.com All Rights Reserved.