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

  • 相关阅读:
    pytorch常用知识记录
    kotlin的by lazy
    【笔耕不辍勋章活动】生命不止,写作不息
    在亚马逊云科技Amazon SageMaker上进行Stable Diffusion模型训练和推理
    数据结构 专项练习
    师德师风演讲稿写作格式:如何用三句话吸引听众的注意力
    21天学习挑战:经典算法---算法概念引入
    使用 Shell 脚本定期检查 MySQL 服务是否正常运行
    P9656 [ICPC2021 Macao R] So I‘ll Max Out My Constructive Algorithm Skills
    【PHP】Workerman开源应用容器的GatewayWorker 与 iOS-OC对接
  • 原文地址:https://blog.csdn.net/weixin_43189971/article/details/126457374