Mybatis相关面试题

1、mybatis优缺点有哪些?

优点:

  与JDBC相比,消除JDBC大量冗余代码(加载驱动、创建连接、准备sql、准备Statement、处理结果、关闭连接),不需要手动开关连接。

  与数据库兼容。(MyBatis使用JDBC连接数据库)

  较好集成Spring

  sql写在XML里,从代码程序中解耦合,重用(ResultMap)

  提供XML标间,支持编写动态SQL语句

  提供映射标签,支持对象与数据库的ORM字段关系映射

缺点:

  SQL语句编写工作量大(字段多、关联表多)

  SQL语句依赖数据库,导致数据库移植性差,不能随意更换数据库。

2、mybatis和hibernate有什么区别?

相同点:

  都是由XML配置文件生成SessionFactory,然后由SessionFactory生成Session,最后由Session执行事务和SQL语句

  都支持JDBC和JTA事物处理

不同点

  hibernate全自动;mybatis半自动。Hibernate完全可以通过对象关系模型实现对数据库的操作,完整的JavaBean对象对数据库的映射结构来自动生成sql。而mybatis仅有基本的字段映射,对象数据以及对象实际关系需要手写sql来实现和管理。

  hibernate数据库移植性远大于mybatis。hibernate的映射结构和hql语言降低对象与数据库的耦合性    

  hibernate有完整的日志系统,mybatis略差一些

  hibernate配置复杂。

  sql优化,mybatis更方便

  缓存机制,hibernate更好一些

3、mybatis中#{}和${}的区别是什么?

#{}是预编译,会将sql中#{}替换为?号,调用RreparedStatement的set方法来赋值,有效防止SQL注入,提高系统安全性;

${}是字符串替换,处理${}时,会替换成变量的值

4、Mybatis中的缓存

Mybatis默认的缓存策略【LRU,移除最长时间不被使用的对象】;FIFO

  一级缓存默认开启,sqlsession级别的缓存,也叫本地会话缓存。只在一次SqlSession中有效,从拿到连接到关闭。

    缓存失效:

      ① 增删改操作,可能会改变原来的数据,所以必定会刷新缓存,缓存失效。

      ② 手动清理缓存 sqlSession.clearCache();

       二级缓存需要手动开启和配置,基于namespace级别的缓存

    为了提高扩展性,Mybatis定义了缓存接口Cache,可以通过实现Cache接口来自定义二级缓存

    为什么使用二级缓存? 一起缓存作用域太低。

    如何开启二级缓存?

      ① 在mybatis-config.xml中

      <settings>

        <!-- 显示开启全局缓存 -->

         <setting name="cacheEnabled" value="true"><setting/>

       </settings>

      在SQL映射文件(mapper.xml)中添加一行 <cache />

      <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />

工作机制:

  一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中。若当前会话关闭,这个会话对应的一级缓存就没了;

,会话提交或关闭,一级缓存数据保存到二级缓存;

  新的会话查询信息,就可以从二级缓存中获取内容

  不同mapper.xml查出的数据会放在自己对应的缓存(map)中

      

细节:内存的缓存也需要序列化

总结:只要开启了二级缓存,在同一个Mapper下就有效。

posted @ 2022-05-12 15:01  小吴dnd  阅读(21)  评论(0编辑  收藏  举报