MyBatis

1 JDBC的执行流程

  1. 加载JDBC驱动
  2. 建立并获取数据库连接connection
  3. 创建JDBC Statements对象
  4. 设置SQL语句的传入参数
  5. 执行SQL语句并获得查询结果
  6. 对查询结果进行转换处理并将处理结果返回
  7. 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)

2 对mybatis的整体理解

MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis可以对配置和原生Map使用简单的XML或注解,将接口和Java的POJO映射成数据库中的记录。

3 Mybatis与Hibernate有什么区别?

  1. mybatis的着力点在于POJO和SQL之间的映射关系,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。
  2. Hibernate的ORM实现了POJO和数据库表之间的映射,以及SQL的自动生成和执行,也就是说Hibernate会根据制定的存储逻辑,自动生成对应的SQL并调用JDBC接口加以执行。
  3. 开发对比:
    - mybatis框架相对简单容易上手,针对高级查询,Mybatis需要手动编写SQL语句。
    - Hibernate有良好的的映射机制,开发者无需关心SQL的生成与结果映射,可以更关注业务流程。
  4. 调优方案
    - mybatis可以进行详细的SQL优化设计,采用合理的session管理机制。
    - Hibernate可以指定合理的缓存策略;尽量采用延迟加载特性;采用合理的session管理机制;采用批量抓取,设定合理的批处理参数。
  5. 扩展性方面
  • mybatis项目中的所有SQL语句都是依赖所用的数据库的,所以不同数据库类型的支持不好。
  • Hibernate与具体数据库的关联只需在XML文件中配置即可,所有的HQL语句与具体使用的数据库无关,移植性很好。
  1. 缓存机制
    mybatis默认情况下只开启一级缓存(sqlSession级别);
    - 要开启二级缓存,需要在sql配置文件设置cacheEnable=true,并且sql映射文件中加上 <cache/> 标签;
    - 映射文件中的所有select语句将会缓存,映射文件中的所有insert/update/delete会刷新缓存;
    - 缓存默认会使用LRU(最近最少使用)算法来回收;
    - 缓存默认会存储列表集合中对象的1024个引用;
    - 缓存默认会被视为read/write(可读可写)缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不干扰其他调用者
    Hibernate的一级缓存是Session缓存,
    - 利用好一级缓存就需要对Session的生命周期进行管理好;
    - 二级缓存是SessionFactory级的缓存,分为内置缓存和外置缓存。

4 mybatis执行SQL的流程

加载配置->解析SQL->执行SQL->结果映射->释放连接

  1. 加载配置并初始化 加载配置文件,将SQL配置信息加载成为一个个MappedStatement对象(包括传入参数映射配置,执行的sql语句,结果映射的配置),存储在内存中。
  2. 传递调用请求: 调用Mybatis提供的API,传入SQL的ID和参数对象,将请求传递给下层的请求处理层进行处理。
  3. 处理请求:
  • 根据SQL的ID查找到对应的MappedStatement对象;
  • 根据传入的参数对象解析MappedStatement对象,得到最终要执行的SQL和执行参数;
  • 获取数据库连接,根据得到的SQL语句和执行参数到数据库中执行,并得到执行结果;
  • 根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,得到最终的处理结果;
  • 释放连接资源,将最终的结果返回。

5 mybatis初始化过程

Myabtis初始化的过程就是创建Configuration对象的过程。

  1. 加载配置文件mybatis-config.xml到Mybatis内部
  2. 使用Configuration对象作为一个所有配置信息的容器,这个对象的组织结构和XML配置文件的组织结构几乎完全一样,这样配置文件的信息就可以存到这个对象中,访问起来很方便。

6 mybatis有哪些核心的类

  1. SqlSessionFactoryBuilder 这个类的主要作用是创建一个SqlSessionFactory,可以重用这个类来创建多个SqlSessionFactory实例,但是最好不要让其一直存在以保证所有的XML解析资源开放给更重要的事情。这个类可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory,就不再需要它了。
  2. SqlSessionFactory 它的作用就是sql会话工厂,用于创建SqlSession。SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,它的最佳作用域是应用作用域。
  3. SqlSession 它是mybatis的一个重要接口,定义了数据库的增删改查以及事务管理的常用方法。SqlSession还提供了查找Mapper接口的有关方法。每个线程都应该有自己的SqlSession实例,因为这个实例不是线程安全的,所以它的最佳作用域是请求或方法作用域。每次收到一个HTTP请求,就可以打开一个SqlSession,返回了响应之后就关闭它.
  4. Mapper Mapper接口是指程序员自行定义的一个数据操纵接口,类似于通常所说的DAO接口。Mapper接口只需要定义不需要实现,mybatis会自动为Mapper接口创建动态代理对象。Mapper接口的方法通常与Mapper配置文件中的select、insert、update和delete等XML节点存在一一对应关系。

7mybatis的层次结构图

在这里插入图片描述

8 mybatis源码中的主要部件

  1. SqlSession:作为mybatis工作的主要顶层API,表示和数据库交互的会话,完成必要的数据库增删改查功能。
  2. Executor:mybatis执行器,是Mybatis调度的核心,负责SQL语句的生成和查询缓存的维护。
  3. StatementHandler:封装了JDBCStatement操作,负责对JDBC Statement的操作。
  4. ParameterHandler:负责对用户传递的参数转换成JDBC Statement所需要的参数。
  5. ResultSetHandler:负责将JDBC返回的ResultSet结果集转换成List类型的集合。
  6. TypeHandler:负责Java数据类型和jdbc数据类型之间的映射和转换。
  7. MappedStatement:维护了一条select/update/delete/insert节点的封装。
  8. Sqlsource:负责根据用户传递的parameterObject,动态生成SQL语句,将信息封装在BoundSql对象中,并返回。
  9. BoundSql:表示动态生成的SQL语句以及相应的参数信息。
  10. Configuration:Mybatis所有的配置信息都维护在这个对象中。

9 #{}和${}的区别

  1. #{}是解析传进来的参数,而${}是拼接参数到SQl中
  2. #{}是预编译处理,而${}是字符串替换
  3. #{}可以防止SQL注入,${}可用于批量删除多个表数据等场景

10 Mybatis缓存

  1. 默认情况下开启一级缓存(SqlSession级别的缓存,也称本地缓存)
  2. 二级缓存(全局缓存)需要手动开启,基于namespace级别
  3. 为了提高扩展性,mybatis定义了Cache接口,用以自定义缓存实现
10.1 一级缓存:

与数据库同一次会话期间查询到的数据会放在本地缓存中,以后如果在同一次会话中需要获取相同数据,直接从缓存中获取。 一级缓存失效的四种情况:
1)sqlsession不同
2)sqlsession相同,条件不同
3)sqlsession相同,但两次查询之间有增删改
4)清除缓存openSession.clearCache()

10.2 二级缓存:

为了不同sqlsession也能获取同一缓存的数据

  1. sqlsession会话关闭/提交时,一级缓存中的数据才会存到二级缓存中
  2. 使用方式
  • config.xml中设置 cacheEnable=true;
  • 在mapper.xml中设置 <cache /> <cache />属性: eviction:缓存的回收策略
    • FIFO-先进先出
    • LRU -最少使用(默认)
    • SOFT-软引用 移除基于垃圾回收器状态和软引用规则对象
    • WEAK-弱引用
      flushInterval:缓存刷新间隔(ms)默认不清空 readOnly:只读 true/false
  1. bean需要实现序列化接口
10.3 和缓存相关的属性
  1. cacheEnable=true/false 开启或关闭全局二级缓存
  2. 每个sql上面的useCache=true/false 开启或关闭单个sql的二级缓存
  3. 每个sql的flushCache=true/false 一二级缓存都会清除
  4. sqlSession.clearCache() 只是清除当前sqlSession的缓存
  5. localCacheScope:本地缓存作用域 session-当前session内的对象可用; statement-可以警用一级缓存
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值