Java面试题之Mybatis

导读:本篇文章讲解 Java面试题之Mybatis,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

十三、Mybatis

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

前者会将传入的数据当成字符串,在之前加入双引号,后者是直接将数据显示在sql中
前者会当做占位符,防sql注入,后者不能

126. mybatis 有几种分页方式?

两种,一种是内存分页,一种是物理分页
内存分页:    一次性查询出所有满足条件的数据,临时保存在集合中,通过List的subList的方式获取分页数据.
物理分页:    借助sql进行分页或者利用拦截器分页

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

不是,因为mybatis是对JDBC的封装,在JDBC的驱动中有一个Fetch Size的配置,它规定了每次最多从数据库查询多少条数据.这样做可以防止内存溢出.

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

逻辑分页一次性查询很多数据,然后再结果中检索分页的数据,消耗内存.
物理分页是从数据库查询指定条数的数据.

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

支持,在配置文件的<settings/>标签中设置<setting name=”lazyLoadingEnabled” value=”true”/>就可以激活
    原理:    在调用的时候出发加载,而不是在初始化的时候加载信息.如a.getB().getName(),如果a.getB()的值为null,会触发保存好的关联B对象的sql语句查询出B,然后再调用getName().

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

  •  一级缓存是SqlSession级别的,在一个sqlsession中,第一次查询缓存中是否有数据,没有就会查询数据库,并将数据保存在一级缓存中.第二次去查的时候会直接从缓存中查询.如果这中间sqlsession进行了commit操作则会清空缓存.
  • 二级缓存是Mapper级别的,多个sqlsession共享,默认关闭.它基于Mapper文件的namespace,如果两个mapper的namespace相同,那么会共享缓存的数据.使用二级缓存要在配置文件中开启,并且序列化po类.

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

 mybatis灵活,可以写sql,hibernate学习困难

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

  1. SimpleExecutor:每执行一次 update 或 select 就开启一个 Statement 对象,用完立刻关闭 Statement 对象
  2. ReuseExecutor:执行update或select以SQL作为key查找Statement对象,存在就使用,不存在就创建,用完后不关闭,可以重复使用
  3. BatchExecutor:执行update(没有select,jdbc批处理不支持select)时,将所有SQL都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象.

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

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

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

只需实现Interceptor接口,并指定要拦截的方法签名

    @Intercepts({
    @Signature(
        type=Executor.class,method="update",args={ MappedStatement.class,Object.class })})
    public class ExamplePlugin implements Interceptor {
        public Object intercept(Invocation invocation) throws Throwable {
           //自定义实现
           return invocation.proceed();
        }
        public Object plugin(Object target){
            return Plugin.wrap(target,this)
        }
        public void setProperties(Properties properties){
          //传入配置项
          String size = properties.getProperty("size");
        }
    }
    <!-- mybatis-config.xml -->
    <plugins>
        <plugin interceptor="org.mybatis.example.ExamplePlugin">
            <!-- 这里的配置项就传入setProperties方法中 -->
            <property name="size" value="100">
        </plugin>
    </plugins>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96999.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!