zoukankan      html  css  js  c++  java
  • MyBatis

    ${}和#{}的区别是什么?

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

    Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

    Mybatis在处理${}时,就是把${}替换成变量的值;

    使用#{}可以有效的防止SQL注入,提高系统安全性。

    参考:https://www.cnblogs.com/JiHC/p/12845466.html

    分页插件的原理是什么?

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

    参考:https://www.cnblogs.com/JiHC/p/12845466.html

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

    一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

    二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置

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

    参考:https://www.cnblogs.com/JiHC/p/12845466.html

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

    Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

    它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

    当然了,不光是Mybatis,几乎所有的包括Hibernate,支持延迟加载的原理都是一样的。

    参考:https://www.cnblogs.com/JiHC/p/12845466.html

  • 相关阅读:
    go开发环境配置
    Go环境配置
    为什么Redis集群有16384个槽【转发】
    Spring Cloud Hystrix降级处理超时时间设置
    win10下查看进程,杀死进程【转载】
    SpringCloud的各种超时时间配置效果
    解决springcloud Feign项目中遇到的timeout请求超时的问题【转载】
    数据库索引
    XML
    JDBC
  • 原文地址:https://www.cnblogs.com/gkgkgk/p/13565959.html
Copyright © 2011-2022 走看看