Mybatis

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本身就是单线程,保证原子性,但是配置和维护麻烦。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值