zoukankan      html  css  js  c++  java
  • Mybatis

    1.Mybatis中#{}和${}的区别是什么?

      #{}是预编译处理,${}是字符串替换。

      使用#{}时,Mybatis会将sql中#{}替换成?号,配合PreparedStatement的set方法赋值,这样可以有效的防止sql注入,保证程序的运行安全。

    2.Mybatis有几种分页方式?

      Mybatis有两种分页方式:逻辑分页和物理分页

      逻辑分页:使用Mybatis自带的RowBounds进行分页,它是一次性查询很多数据,然后在数据中进行检索。

      物理分页:自己手写分页sql或使用分页插件PageHelper,去数据库查询指定条数的分页数据。

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

      RowBounds表面上是在所有数据中检索数据,其实并非是一次性查询出所有数据,因为Mybatis是对jdbc的封装,在jdbc驱动中有一个Fetch Size的配置,它规定了每次最多从数据库查询多少条数据,假如你要查询更多数据,它会在你执行next()的时候,在去查询更多数据。只是对于 jdbc 来说,当你调用next()的时候会自动帮你完成查询工作。这样做的好处可以有效的防止内存溢出。

    4.Mybatis逻辑分页和物理分页的区别是什么?

      逻辑分页:一次性查询很多数据,如何在结果中检索分页的数据。这样做需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。

      物理分页:从数据库查询指定条数的数据,有效的防止了一次性全部查询出所有数据所带来风险。

    5.Mybatis是否支持延迟加载?延迟加载的原理是什么?

      Mybatis支持延迟加载,设置lazyLoadingEnabled=true即可。

      延迟加载的原理是在调用的时候触发加载,而不是在初始化的时候就加载信息。比如调用a.getB().getName(),这个时候发现a.getB()的值为null,就会单独触发事先保存好的关联B对象sql,先查出B,再调用a.set(B),而这个时候再调用a.getB().getName()就有值了,这就是延迟加载的原理。

    6.说一下Mybatis的一级缓存和二级缓存?

      一级缓存:基于PerpetualCache的HashMap本地缓存,它的声明周期是和sqlSession一致的,有多个sqlSession或者分布式的环境中数据库操作,可能会出现脏数据。当Session flush或者close之后,该Session中的所有Cache就将清空,默认一级缓存是开启的。

      二级缓存:也是基于PerpetualChache的HashMap本地缓存,不同在于其存储作用域为Mapper级别的,如果多个sqlSession之间需要共享缓存,则需要使用到二级缓存,并且二级缓存可自定义存储源,如Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类要实现Serializable序列化接口(可用来保存对象的状态)。

      开启二级缓存数据查询流程:二级缓存 -> 一级缓存 -> 数据库。

      缓存更新机制:当某一个(一级缓存Session/二级缓存Mapping)进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear。

    7.Mybatis和Hibernate的区别有哪些?

      灵活性:Mybatis更加灵活,自己可以写sql语句,使用起来方便。

      可移植性:Mybatis有很多自己写的sql,因为每个数据库的sql可以不相同,所以可移植性比较差。

      学习和使用门槛:Mybatis入门比较简单,使用门槛也很低。

      二级缓存:Hibernate拥有更好的二级缓存,它的二级缓存可以自行更换为第三方的二级缓存。

    8.Mybatis有哪些执行器?

      Mybatis有三种基本的Executor执行器

    • SimpleExecutor:每执行一次update或select就开启一个Statement对象,用完立刻关闭Statement对象。
    • ReuseExecutor:执行update或selest,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后不关闭Statement对象,而是放置于Map内供下次使用。就是重复使用Statement对象。
    • BatchExecutor:执行update(没有select,jdbc批量处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理,与jdbc批处理相同。

    9.Mybatis分页插件的实现原理是什么?

      分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

  • 相关阅读:
    农历
    成熟度模型-数据安全
    vscode升级go插件
    关于作者
    SpringBoot入门十二(整合之项目打包部署运行)
    SpringBoot入门十一(整合之RedisTemplate的使用)
    SpringBoot入门十(整合之Junit测试)
    SpringBoot入门九(整合之通用mapper)
    SpringBoot入门八(整合之mybatis)
    SpringBoot入门七(整合之事务和连接池)
  • 原文地址:https://www.cnblogs.com/bl123/p/15002855.html
Copyright © 2011-2022 走看看