Dev Guide / Java开发技术guide / 框架
content/dev-guide/a-Java开发技术guide/03-框架/1-mybatis.md
- mybatis解决的问题:jdbc模板写法封装、sql原生硬编码(改进:sql在xml中管理),参数与结果映射
- 核心组件:
- SqlSessionFactoryBuilder:创建SqlSessionFactory,从XML或配置对象中加载
- SqlSessionFactory:创建SqlSession,每个Factory实例对应一个数据库
- SqlSession:Mybatis核心API,执行sql,管理事务
- Executor:sql执行器,负责调用 StatementHandler
- StatementHandler:处理 jdbc statement,参数设置、sql执行
- ParameterHandler:参数处理,将Java参数转为JDBC参数
- ResultSetHandler:结果集处理,将JDBC结果集转为Java对象
- MapperProxy:Mapper接口的动态代理,拦截方法调用
- MapperStatement:SQL配置的封装,包含sql、参数类型、返回类型
- 执行流程:sqlsession()->executor()->statementHandler.prepare(准备处理jdbc statement)->parameterHandler(绑定参数)->statementHandler.query(执行sql)->resultSetHandler.handleResultSets(映射结果到对象)->返回结果
- mapper接口的代理机制: MapperProxy实现了InvocationHandler接口,方法调用时把namespace+methodName+args拼接成 mybatis的 statementId,通过key调用sqlsession对应的方法
- 动态sql:if条件、where、choose when otherwise、foreach、set和trim、bind自定义变量
- 结果映射:自动映射(下划线转驼峰)、ResultMap手动映射、嵌套结果
- 缓存:一级缓存(SqlSession级别,mybatis默认开启)、二级缓存(mapper级别,需要配置,存在坑,建议使用redis缓存)
- sqlsession:同一个线程 + 同一个事务边界内,Spring 会复用同一个 SqlSession 实例。通常对应一个 @Transactional 方法,或一个未开启新事务的 HTTP 请求(跨线程、跨事务、跨请求,一定是不同的 SqlSession,L1依赖于sqlsession)
- 插件机制(基于Mybatis的四层结构,比如分页插件)
- Excutor: update/query方法,增强拦截器本身。常用于sql重写、慢sql日志
- StatementHandler: prepare/parameterize/query/update,常用于sql拦截、参数处理
- ParameterHandler: getProperty,常用于处理参数转换
- ResultSetHandler: handleResultSet/handleOutputParameters,常用于结果转换