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

相关内容

热门资讯

有趣作文100字 有趣作文100字(通用49篇)  在平平淡淡的日常中,大家都经常看到作文的身影吧,作文是一种言语活动...
二十年后的我优秀作文 二十年后的我优秀作文五篇  时光飞逝,二十年后的我,是鼎鼎大名的科学家?是妙笔生花的作家?还是家喻户...
吃西瓜作文 吃西瓜作文(精选57篇)  在日常的学习、工作、生活中,大家都有写作文的经历,对作文很是熟悉吧,作文...
创新的议论文 创新的议论文(精选21篇)  相信大家都不可避免地要接触到作文吧,特别是议论文,议论文的语言讲究抽象...
你是我最欣赏的人作文 你是我最欣赏的人作文  在日常生活或是工作学习中,大家都写过作文,肯定对各类作文都很熟悉吧,作文是人...
秋天的泉城公园作文 秋天的泉城公园作文  在日常学习、工作和生活中,大家或多或少都会接触过作文吧,作文是通过文字来表达一...
我做了一项小实验优秀作文35... 我做了一项小实验优秀作文350字(精选68篇)  在日常学习、工作抑或是生活中,大家总少不了接触作文...
感恩遇见你作文 感恩遇见你作文  在学习、工作、生活中,大家都跟作文打过交道吧,作文是一种言语活动,具有高度的综合性...
爬山作文 爬山作文今天,天气晴朗,我和妈妈来到外婆家.我说:"妈妈,妈妈,我想去爬山."妈妈同意了.我高兴万分...
一次有趣的活动作文 关于一次有趣的活动作文  在现实生活或工作学习中,大家都跟作文打过交道吧,作文是通过文字来表达一个主...
永恒的作文 关于永恒的作文(通用24篇)  在日复一日的学习、工作或生活中,大家都接触过作文吧,作文是经过人的思...
我是一棵小树作文800字 我是一棵小树作文800字(精选31篇)  在平平淡淡的学习、工作、生活中,大家都不可避免地会接触到作...
秋心似我长作文900字 秋心似我长作文900字  一直都喜欢简单的。  人或事物。  只是很多离简单太远。  不知道最后有谁...
一只蝙蝠的自述作文 一只蝙蝠的自述作文  无论在学习、工作或是生活中,大家总免不了要接触或使用作文吧,根据写作命题的特点...
照片里的故事优秀作文 照片里的故事优秀作文  在我们平凡的日常里,说到作文,大家肯定都不陌生吧,借助作文可以提高我们的语言...
校歌比赛作文500字 校歌比赛作文500字  上个星期五,学校举行了最后一个集体比赛活动——“千人齐唱校歌”。  那天上午...
老鼠和老虎作文 老鼠和老虎作文老鼠和老虎作文1   20xx年12月23日 星期三 晴  一天,一只小老...
蜘蛛侠作文800字 蜘蛛侠作文800字·性格豪放,好动。喜欢爬大铁门,杨老师送我个雅号“蜘蛛侠”,我觉得这个美誉用在我身...
请医生作文 请医生作文请医生作文1XX年08月27日 星期六 天气:晴小兔正在路上散步,小松鼠急急忙忙地向他走来...
寻作文500字 寻作文500字(精选20篇)  在平平淡淡的日常中,大家或多或少都会接触过作文吧,作文可分为小学作文...