Mybatis,Mybatis-plus面试题

1 Mybatis的工作原理?

1 读取 MyBatis 配置文件
2 加载映射文件Mapper.xml
3 构造会话工厂SqlSessionFactory
4 创建会话对象SqlSession
5 通过Executor 执行器动态地生成需要执行的 SQL 语句
6 MappedStatement 对象存储要映射的 SQL 语句的 id、参数等信息。
7 执行输入参数映射
8 根据查询结果执行输出结果映射封装数据

2在mapper中如何传递多个参数?

1 顺序传参法 ,arg0代表第一个参数 arg1代表第二个参数
2 使用@Param注解传参法
3 封装到对象或者Map集合

3 mybatis映射文件中用到哪些标签

select : 查询标签
update : 更新标签
delete : 删除标签
insert : 插入标签
where : 类似于SQL语句的where
if : 动态SQL对条件进行判断
foreach : 遍历循环 , 拼接SQL , 一般用于批量处理
set : 类似于SQL语句中 的set关键词
resultMap : 结果集映射标签

4 mybatis如何实现多表查询?

1 编写多表查询SQL语句 , 使用ResultMap建立结果集映射
2 使用延迟加载 , 多个SQL语句组合
主要使用的注解就是 :
collection : 建立一对多映射
association : 建立一对一映射

5 foreach标签哪些属性?

collection : 指定遍历的集合, 如果遍历的是数组就是array , 遍历的是list集合就是list , 遍历的是对象或者Map的集合属性就是对象属性名称或者map的key
item : 遍历的每一项
index : 遍历过程中的索引
open : 字符串拼接前缀
separator : 分隔符
close : : 字符串拼接后缀

6Mybatis?如何获取生成的主键?

1 insert 标签上使用useGeneratedKeys=“true” keyProperty
2 在insert标签内部使用selectKey标签配置keyProperties , keyColum通过select last_insert_id()查询

7当实体类中的属性名和表中的字段名不一样,怎么办

第1种: 通过在查询的SQL语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
第2种: 通过 resultMap来映射字段名和实体类属性名的一一对应的关系。
如果仅仅是驼峰命名 可以配置驼峰映射

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

1 Mapper接口方法名和mapper.xml中定义的每个sql的id相同。
2 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相 同。
3 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同。
4 Mapper.xml文件中的namespace即是mapper接口的类路径。

9Dao接口里的方法,参数不同时,方法能重载吗?

不能,因为是全限名+方法名的保存和寻找策略。

10 mybatis是如何进行分页的?分页插件的原理是什么?

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,
可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,
在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

11 Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,
association指的就是 一对一,collection指的就是一对多查询。
可以配置lazyLoadingEnabled=true|false来完成
原理是使用CGLIB创建目标对象的代理对象

12 Mybatis的一级、二级缓存?

一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session
当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存
二级缓存与一级缓存其机制相同,默认也是采用 HashMap 存储,
不同在于其 **存储作用域为 Mapper(Namespace),**并且可自定义存储源,如 Ehcache。
默认不打开二级缓 存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状 态),
可在它的映射文件中配置

13使用Mybatis-Plus的过程中多表查询如何做?

使用mybtis的映射配置文件, 自己编写SQL语句, 编写ResultMap映射

14 ybatis是如何实现实体类和数据库表映射的?

通过注解 :
@TableName
@TableFiled
@TableId
@Version

15 Mybatis-Plus自动填充用过吗?

通过@TableFiled中的fill属性可以来指定字段什么时候被自动填充
还需要自定义实现MyMetaObjectHandler

16#{}和${}的区别

1 #{}是占位符,预编译处理;KaTeX parse error: Expected 'EOF', got '#' at position 34: …处理。 (Mybatis在处理#̲{}时,#{}传入参数是以字符…{} 不能防止SQL 注入
3 #{} 的变量替换是在数据库系统中; ${} 的变量替换是在 数据库系统外

17 Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的 执行原来

Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,
完成逻辑判断和动态拼接sql的功能,
Mybatis提供了9种动态sql标签 trim|where|set|foreach|if|choose|when|otherwise|bind。
其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此 来完成动态sql的功能。

18简述Mybatis的插件运行原理,以及如何编写一个插件。

Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、 Executor这4种接口的插件,
Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现 接口方法拦截功能,
每当执行这4种接口对象的方法时,就会进入拦截方法,拦截那些你指定需要拦截的方法。
实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,
指定要拦截哪一 个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值