Mybatis 核心原理和底层架构
Mybatis 核心原理和底层架构
1、核心原理
MyBatis通过JDK动态代理为Mapper接口生成代理对象。当调用Mapper接口的方法时,代理对象会拦截方法调用,并根据方法名和参数类型找到对应的MappedStatement,然后执行SQL,并利用反射将结果集映射为Java对象。
-
SQL与代码分离:将SQL语句写在XML配置或注解中,与Java代码分离,便于维护和修改。
-
动态SQL:根据条件动态生成SQL语句,避免在Java代码中拼接字符串。
-
ORM映射:将ResultSet结果集自动映射为Java对象,简化数据库操作。
2、底层架构设计
MyBatis的架构分为三层:接口层、核心处理层、基础支撑层。
1、接口层:提供与用户交互的API,包括SqlSession和Mapper接口。
-
SqlSession:核心接口,提供增删改查、提交、回滚等方法。 -
SqlSessionFactory:创建SqlSession的工厂。 -
Mapper接口:开发者定义的DAO接口,MyBatis通过动态代理为其生成实现。
2、核心处理层:处理SQL请求,包括SQL解析、参数映射、SQL执行、结果映射等。
-
配置解析:解析mybatis-config.xml和Mapper.xml,构建Configuration对象。
-
SQL解析:将XML或注解中的SQL信息转换为MappedStatement对象。
-
动态SQL:根据条件生成SQL语句,使用SqlNode和SqlSource表示。
-
参数映射:将Java方法的参数转换为SQL语句的参数,由ParameterHandler处理。
-
SQL执行:通过Executor执行SQL,包括SimpleExecutor、ReuseExecutor、BatchExecutor等。
-
结果映射:将ResultSet映射为Java对象,由ResultSetHandler处理。
-
插件机制:通过Interceptor接口提供插件功能,可以拦截四大对象(Executor、ParameterHandler、ResultSetHandler、StatementHandler)的方法。
3、基础支撑层: 提供基础功能,如数据源、事务、缓存、日志等。
-
数据源模块:提供连接池,如PooledDataSource。
-
事务管理:提供JdbcTransaction和ManagedTransaction。
-
缓存模块:一级缓存(本地缓存)和二级缓存(全局缓存)。
-
一级缓存:基于SqlSession级别,默认开启。在同一个SqlSession中,相同的查询会缓存结果。
-
二级缓存:基于Mapper级别,需要手动开启。多个SqlSession可以共享二级缓存。
-
-
日志模块:适配多种日志框架,如SLF4J、Log4j2等。
-
反射工具:提供MetaObject、MetaClass等,简化反射操作。
3、插件机制
MyBatis提供插件接口Interceptor,可以拦截以下四大对象的方法:
-
Executor:执行器,拦截增删改查、提交、回滚等。
-
ParameterHandler:参数处理器,拦截设置参数。
-
ResultSetHandler:结果处理器,拦截处理结果集。
-
StatementHandler:语句处理器,拦截SQL编译和参数设置。
插件通过动态代理和责任链模式实现,可以在方法执行前后进行拦截。
总结
其核心原理是通过动态代理将Mapper接口的方法调用转换为SQL语句的执行,并利用反射将结果集映射为Java对象。架构上分为三层:接口层、核心处理层和基础支撑层。
-
接口层:提供SqlSession和Mapper接口,SqlSessionFactory用于创建SqlSession,而Mapper接口通过动态代理实现。
-
核心处理层:包括配置解析、SQL解析、动态SQL、参数映射、SQL执行和结果映射。其中,Executor负责执行SQL,ParameterHandler处理参数,ResultSetHandler处理结果集。
-
基础支撑层:提供数据源、事务、缓存、日志等基础功能。
MyBatis的工作流程是:首先加载配置,构建Configuration;然后创建SqlSession和Executor;通过MapperProxy代理Mapper接口的方法调用;最后通过Executor执行SQL并映射结果。

浙公网安备 33010602011771号