【面试题】MyBatis面试题

2024-06-29 1302阅读

目录

  • 简述MyBatis是什么,它解决了什么问题?
  • MyBatis中Mapper.xml文件的作用是什么?
  • #{}和${}在动态SQL中的区别是什么?
  • 如何在MyBatis中处理一对一和一对多的关联映射?
  • MyBatis的工作原理是什么?
  • 如何进行MyBatis的性能优化?
  • MyBatis是如何与Spring框架集成的?为什么要集成?
  • MyBatis有哪些插件机制?能否举个自定义插件的例子?
  • 说一下 MyBatis 的一级缓存和二级缓存?
  • resultType与resultMap有什么区别?
  • Mybatis一级缓存和二级缓存失效的情况有哪些?
  • MyBatis缓存的查询顺序?
  • 如何解决二级缓存中的数据一致性问题?

    简述MyBatis是什么,它解决了什么问题?

    • MyBatis是一个半自动化的ORM(对象关系映射)框架,它允许开发者直接编写SQL语句,提供了一种将SQL查询结果映射到Java对象的方法。
    • 它主要解决JDBC编程的繁琐性,如手动设置参数、获取结果集等,同时提供了更灵活的SQL控制能力。

      MyBatis中Mapper.xml文件的作用是什么?

      • Mapper.xml文件用于定义SQL语句和结果映射。
      • 每个XML文件通常对应一个Mapper接口,包含select、insert、update、delete等标签,定义了具体的SQL查询和更新语句,以及如何将查询结果映射到Java对象上。

        #{}和${}在动态SQL中的区别是什么?

        • #{}用于参数化SQL,MyBatis会自动进行预编译处理,可以防止SQL注入攻击;
        • ${}则是字符串替换,直接拼接到SQL中,不推荐用于含有用户输入的参数,以免SQL注入风险。

          如何在MyBatis中处理一对一和一对多的关联映射?

          • 一对一关联可以通过嵌套查询、嵌套结果等方式实现;
          • 一对多关联常用的方式是集合(collection)映射,可以在查询结果映射时通过标签定义关联的集合属性。

            MyBatis的工作原理是什么?

            • MyBatis通过读取配置文件,使用SqlSessionFactoryBuilder创建SqlSessionFactory,然后SqlSessionFactory打开SqlSession,执行SQL并处理结果映射,最后关闭SqlSession。

              如何进行MyBatis的性能优化?

              • 使用连接池减少数据库连接创建销毁开销;
              • 合理配置缓存策略;
              • 避免在映射文件中使用过多的嵌套查询和子查询,考虑使用联合查询;
              • 利用批量操作减少数据库交互次数;根据实际需要开启或关闭二级缓存。

                MyBatis是如何与Spring框架集成的?为什么要集成?

                • 通过Spring的XML配置或注解方式配置数据源和SqlSessionFactoryBean,实现MyBatis与Spring的无缝集成。
                • 集成后可以利用Spring的依赖注入、事务管理等功能,使得应用架构更加清晰,易于管理和维护。

                  MyBatis有哪些插件机制?能否举个自定义插件的例子?

                  • MyBatis提供拦截器(Interceptor)机制作为插件体系,可以拦截Executor、ParameterHandler、ResultSetHandler等组件的执行过程。
                  • 一个简单例子可以是日志插件,用于记录SQL执行的详细信息。

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

                    一级缓存:

                    【面试题】MyBatis面试题
                    (图片来源网络,侵删)
                    • 基于 PerpetualCache 的 HashMap 本地缓存,它的生命期是和 SQLSession 一致的,有多个 SQLSession 或者分布式的环境中数据库操作,可能会出现脏数据。
                    • 当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空;
                    • 一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问,一级缓存是默认开启的。

                      二级缓存:

                      • 也是基于 PerpetualCache 的 HashMap 本地缓存,不同在于其存储作用域为 Mapper 级别的,如果多个SQLSession之间需要共享缓存,则需要使用到二级缓存,并且二级缓存可自定义存储源,如 Ehcache。
                      • 默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态)。
                      • 二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存,此后若再次执行相同的查询语句,结果就会从缓存中获取。

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

                        缓存更新机制:

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

                          resultType与resultMap有什么区别?

                          resultmap与resulttype的区别为:对象不同、描述不同、类型适用不同

                          对象不同

                          1. resultmap:resultMap如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
                          2. resultType:resultType使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。

                          描述不同

                          1. resultmap:resultMap对于一对一表连接的处理方式通常为在主表的pojo中添加嵌套另一个表的pojo,然后在mapper.xml中采用association节点元素进行对另一个表的连接处理。
                          2. resulTtype:resultType无法查询结果映射到pojo对象的pojo属性中,根据对结构集查询遍历的需要选择使用resultType还是resultMap。适用于单表查询。

                          类型适用不同

                          1. resultmap:mybatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap。
                          2. resulttype:resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。

                          Mybatis一级缓存和二级缓存失效的情况有哪些?

                          一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问,一级缓存是默认开启的,一级缓存失效的情况:

                          • 使用另一个SqlSession
                          • 同一个SqlSession但是查询条件不同
                          • 同一个SqlSession但是两次查询中间执行了任何一次增删改操作
                          • 同一个SqlSession但是两次查询中间手动清空了缓存,手动清空缓存的方法是调用SqlSession的 clearCache() 方法

                            二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存,此后若再次执行相同的查询语句,结果就会从缓存中获取,二级缓存失效的情况:

                            • 两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效。

                              MyBatis缓存的查询顺序?

                              1. 先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用
                              2. 如果二级缓存没有命中,再查询一级缓存
                              3. 如果一级缓存也没有命中,则查询数据库

                              如何解决二级缓存中的数据一致性问题?

                              • 使用缓存同步策略,比如读写分离后通过消息队列更新缓存;
                              • 利用缓存穿透、缓存击穿和缓存雪崩的解决方案;
                              • 对于高一致性要求的场景,也可以考虑牺牲一些性能,采用更为直接的数据库查询代替缓存。
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]