​ ​

活动地址: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的元素主要有:

ifchoose / when / otherwisetrimwheresetforeach

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 对象(包含模型数据、逻辑视图名);

好文链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: