Mybatis 核心原理和底层架构

Mybatis 核心原理和底层架构

 

 

1、核心原理

MyBatis通过JDK动态代理为Mapper接口生成代理对象。当调用Mapper接口的方法时,代理对象会拦截方法调用,并根据方法名和参数类型找到对应的MappedStatement,然后执行SQL,并利用反射将结果集映射为Java对象。

  1. SQL与代码分离:将SQL语句写在XML配置或注解中,与Java代码分离,便于维护和修改。

  2. 动态SQL:根据条件动态生成SQL语句,避免在Java代码中拼接字符串。

  3. 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。

  • 缓存模块:一级缓存(本地缓存)和二级缓存(全局缓存)。

    1. 一级缓存:基于SqlSession级别,默认开启。在同一个SqlSession中,相同的查询会缓存结果。

    2. 二级缓存:基于Mapper级别,需要手动开启。多个SqlSession可以共享二级缓存。

  • 日志模块:适配多种日志框架,如SLF4J、Log4j2等。

  • 反射工具:提供MetaObject、MetaClass等,简化反射操作。

 

3、插件机制

MyBatis提供插件接口Interceptor,可以拦截以下四大对象的方法:

  • Executor:执行器,拦截增删改查、提交、回滚等。

  • ParameterHandler:参数处理器,拦截设置参数。

  • ResultSetHandler:结果处理器,拦截处理结果集。

  • StatementHandler:语句处理器,拦截SQL编译和参数设置。

插件通过动态代理和责任链模式实现,可以在方法执行前后进行拦截。

 

总结

其核心原理是通过动态代理将Mapper接口的方法调用转换为SQL语句的执行,并利用反射将结果集映射为Java对象。架构上分为三层:接口层、核心处理层和基础支撑层。

  1. 接口层:提供SqlSession和Mapper接口,SqlSessionFactory用于创建SqlSession,而Mapper接口通过动态代理实现。

  2. 核心处理层:包括配置解析、SQL解析、动态SQL、参数映射、SQL执行和结果映射。其中,Executor负责执行SQL,ParameterHandler处理参数,ResultSetHandler处理结果集。

  3. 基础支撑层:提供数据源、事务、缓存、日志等基础功能。

MyBatis的工作流程是:首先加载配置,构建Configuration;然后创建SqlSession和Executor;通过MapperProxy代理Mapper接口的方法调用;最后通过Executor执行SQL并映射结果。

 

posted @ 2026-01-17 15:20  邓维-java  阅读(61)  评论(0)    收藏  举报