zoukankan      html  css  js  c++  java
  • 面试简单整理之mybatis

    125.mybatis 中 #{}和 ${}的区别是什么?

    1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
      
    2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.
      
    3. #方式能够很大程度防止sql注入。
      
    4.$方式无法防止Sql注入。
    
    5.$方式一般用于传入数据库对象,例如传入表名.
      
    6.一般能用#的就别用$.
    
    MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
    View Code

    126.mybatis 有几种分页方式?

    1.数组分页:查询出所有数据,根据返回的list截取 分页
    2.sql分页:在sql语句后面添加limit分页语句。
    3.拦截器分页:自定义拦截器实现了拦截所有以ByPage结尾的查询语句,并且利用获取到的分页相关参数统一在sql语句后面加上limit分页的相关语句,一劳永逸。不再需要在每个语句中单独去配置分页相关的参数了。
    4.RowBounds实现分页:类似于数组分页
    View Code

    127.RowBounds 是一次性查询全部结果吗?为什么?

        是的

    128.mybatis 逻辑分页和物理分页的区别是什么?

      逻辑分页是查出全部结果,利用下标分页, 内存开销大,数据量大时效率低,容易内存溢出;

      物理分页是利用sql直接在数据库中分页,内存开销小,数据量小时比逻辑分页效率低

    129.mybatis 是否支持延迟加载?延迟加载的原理是什么?

     在Mybatis中,通常会进行多表联合查询,但是有的时候并不会立即用到所有的联合查询结果,此时需要一种机制,当需要的时候再查询,这种“按需查询”的机制,就可以使用延迟加载来实现。
    
           延迟加载可以做到,先从单表查询,需要时再从关联表关联查询,这样可以大大提高数据库的性能,因为查询单表要比关联查询多张表速度快。
    View Code

    130.说一下 mybatis 的一级缓存和二级缓存?

    mybatis提供了缓存机制减轻数据库压力,提高数据库性能
    mybatis的缓存分为两级:一级缓存、二级缓存
    一级缓存是SqlSession级别的缓存,缓存的数据只在SqlSession内有效
     具体流程:
          1.第一次执行select完毕会将查到的数据写入SqlSession内的HashMap中缓存起来
          2.第二次执行select会从缓存中查数据,如果select相同切传参数一样,那么就能从缓存中返回数据,不用去数据库了,从而提高了效率
      注意事项:
          1.如果SqlSession执行了DML操作(insert、update、delete),并commit了,那么mybatis就会清空当前SqlSession缓存中的所有缓存数据,这样可以保证缓存中的存的数据永远和数据库中一致,避免出现脏读
          2.当一个SqlSession结束后那么他里面的一级缓存也就不存在了,mybatis默认是开启一级缓存,不需要配置
    
    二级缓存是mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的.
    
    二级缓存是mapper级别的缓存,也就是同一个namespace的mappe.xml,当多个SqlSession使用同一个Mapper操作数据库的时候,得到的数据会缓存在同一个二级缓存区域
    
      二级缓存默认是没有开启的。需要在setting全局参数中配置开启二级缓存
    View Code

    131.mybatis 和 hibernate 的区别有哪些?

    132.mybatis 有哪些执行器(Executor)?

    缓存执行器与非缓存执行器
    
    非缓存执行器
    ExecutorType.SIMPLE:这个执行器类型不做特殊的事情。它为每个语句的每次执行创建一个新的预处理语句。
    ExecutorType.REUSE:这个执行器类型会复用预处理语句。
    ExecutorType.BATCH:这个执行器会批量执行所有更新语句,也就是jdbc addBatch API的facade模式。
    
    
    缓存执行器不是真正功能上独立的执行器,而是非缓存执行器的装饰器模式。
    
    缓存执行器CachingExecutor:缓存执行器相对于其他执行器的差别在于,首先是在query()方法中判断是否使用二级缓存(也就是mapper级别的缓存)。虽然mybatis默认启用了CachingExecutor,但是如果在mapper层面没有明确设置二级缓存的话,就退化为SimpleExecutor了
    View Code

    133.mybatis 分页插件的实现原理是什么?

      通过拦截器实现的物理分页

    134.mybatis 如何编写一个自定义插件?

  • 相关阅读:
    codeforces 686A A. Free Ice Cream(水题)
    bzoj-1192 [HNOI2006]鬼谷子的钱袋(水题)
    poj-3254 Corn Fields(状压dp)
    poj-1185 炮兵阵地(状压dp)
    Notepad++ 小技巧
    使用 notepad++ 编辑器在行首、行尾添加字符
    查看数据库中有大写的表
    Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='
    expect
    shell数组
  • 原文地址:https://www.cnblogs.com/nzxj/p/10470447.html
Copyright © 2011-2022 走看看