Mybatis杂谈


活动地址:CSDN21天学习挑战赛

MyBatis

Mybatis

iBATIS 的着⼒点,则在于POJO 与SQL之间的映射关系。然后通过映射配置⽂件,将SQL所需的参数,以及返回的结果字段映射到指POJO。 相对Hibernate“O/R”⽽⾔,iBATIS 是⼀种“SqlMapping”的ORM实现。

Mybatis优势

MyBatis可以进⾏更为细致的SQL优化,可以减少查询字段。
MyBatis容易掌握,⽽Hibernate⻔槛较⾼。

解释⼀下MyBatis中命名空间(namespace)的作⽤。

答:在⼤型项⽬中,可能存在⼤量的SQL语句,这时候为每个SQL语句起⼀个唯⼀的标识(ID)就变得并不容易了。为了解决这个问题,在MyBatis中,可以为每个映射⽂件起⼀个唯⼀的命名空间,这样定义在这个映射⽂件中的每个SQL语句就成了定义在这个命名空间中的⼀个ID。
只要我们能够保证每个命名空间中这个ID是唯⼀的,即使在不同映射⽂件中的语句ID相同,也不会再产⽣冲突了。

MyBatis中的动态SQL是什么意思?

答:对于⼀些复杂的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不存在,例如在58同城上⾯找房⼦,我们可能会指定⾯积、楼层和所在位置来查找房源,也可能会指定⾯积、价格、⼾型和所在位置来查找房源,此时就需要根据⽤⼾指定的条件动态⽣成SQL语句。
如果不使⽤持久层框架我们可能需要⾃⼰拼装SQL语句,还好MyBatis提供了动态SQL的功能来解决这个问题。MyBatis中⽤于实现动态SQL的元素主要有:

  • if
  • choose / when / otherwise
  • trim
  • where
  • set
  • foreach

Mybatis调优⽅案

MyBatis在Session⽅⾯和Hibernate的Session⽣命周期是⼀致的,同样需要合理的Session管理机制。MyBatis同样具有⼆级缓存机制。MyBatis可以进⾏详细的SQL优化设计。

MyBatis缓存

MyBatis 包含⼀个⾮常强⼤的查询缓存特性,它可以⾮常⽅便地配置和定制。MyBatis 3 中的缓存实现的很多改进都已经实现了,使得它更加强⼤⽽且易于配置。默认情况下是没有开启缓存的,除了局部的session 缓存,可以增强变现⽽且处理循环 依赖也是必须的。要开启⼆级缓存,你需要在你的 SQL 映射⽂件中添加⼀⾏: 字⾯上看就是这样。这个简单语句的效果如下:
映射语句⽂件中的所有 select 语句将会被缓存。映射语句⽂件中的所有 insert,update 和 delete 语句会刷新缓存。缓存会使⽤ LeastRecently Used(LRU,最近最少使⽤的)算法来收回。根据时间表(⽐如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。缓存会存储列表集合或对象(⽆论查询⽅法返回什么)的 1024 个引⽤。缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,⽽ 且可以安全地被调⽤者修改,⽽不⼲扰其他调⽤者或线程所做的潜在修改。所有的这些属性都可以通过缓存元素的属性来修改。⽐如: 这个更⾼级的配置创建了⼀个 FIFO 缓存,并每隔 60 秒刷新,存数结果对象或列表的 512 个引⽤,⽽且返回的对象被认为是只读的,因此在不同线程中的调⽤者之间修改它们会 导致冲突。可⽤的回策略有,默认的是 LRU:LRU ‒ 最近最少使⽤的:移除最⻓时间不被使⽤的对象。
FIFO ‒ 先进先出:按对象进⼊缓存的顺序来移除它们。
SOFT ‒ 软引⽤:移除基于垃圾回收器状态和软引⽤规则的对象。
WEAK ‒ 弱引⽤:更积极地移除基于垃圾收集器状态和弱引⽤规则的对象。

flushInterval(刷新间隔)可以被设置为任意的正整数,⽽且它们代表⼀个合理的毫秒 形式的时间段。默
认情况是不设置,也就是没有刷新间隔,缓存仅仅调⽤语句时刷新。
size(引⽤数⽬)可以被设置为任意正整数,要记住你缓存的对象数⽬和你运⾏环境的 可⽤内存资源数
⽬。默认值是1024。
readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调⽤者返回缓 存对象的相同实
例。因此这些对象不能被修改。这提供了很重要的性能优势。可读写的缓存 会返回缓存对象的拷⻉
(通过序列化) 。这会慢⼀些,但是安全,因此默认是 false。
6.25、使⽤ Mybatis 时,调⽤ DAO接⼝时是怎么调⽤到 SQL 的?
🔊 https://www.bilibili.com/video/BV1dY4y1Y7pC?p=45
简单点说,当我们使⽤ Spring+MyBatis 时:
1、DAO接⼝会被加载到 Spring 容器中,通过动态代理来创建
2、XML中的SQL会被解析并保存到本地缓存中,key是SQL 的 namespace + id,value 是SQL的封装
3、当我们调⽤DAO接⼝时,会⾛到代理类中,通过接⼝的全路径名,从步骤2的缓存中找到对应的
SQL,然后执⾏并返回结果
6.26、springmvc的核⼼是什么,请求的流程是怎么处理的,控制反转怎
么实现的
springmvc是基于servlet的前端控制框架,核⼼是ioc和aop(基于spring实现)
核⼼架构的具体流程步骤如下:
1、⾸先⽤⼾发送请求⸺>DispatcherServlet,前端控制器收到请求后⾃⼰不进⾏处理,⽽是委托给
其他的解析器进⾏
处理,作为统⼀访问点,进⾏全局的流程控制;
2、DispatcherServlet⸺>HandlerMapping, HandlerMapping 将会把请求映射为
HandlerExecutionChain 对象(包含⼀个Handler 处理器(⻚⾯控制器)对象、多个
HandlerInterceptor 拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、DispatcherServlet⸺>HandlerAdapter,HandlerAdapter 将会把处理器包装为适配器,从⽽⽀
持多种类型的处理器,即适配器设计模式的应⽤,从⽽很容易⽀持很多类型的处理器;
4、HandlerAdapter⸺>处理器功能处理⽅法的调⽤,HandlerAdapter 将会根据适配的结果调⽤真
正的处理器的功能处
理⽅法,完成功能处理;并返回⼀个ModelAndView 对象(包含模型数据、逻辑视图名);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值