mybatis基础

Posted Cessi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis基础相关的知识,希望对你有一定的参考价值。

SSM三层结构:SpringMvc,Spring,Mybatis

定义

是一个持久层框架,封装了jdbc的源码,将sql语句与xml或者注解来配置和映射SQL信息

ORM定义

对象-关系映射,用于把对象模型表示的对象映射到基于SQL的关系型数据库结构中。这样操作数据库的时候,只需要操作对象的实体与属性方法。mybatis只是一个半自动化的ORM

关联查询

一对一:association标签

一对多:collection标签

延迟加载

延迟加载也称为懒加载,在进行关联查询的时候,推迟关联对象的select查询,减小数据库压力

侵入式加载:执行主加载的时候,不会执行关联对象的查询。当访问主加载对象某个属性时,马上执行关联对象的查询。

深度延迟加载:在访问关联对象详情时,才会执行关联对象查询

<settings>
  <!--延迟加载总开关-->
  <setting name="lazyLoadingEnabled" value="true">
  <!--侵入式延迟加载,此条关闭的时候为深度-->
  <setting name="aggressiveLazyLoading" value="true">
</settings> 

原理:动态代理

导致的问题:N+1问题,主信息加载一次,从信息去从表查询多次。也就是常说的循环内写sql

mybatis缓存

默认只开启一级缓存

一级缓存

生命周期:sqlSession层面缓存,默认开启。session关闭一级缓存清空。

维护:SqlSession→Executor→PerpetualCache

在同一个会话里,多次执行相同的sql,不会重复发送。

问题:在分布式环境,不同的会话对相同的查询语句有不一样的缓存,存在脏数据。

二级缓存

作用域为namespace级别,可以被多个sqlSession共享,生命周期与应用同步。

取数据顺序:二级缓存→一级缓存→数据库

维护:CachingExecutor装饰类

 

配置:

1.mybatis.configuration.cache-enabled=true

2.在具体的mapper.xml中配置cache标签

<cache type="org.apache.ibatis.cache.impl.PerpetualCache"
    size="1024"
eviction="LRU"
flushInterval="120000"
readOnly="false"/>

注意事项:

二级缓存是事务性的,事务回滚,缓存会更新

事务不提交二级缓存不存在

适用于查询为主的应用中,例如历史订单,历史查询

多个namespace操作同一个表,会产生数据不一致的脏数据,如果开启二级缓存建议namespace中单表语句全部包含

二级缓存需要将对象进行序列化

以上是关于mybatis基础的主要内容,如果未能解决你的问题,请参考以下文章

从源码层面分析Mybatis中Dao接口和XML文件的SQL是如何关联的

英语语法讲解第一课句子成分-表语

表语和宾语的区别

扩展样式表语言-XSL

定语与表语的区别

二十八动词不定式 2 做表语宾语后置定语状语