框架2 MyBatis

参考:
MyBatis结构和组件 https://www.jianshu.com/p/75a6a2297c69
MyBatis运行流程、缓存和插件 https://www.jianshu.com/p/4fe280c44294
MyBatis缓存
https://www.jianshu.com/p/7a98dda8cd75
https://www.jianshu.com/p/8801d1aa20a0
MyBatis常见面试题 https://blog.csdn.net/a745233700/article/details/80977133

一.MyBatis概述

1.MyBatis
  • 支持普通SQL查询、存储过程和高级映射的持久层框架
  • 消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的封装
  • MyBatis可使用XML或注解进行配置,将接口和Java的POJO映射成数据库记录
  • 专注于Sql本身,适用于对性能要求很高或需求变化较多的项目
2.MyBatis特点
  • 优点
    1)简单易学。MyBatis本身小而简单
    2)灵活。MyBatis允许自由编写Sql语句
    3)Sql和程序代码解耦,且提供xml标签支持编写动态sql
    4)提供映射标签,支持对象与数据库的ORM字段关系映射
    5)与JDBC相比,减少了50%以上的代码量
  • 缺点
    1)自由编写Sql语句意味较大的工作量
    2)Sql语句依赖于数据库,导致数据库无法随意更换,移植性差

二.MyBatis原理

1.MyBatis功能结构
  • API接口层
    开发人员通过接口API操纵数据库,接口层接收请求后会调用数据处理层完成具体的数据处理
  • 数据处理层
    根据API接口层调用的请求完成一次数据库操作,负责具体的Sql查找、Sql解析和执行结果映射处理等
  • 基础支撑层
    实现连接管理、事务管理和执行结果映射处理等基础功能,为数据处理层提供基础支持
框架2 MyBatis_第1张图片
MyBatis功能结构
2.MyBatis运行流程
  • 加载配置
    从配置文件或注解获取配置信息并加载成MappedStatement对象,此对象=传入参数的映射配置+要执行的Sql语句+结果的映射配置
  • Sql解析
    API接口层接收调用请求时,根据传入的Sql的Id找到对应的MappedStatement,再根据传入的参数对象解析MappedStatement获得最终要执行的Sql语句和参数
  • Sql执行
    获取数据库连接执行Sql解析获得的Sql语句和参数,并返回结果
  • 结果映射
    将数据库返回结果按映射配置转换成需要的数据类型并返回
框架2 MyBatis_第2张图片
MyBatis运行流程
3.MyBatis主要构件
  • SqlSession
    MyBatis主要顶层API,负责和数据库交互的会话,完成增删查改操作
  • Executor
    MyBatis执行器,是MyBatis调度和核心,负责Sql语句生成和查询缓存的维护
  • StatementHandler
    封装了JDBC Statement,负责JDBC中对Statement的操作,如设置参数、将Statement结果集转换为List集合
  • ParameterHandler
    将用户传递的参数转换为JDBC Statement所需的参数
  • ResultSetHandler
    将JDBC返回的ResultSet结果集转换为List集合
  • TypeHandler
    负责Java数据类型和JDBC数据类型间的映射和转换
  • MappedStatement
    维护 select * from orders where order_id=#{id}
    4.每个xml映射文件都有一个Dao接口与之对应,Dao接口的工作原理是什么?Dao接口里的方法在参数不同时是否可以重载?
    • Dao接口即Mapper接口:映射的xml文件的namespace接口的全限定名;映射文件中MappedStatement的id接口的方法名;接口方法的参数就是传递给sql的参数
    • 调用接口方法时,通过接口全限定名+方法名定位唯一的MappedStatement
    • 由于仅使用接口全限定名和方法名定位MappedStatement,故不同参数的接口方法不能重载
    • 此外,不同的xml配置文件,如果设置不同的namespace,则id可重复,否则不可重复
    5.MyBatis是如何进行分页的?分页插件的原理是什么?
    • MyBatis使用RowBounds对象针对ResultSet结果集执行内存分页,也可以在Sql内直接书写带有物理分页的参数实现物理分页
    • 分页插件实现MyBatis提供的插件接口,在插件的拦截方法里拦截并重写待执行的sql
    6.MyBatis动态Sql是做什么的?其执行原理是什么?
    • MyBatis允许在xml映射文件中以标签形式编写动态Sql,完成逻辑判断和动态拼接Sql的功能
    • MyBatis提供 trim | where | set | foreach | if | choose | when | otherwise | bid 9种动态sql标签
    • 执行原理为
      1)使用OGNL从sql参数对象中计算表达式的值
      2)根据表达式值动态拼接Sql
    7.MyBatis是否支持延迟加载?其实现原理是什么?
    • 延迟加载又称懒加载,用于处理N+1性能问题
    • N+1问题指映射集合(resultMap)级联时,我们需要的数据少于数据库查出的数据,浪费性能且加重数据库负担
    • MyBatis仅支持association关联对象(1对1)和collection关联集合(1对多)的延迟加载,配置文件中参数LazyLoadingEnabled=true|false设置是否开启延迟加载
    • MyBatis通过动态代理实现延迟加载
      参考:https://my.oschina.net/wenjinglian/blog/1857581?from=singlemessage
    8.使用MyBatis的mapper接口调用时有哪些要求?
    • Mapper接口方法名和mapper.xml定义的sql的id相同
    • Mapper接口方法的输入参数类型和mapper.xml定义的sql的parameterType类型相同
    • Mapper接口方法的输出参数类型和mapper.xml定义的sql的resultType类型相同
    • Mapper.xml的namespace即是mapper接口的类路径
    9.mapper有哪几种编写方式?
    • 接口实现类继承SqlSessionDaoSupport类
    • 使用org.mybatis.spring.mapper.MapperFactoryBean
    • 使用mapper扫描器
    10.mapper如何传递多个参数?
    • xml使用#{0}接收dao层第一个参数,#{1}接收第二个参数,以此类推
    • 使用@param注解

你可能感兴趣的:(框架2 MyBatis)