mybatis面试题

MyBatis

  1. MyBatis基本要素:
    ·configuration.xml 全局配置文件【SqlMapConfig.xml文件】
    · xml映射文件(mapper)—实体类
    ·SqlSession接口

2.mybatis的主要执行流程?

mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了数据源、事务等信息;映射文件配置了SQL执行相关的 信息。
mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory,即会话工厂。
通过SqlSessionFactory,可以创建SqlSession即会话。Mybatis是通过SqlSession来操作数据库的。
SqlSession本身不能直接操作数据库,它是通过底层的Executor执行器接口来操作数据库的。Executor接口有两个实现类,一个是普通执行器,一个是缓存执行器(默认)。
Executor执行器要处理的SQL信息是封装到一个底层对象MappedStatement中。
该对象包括:SQL语句、输入参数映射信息、输出结果集映射信息。其中输入参数和输出结果的映射类型包括java的简单类型、HashMap集合对象、POJO对象类型。
3、MyBatis的生命周期
Mybatis组件生命周期如图所示:

1、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder的作用在于创建SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder就失去作用,所以它只能存在于创建SqlSessionFactory的方法中,而不要让其长期存在。

2、SqlSessionFactory
SqlSessionFactory可以被认为是一个数据库连接池,它的作用是创建SqlSession接口对象。因为MyBatis的本质就是Java对数据库的操作,所以SqlSessionFactory的生命周期存在于整个MyBatis的应用中,所以一旦创建了SqlSessionFactory,就要长期保存它,直至不在使用MyBatis应用,所以可以认为SqlSessionFactory的生命周期就等同与MyBatis的应用周期。

由于SqlSessionFactory是对一个数据库的连接池,所以它占据着数据库的连接资源。如果创建多个SqlSessionFactory,那么就存在多个数据库连接池,不利于对数据库资源的控制,也将导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免出现这种情况。因此在一般的应用中,我们往往希望SqlSessionFactory作为一个单例,让它在应用中被共享。

3、SqlSession
如果说SqlSessionFactory相当于数据库连接池,那么SqlSession就相当于一个数据库连接(Connection对象),我们可以在一个事务中执行多条SQL,然后通过它的commit、rollback等方法,提交或回滚事务。所以SqlSession应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给SqlSessionFactory,否则数据库资源将被耗光,系统瘫痪,所以使用try...catch...finally语句来保证SqlSession正确关闭。

4、Mapper
Mapper是一个接口,它由SqlSession所创建,所以它的最大生命周期至多和SqlSession保持一致,当SqlSession关闭时,Mapper的数据库连接资源也会消失,所以Mapper的生命周期应该小于等于SqlSession的生命周期。Mapper代表的是一个请求中的业务处理,所以它应该在一个请求中,一旦处理完了相关业务,就应该废弃它。

{} 和 ${} 的区别?
·#{}是占位符,进行预编译处理,${}是字符串替换,不进行预编译处理。
·Mybatis 在处理时,#{}传入参数是以字符串传入,会将 SQL 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值。
·#{} 可以有效的防止 SQL 注入,提高系统安全性;${} 不能防止 SQL 注入
·#{} 的变量替换是在 DBMS 中;${} 的变量替换是在 DBMS 外

5.在mybatis中,resultType和resultMap的区别是什么?
·当数据库结果集的列名与封装实体的属性名一致的话使用result Type属性
·当数据库结果集的列名与封装实体的属性名不一致的情况使用resultMap属性,通过resultMap手动建立对象关系映射,要配置表和类的一一对应关系。即表的字段名和实体类的属性名可以不一样。

6.mybatis中你知道的动态SQL的标签有哪些?分别的作用是什么?
·if用作判断
·where标签可以用来做动态拼接查询条件,和if标签配合的时候不用显示的声明类型。
·foreach标签对传入的集合进行遍历,然后把每一项的内容作为参数传到SQL语句。
·set标签主要用在动态更新的时候,进行校验
·includ标签减少重复代码的编写。

7.说一下 MyBatis 的一级、二级缓存?
这个问题比较复杂,我们可以从几个方面来说明一下:
·首先mybatis里面设计了二级缓存机制来提升数据的一个检索效率,避免每一次数据的检索都去查询数据库。
·一级缓存是SQL Session级别的一个缓存,也叫本地缓存,因为每一个用户在执行查询的时候都需要使用SQL Session来执行,为了避免每一次数据的检索都去查询数据库,mybatis把查询出来的数据缓存到SQL Session的本地缓存里面,后续的SQL如果在命中缓存的情况下就可以直接在本地缓存中取,如果想实现跨SQL Session级别的一个缓存,那么一级缓存是无法做到的,所以引入了二级缓存的一个设计。
·当多个用户在查询数据的时候只要有如何一个SQL Session拿到了数据,就会放到二级缓存里面去,其他的SQL Session就可以在二级缓存里面去加载数据。
实现原理:
·一级缓存:在SQL Session里面会持有一个Executor,每一个Executor里面会有一个叫Local Cache的一个对象,当用户发起查询的时候,mybatis会根据执行语句在Local Cache里面去查找,如果名中了就直接把这个数据返回,如果没有则去数据库里面查询出来,再写到Local Cache里面去。
·二级缓存:在一级缓存的Executor上去做了一个装饰,引入了叫Caching Executor的装饰器,在进入一级缓存的查询之前会先通过Caching Executor进行二级缓存的查询,开启二级缓存之后会被多个SQL Session共享,即是一个全局的缓存,查询流程就变成了先查二级缓存--->一级缓存---->数据库。

posted @ 2024-05-09 02:24  零零快乐  阅读(6)  评论(0编辑  收藏  举报