写点什么

面试的朋友听我说,18 个 MyBatis 高频知识及学习笔记,双手奉上

作者:冉然学Java
  • 2022 年 8 月 15 日
    湖南
  • 本文字数:3228 字

    阅读完需:约 11 分钟

面试的朋友听我说,18个MyBatis高频知识及学习笔记,双手奉上

01 18 个 MyBatis 高频知识点(含解析)

  1. 精讲 #{}和 ${}的区别是什么?

  2. 数据库链接中断如何处理?

  3. 在开发过程中,经常遇到插入重复的现象,这种情况该如何解决呢?

  4. 事务执行过程中宕机的应对处理方式?

  5. 高性能服务器端端开发底层主要靠 I/O 复用来处理,这种模式:

  6. Mybatis 中的 Dao 接口和 XML 文件里的 SQL 是如何建立关系的?

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

  8. 模糊查询 like 语句该怎么写?

  9. 什么是 MyBatis 的接口绑定?有哪些实现方式?

  10. 使用 MyBatis 的 mapper 接口调用时要注意的事项

  11. 通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?

  12. Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

  13. Mybatis 的一级、二级缓存的作用是什么?

  14. Mybatis 是如何进行分页的?分页插件的原理是什么?

  15. Mybatis 动态 SQL 是做什么的?都有哪些动态 SQL ?能简述一下动态 SQL 的执行原理吗?

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

  17. Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?

  18. MyBatis 与 Hibernate 区别?

1 精讲 #{}和 ${}的区别是什么?

  • mybatis 在处理 #{}时,会将 sql 中的 #{}替换为?号,调用 PreparedStatement 的 set 方法来赋值。

  • mybatis 在处理 ${}时,就是把 ${}替换成变量的值。

  • 使用 #{}可以有效的防止 SQL 注入,提高系统安全性。原因在于:预编译机制。预编译完成之后,SQL 的结构已经固定,即便用户输入非法参数,也不会对 SQL 的结构产生影响,从而避免了潜在的安全风险。

  • 预编译是提前对 SQL 语句进行预编译,而其后注入的参数将不会再进行 SQL 编译。我们知道,SQL 注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止 SQL 注入。


既然 ${}会引起 sql 注入,为什么有了 #{}还需要有 ${}呢?那其存在的意义是什么?

#{}主要用于预编译,而预编译的场景其实非常受限,而 ${}用于替换,很多场景会出现替换,而这种场景可不是预编译


2 数据库链接中断如何处理?

数据库的访问底层是通过 tcp 实现的,当链接中断是程序是无法得知,导致程序一直会停顿一段时间在这,最终会导致用户体验不好,因此面对数据库连接中断的异常,该怎么设置 mybatis 呢?

connection 操作底层是一个循环处理操作,因此可以进行时间有关的参数:

  • max_idle_time : 表明最大的空闲时间,超过这个时间 socket 就会关闭

  • connect_timeout : 表明链接的超时时间


数据库服务器活的杠杠的,但是因为网络用塞,客户端仍然连不上服务器端,这个时候就要设置 timeout,别一直傻等着

3 在开发过程中,经常遇到插入重复的现象,这种情况该如何解决呢?

插入的过程一般都是分两步的:先判断是否存在记录,没有存在则插入否则不插入。如果存在并发操作,那么同时进行了第一步,然后大家都发现没有记录,然后都插入了数据从而造成数据的重复

解决插入重复的思路 :

  • 先判断数据库是否存在数据,有的话则不进行任何操作。没有数据的话,进行下一步;

  • 向 redis set key,其中只有一个插入操作 A 会成功,其他并发的操作(B 和 C...)都会失败的 ;

  • 当 set key 成功的操作 A,开始执行插入数据操作,无论是否插入数据成功,都在需要将 redis key 删除。【注】插入不成功可以多尝试几次,增加成功的概率 ;

  • 然而 set key 失败的操作 B 和 C,sleep 一下,竞争赢的插入操作重复以上步骤。

总结:多线程同时插入数据,谁获取锁并插入数据成功了其他线程不做任何操作。当插入数据失败后,其他线程抢锁进行插入数据。


篇幅有限,完整版 18 个 Mybatis 高频知识点如下所示:

(需要下载完整版的朋友,点击此处【Mybatis】,即可免费领取)

18 个 Mybatis 高频知识点

02 32 道面试常见的 MyBtis 题目+解析

  1. 什么是 MyBatis?讲下 MyBatis 的缓存

  2. Mybatis 是如何进行分页的?分页插件的原理是什么?

  3. 简述 Mybatis 的插件运行原理,以及如何编写一个插件?

  4. Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述一下动态 sql 的执行原理不?

  5. #{}和 ${}的区别是什么?

  6. 为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

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

  8. MyBatis 与 Hibernate 有哪些不同?

  9. MyBatis 的好处是什么?

  10. 简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关系?

  11. 什么是 MyBatis 的接口绑定,有什么好处?

  12. 接口绑定有几种实现方式,分别是怎么实现的?

  13. 什么情况下用注解绑定,什么情况下用 xml 绑定?

  14. MyBatis 实现一对一有几种方式?具体怎么操作的?

  15. Mybatis 能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?

  16. MyBatis 里面的动态 Sql 是怎么设定的?用什么语法?

  17. Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?

  18. Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签?

  19. 当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定 pojo?

  20. 通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应, Dao 的工作原理,是否可以重载?

  21. Mybatis 映射文件中,如果 A 标签通过 include 引用了 B 标签的内容,请问,B 标签能否定义在 A 标签的后面,还是说必须定义在 A 标签的前面?

  22. Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

  23. Mybatis 都有哪些 Executor 执行器?它们之间的区别是什么?

  24. Mybatis 中如何指定使用哪一种 Executor 执行器?

  25. Mybatis 执行批量插入,能返回数据库主键列表吗?

  26. Mybatis 是否可以映射 Enum 枚举类?

  27. 如何获取自动生成的(主)键值?

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

  29. resultType resultMap 的区别?

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

  31. Mybatis 比 IBatis 比较大的几个改进是什么?

  32. IBatis 和 MyBatis 在核心处理类分别叫什么?在细节上的不同有哪些?

1 什么是 MyBatis?

答:MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。

2 讲下 MyBatis 的缓存

答:MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面,默认就有,二级缓

存放在它的命名空间里,默认是不打开的,使用二级缓存属性类需要实现 Serializable 序列化

接口(可用来保存对象的状态),可在它的映射文件中配置<cache/>

3 Mybatis 是如何进行分页的?分页插件的原理是什么?

答:

1)Mybatis 使用 RowBounds 对象进行分页,也可以直接编写 sql 实现分页,也可以使用

Mybatis 的分页插件。

2)分页插件的原理:实现 Mybatis 提供的接口,实现自定义插件,在插件的拦截方法内拦

截待执行的 sql,然后重写 sql。

举例:select * from student,拦截 sql 后重写为:select t.* from (select * from student)tlimit 0,10

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

答:

1)Mybatis 仅可以编写针对 ParameterHandler、ResultSetHandler、StatementHandler、

Executor 这 4 种接口的插件,Mybatis 通过动态代理,为需要拦截的接口生成代理对象以实

现接口方法拦截功能,每当执行这 4 种接口对象的方法时,就会进入拦截方法,具体就是

InvocationHandler 的 invoke()方法,当然,只会拦截那些你指定需要拦截的方法。

2)实现 Mybatis 的 Interceptor 接口并复写 intercept()方法,然后在给插件编写注解,指定

要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。


篇幅有限,完整版 32 道面试常见的 Mybatis 题目+解析如下所示:

32 道面试常见的 Mybatis 题目+解析

03 MyBatis 技术内幕(书籍 PDF)

  1. 第 1 章 MyBatis 快速入门

  2. 第 2 章 基础支持层

  3. 第 3 章 核心处理层

  4. 第 4 章 高级主题

MyBatis 技术内幕(书籍 PDF)

最后分享一波

需要文中分享的那些 MyBatis 全部学习资料的朋友注意啦,需要资料的朋友,点击此处【资料】,即可免费领取!


好啦,既然这次谈到了 Mybatis,那么顺便这里在给大家分享一下 【SSM 框架】的 技术图谱 以及 学习资料

SSM 框架技术图谱

SSM 框架学习笔记


最后说一次,需要 MyBatis 以及整个 SSM 框架的全部学习资料的朋友,点击此处【资料】,即可免费领取!

用户头像

冉然学Java

关注

还未添加个人签名 2022.07.07 加入

努力学好Java、爱生活、爱旅游的冉冉; 分享自己工作上的经验,交流、共进步、共成长!

评论

发布
暂无评论
面试的朋友听我说,18个MyBatis高频知识及学习笔记,双手奉上_Java_冉然学Java_InfoQ写作社区