mybatis面试题 一
创始人
2024-05-29 18:33:34
0

一、MyBatis工作原理?

1、 创建SqlSessionFactory

2、 通过SqlSessionFactory创建SqlSession

3、 通过sqlsession执行数据库操作

4、 调用session.commit()提交事务

5、 调用session.close()关闭会话

1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。

2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。

3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory

4)创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。

5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 

SqlSession 传递的参数动态地生成需要执行的 SQL 语句同时负责查询缓存的维护

6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。

7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。

8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

二、mybatis #{}和${}的区别

#{}是占位符预编译处理${}是拼接符字符串替换,没有预编译处理

#{} 可以有效的防止SQL注入,提高系统安全性;${} 不能防止SQL 注入

把{}替换成变量的值,相当于JDBC中的Statement编译

模糊查询like语句该怎么写

(1)’%${question}%’ 可能引起SQL注入,不推荐

(2)CONCAT(’%’,#{question},’%’) 使用CONCAT()函数,推荐

Mybatis在处理#{}时,#{}传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法来赋值。

三、mybatis在mapper中如何传递多个参数

方法1:顺序传参法

#{}里面的数字代表传入参数的顺序。

这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错。

方法2:@Param注解传参法

#{}里面的名称对应的是注解@Param括号里面修饰的名称。

这种方法在参数不多的情况还是比较直观的,推荐使用。

 

方法3:Map传参法

#{}里面的名称对应的是Map里面的key名称。

这种方法适合传递多个参数,且参数易变能灵活传递的情况。

 方法4:Java Bean传参法

#{}里面的名称对应的是User类里面的成员属性。

这种方法直观,需要建一个实体类,扩展不容易,需要加属性,但代码可读性强,业务逻辑处理方便,推荐使用。

四、使用MyBatis的mapper接口调用时有哪些要求?

1、Mapper接口方法名和mapper.xml中定义的每个sql的id相同

2、Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql类型相同。

3、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

4、Mapper.xml文件中的namespace即是mapper接口的类路径。mapper接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。

五、mybatis mapper接口工作原理?

mapper接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

六、Mybatis是否可以映射Enum枚举类?

Mybatis可以映射枚举类,不只可以映射枚举类,Mybatis可以映射任何对象到表的一列上映射方式为自定义一个TypeHandler实现TypeHandler的setParameter()和getResult()接口方法

TypeHandler有两个作用一是完成从javaType至jdbcType的转换二是完成jdbcType至javaType的转换,体现为setParameter()和getResult()两个方法,分别代表设置sql问号占位符参数获取列查询结果

 

 

七、Mybatis的一级、二级缓存

1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session

当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,

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

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

相关内容

热门资讯

龙津风雨桥导游词 龙津风雨桥导游词  龙津风雨桥位于湖南省芷江县,是一座历史久远的桥梁,以下是小编整理的龙津风雨桥导游...
杭州黄龙洞导游词讲解 杭州黄龙洞导游词讲解  黄龙洞位于湖南省张家界市核心景区武陵源风景名胜区内,是世界自然遗产、世界地质...
峨眉山猴山导游词 峨眉山猴山导游词(通用11篇)  作为一名乐于助人的导游,总不可避免地需要编写导游词,借助导游词可以...
乌镇东栅导游词详细版 乌镇东栅导游词详细版  乌镇是一块古老神奇而又美丽非凡的土地,是一个有1300年建镇史的江南水乡古镇...
著名导游词 著名导游词范文  导游词是导游人员引导游客观光游览时的讲解词,是导游员同游客交流思想,向游客传播文化...
西安太白山导游词 西安太白山导游词  各位团友:  今天是个天气晴朗的大好日子,我们将用2个小时的时间,沿着关中道西行...
北京故宫的导游词 北京故宫的导游词  北京故宫的导游词篇1亲爱的旅客朋友们: 你们好! 我是这次旅程的导游,我...
关于介绍华山导游词 华山是中国著名的五岳之一,海拔2154.9米居五岳之首,位于陕西省西安以东120公里历史文化故地渭南...
开平碉楼古村落导游词 开平碉楼古村落导游词  导游词,是导游人员引导游客观光游览时的讲解词,是导游员同游客交流思想,向游客...
靖江王府导游词 靖江王府导游词  作为一名可信赖的导游人员,就有可能用到导游词,借助导游词可以更好地宣传景点,引导游...
贵州四洞沟景区导游词 贵州四洞沟景区导游词  作为一名乐于助人的导游,总归要编写导游词,导游词作为一种解说的文体,它的作用...
鹿邑老君台的导游词 鹿邑老君台的导游词  老君台原名升仙台或拜仙台,原为明道宫的一部分,位于老子故里鹿邑县城内东北隅,老...
彩色沙林导游词 彩色沙林导游词  导语:对于云南陆良的彩色沙林,导游们会怎样进行解说?下面是小编整理的彩色沙林导游词...
云台山的导游词 云台山的导游词  作为一位无私奉献的导游,往往需要进行导游词编写工作,导游词是导游人员引导游客观光游...
青岩古镇的导游词 青岩古镇的导游词三篇  青岩古镇,贵州四大古镇之一,位于贵阳市南郊,建于明洪武十年(1378年),原...
荔波樟江导游词 关于荔波樟江导游词  作为一名具备丰富知识的导游,时常会需要准备好导游词,导游词作为一种解说的文体,...
昆明石林导游词-导游词 昆明石林导游词-导游词范文  作为一位无私奉献的导游,常常需要准备导游词,导游词具有极强的实用性,涉...
广东第一高峰旅游风景区石坑崆 广东第一高峰旅游风景区石坑崆  广东第一峰旅游风景区是北回归线上最大的一片绿洲,拥有大面积原始森林,...
碧霞祠导游词 碧霞祠导游词碧霞祠导游词碧霞祠”创建于宋真宗东封泰山的时候,后世有过多次重修。碧霞祠最开始的时候是叫...