Mybatis

重新认识Mybatis框架

2019-11-09  本文已影响0人  先生zeng

定义与认识

三句话:
MyBatis是一流的持久性框架,支持自定义SQL,存储过程和高级映射。
MyBatis消除了几乎所有的JDBC代码以及参数和检索的手动设置。
MyBatis可以使用简单的XML或注释进行配置,并将图元,映射接口和Java POJO(普通的旧Java对象)映射到数据库记录。

image.png

方式

  1. 编程式 使用自带api,进行操作。

2.集成式,manager集成spring进行数据库操作。

两种配置方式

1.xml配置

2.注解式

工作中如何使用

1.分析业务
2.定义表结构
3.generator 生成我们需要的类。

generator : 就是一个可以自动扫描数据库中对应的表,生成对应的Vo对象和mapper对象的技术。
使用:

  1. pom.xml 配置generator插件.
  2. 配置 generatorConfig.xml
  3. 执行 mvn mybatis-generator:generate
  4. 生成Bean和Example

每个sqlSession的四个scope,区别:


Mapper使用的两种方式:

xml和annotation形式

  1. 兼容? 兼容形式  互补,可以同时存在,不能有相同mapper的id
  2. Pros vs cons


Config文件部分解读 http://www.mybatis.org/mybatis-3/configuration.html

  1. Environment

  2. TypeHandler (java和表字段类型的转换实现)
    a) 定义com.gupao.dal.typehandlers.TestTypeHandle
    b) 注册com.gupao.dal.config.MybatisConfig#localSessionFactoryBean

    c) 注册到使用字段上
  3. Plugins

    拦截范围
    a) 定义 com.dal.plugins.TestPlugin

    b) 注册 com.dal.config.MybatisConfig#localSessionFactoryBean
    c) 使用。

关于配置文件 解读。

mapper文件解读

  1. namespace
    关联到接口方法,区分类似package的作用

  2. resultMap/resultType
  3. sql

  4. select insert update delete 增删改查的sql语句
  5. 使用动态SQL,就是sql语句包含逻辑判断。
    http://www.mybatis.org/mybatis-3/dynamic-sql.html

  6. 关于缓存,可以设置,第二次查询,若无其他非查询操作,走缓存,不会去查数据库。一级二级指的是scope级别

a) 一级缓存(sqlSession)

基于sqlSession默认开启,在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。
一级缓存的作用域是SqlSession范围的,当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存)
第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。



如何验证,先执行查询一条sql,发现有日志打印,在执行第二次同样的sql,发现这时候没有打印sql,因为mybatis根据第一条sql,把该sql存入缓存了,这时候不会再编译执行sql去数据库取数据,自然没有打印。

b) 二级缓存(mapper级别)
使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用HashMap进行数据存储。相比一级缓存SqlSession,二级缓存的范围更大,多个Sqlsession可以共用二级缓存,二级缓存是跨SqlSession的
二级缓存的作用域是mapper的同一个namespace。不同的sqlSession两次执行相同的namespace下的sql语句,且向sql中传递的参数也相同,即最终执行相同的sql语句,则第一次执行完毕会将数据库中查询的数据写到缓存,第二次查询会从缓存中获取数据,不再去底层数据库查询,从而提高效率。

在**Mapper.xml中开启当前mapper的namespace下的二级缓存

代表创建了一个LRU缓存,并每隔60秒刷新,最大存储512个对象,而且返回的对象被认为是只读的。
evicition收回策略,默认是LRU

回收策略如下:
(1)LRU最近最少使用策略,一处做长时间不被使用的对象。
(2)FIFO先进先出策略,按对象进入缓存的顺序来移除它们。
(3)SOFT软引用策略,移除基于垃圾回收器状态和软引用规则的对象。
(4)WEAK弱引用策略,更积极地移除基于垃圾收集器状态和弱引用规则的对象

如何进行分页的方式

a) 逻辑分页
org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleRowValuesForSimpleResultMap 内存里分页
b) 物理分页
i. select … limit 0,10;
ii. 分页插件 https://github.com/pagehelper/Mybatis-PageHelper

批量操作

整体架构图:


上一篇 下一篇

猜你喜欢

热点阅读