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基础的主要内容,如果未能解决你的问题,请参考以下文章
SSM-MyBatis-05:Mybatis中别名,sql片段和模糊查询加getMapper