Mybatis
支持定制化 SQL、存储过程以及高级映射的半自动轻量级持久层框架。
核心“对象关系映射”。用于实现面向对象编程语言里不同系统的数据之间的转换。
步骤
①创建session工厂;->②通过session工厂创建session对象;->③通过session对象获取mapper代理对象;->④通过mapper代理执行crud;->⑤执行成功,使用session提交事务;->⑥执行失败,回滚;->⑦关闭会话。
动态sql执行原理
使用OGNL表达式,从Sql对象中计算表达式值,根据表达式值动态完成拼接Sql。
Mapper接口方法能重载吗?
不能
映射文件先通过接口全限定名,找到对应接口,接口与映射文件完成映射通过接口的全限定名+方法名作为key去对应(即映射文件的id)
扩展:mapper接口方法能重写吗?
能
类似mapper接口继承baseMapper接口。
XML Mapper文件中,不同的XML映射文件,id是否可以重复?
不同的XML Mapper文件,如果配置了namespace(即接口全限定名),那么id可以重复,如果没有配置namespace,那么id就不能重复。
#{}和${}的区别
#{}:参数占位符,会被替换成?;
${}:变量占位符,属于静态文本替换,用于标签属性值和sql内部, ${ } 变量的替换阶段是在动态 SQL 解析阶段。
Mybatis是如何进行分页的?分页插件的原理是什么?
①使用RowBounds对象针对结果集执行内存分页,非物理分页;
②通过分页插件实现分页,在插件拦截方法内拦截待执行的sql,例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10
延迟加载
仅支持一对多延迟加载,在配置文件中设置lazyLoadingEnabled=true|false;
使用CGLIB创建代理对象,进行拦截,拦截器invoke()方法发现集合对象是null值后,然后单独查询集合对象Sql,再进行赋值。
一级缓存
作用在session中,当session刷新或者关闭之后,缓存就会清空,默认打开一级缓存,结合springboot,springboot中sqlsession执行完sql后会关闭session,导致一级session失效。
二级缓存
默认不开启,实现二级缓存对象必须序列化,二级缓存开启后,同一命名空间的操作都会影响共同的缓存,即全局变量。执行流程:①请求、②二级缓存、③一级缓存、④数据库。
扩展
Mybatis-Plus
在mybaits的基础上做了增强,理念“为快速而生”。
特性
1)无侵入:只针对做了增强,不会对现有工程有影响;
2)损耗小:自带基本的CRUD,针对java特性展开(即“面向对象”);
3)支持 Lmbda表达式:例:new LambdaQueryWrapper<XXX类>();
4)支持主键自动生成:内置主键策略(①雪花算法;②自定义主键策略;③局部注解配置策略;④全局配置策略;⑤扩展使用)
5)内置多种类型插件:如分页插件、性能分析插件、全局拦截插件等
雪花算法扩展
应用场景:解决分布式环境下,主键生成问题。
优点:
1)高可用:生成不依赖数据库,内存中生成;
2)容量大:每秒能生成百万自增id;
3)ID自增:索引高效。为什么使用雪花算法?
①UUID:本地生成,性能好,无网络消耗,但是是无序的,基于innerdb引擎容易造成索引分裂;
②数据库自增:先判断是否存在,存在先删除后新增,不好的一点是性能差;
③基于redis:redis本身就是单线程,保证原子性,但是配置和维护麻烦。