CC 咖啡猫的工作空间 Coding Space
  1. mybatis解决的问题:jdbc模板写法封装、sql原生硬编码(改进:sql在xml中管理),参数与结果映射
  2. 核心组件:
  • 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、参数类型、返回类型
  1. 执行流程:sqlsession()->executor()->statementHandler.prepare(准备处理jdbc statement)->parameterHandler(绑定参数)->statementHandler.query(执行sql)->resultSetHandler.handleResultSets(映射结果到对象)->返回结果
  2. mapper接口的代理机制: MapperProxy实现了InvocationHandler接口,方法调用时把namespace+methodName+args拼接成 mybatis的 statementId,通过key调用sqlsession对应的方法
  3. 动态sql:if条件、where、choose when otherwise、foreach、set和trim、bind自定义变量
  4. 结果映射:自动映射(下划线转驼峰)、ResultMap手动映射、嵌套结果
  5. 缓存:一级缓存(SqlSession级别,mybatis默认开启)、二级缓存(mapper级别,需要配置,存在坑,建议使用redis缓存)
  6. sqlsession:同一个线程 + 同一个事务边界内,Spring 会复用同一个 SqlSession 实例。通常对应一个 @Transactional 方法,或一个未开启新事务的 HTTP 请求(跨线程、跨事务、跨请求,一定是不同的 SqlSession,L1依赖于sqlsession)
  7. 插件机制(基于Mybatis的四层结构,比如分页插件)
  • Excutor: update/query方法,增强拦截器本身。常用于sql重写、慢sql日志
  • StatementHandler: prepare/parameterize/query/update,常用于sql拦截、参数处理
  • ParameterHandler: getProperty,常用于处理参数转换
  • ResultSetHandler: handleResultSet/handleOutputParameters,常用于结果转换