Mybatis 面试常问问题总结(附答案),总结到位

  1. 由于是全表映射,所以某些操作不方便,比如更新需要发送所有字段;

  2. 无法根据不同条件组装不同的 SQL;

  3. 对多表关联和复杂 SQL 查询支持较差,需要自己写 SQL,返回后还需要自己将数据组成 POJO;

  4. 不能有效支持存储过程;

MyBatis 简介


什么是 MyBatis?

MyBatis 一款支持自定义 SQL 查询、存储过程和高级映射的持久层框架,消除了几乎所有 JDBC 代码和参数的手动配置以及结果集的检索。只需要使用 XML 或注解进行配置和映射,MyBatis 就能将参数映射到配置的 SQL 形成最终执行的 SQL 语句,最后将执行 SQL 的结果映射为 Java 对象返回;

MyBatis 优缺点

优点
  1. 小巧,学习成本低,会写 SQL 语句就能很快上手;

  2. 无需过多配置 JDBC,主要专注 SQL 开发;

  3. 方便维护管理,SQL 不用在 Java 代码中找,SQL 代码可以分离重用;

  4. 灵活,支持动态 SQL;

  5. 支持对象与数据库 ORM 字段关系映射;

缺点
  1. 主要工作集中在 SQL 开发,所以对 SQL 熟练度要求较高;

  2. 移植性查,SQL 依赖于数据库,切换不同数据库会因语法差异而报错;

MyBatis 和 Hibernate 的区别

相同点

均是对 JDBC 的封装,都是持久层的框架,用于 Dao 层的开发;

不同点

| | 映射关系 | SQL优化和移植性 | 开发难易程度和学习成本 |

| — | — | — | — |

| Hibernate | 全自动映射,配置 Java 对象与数据库表的对应关系,多表关联关系配置复杂 | 对 SQL 语句封装,提供了日志、缓冲、级联等特性,此外还提供 HQL 操作数据库,数据库无关系支持好,但会多消耗性能 | 重量级,门槛高,适合需求稳定、中小型项目 |

| MyBatis | 半自动映射,配置 Java 对象与 SQL 语句执行结果的对应关系,多表关联关系配置简单 | 需要手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程;开发工作量相对较大,直接使用 SQL 语句操作数据库,不支持数据库无关性,但 SQL 语句优化容易 | 轻量级,门槛低,适合需求变化频繁、大型项目 |

Hibernate 属于全自动的 ORM 映射工具,使用 Hibernate 查询关联对象或关联集合对象时,能根据对象关系模型直接获取,所以说它是全自动的;

而 MyBatis 属于半自动 ORM 映射工具,因为在查询关联对象或关联集合对象时,需要自己手动编写 SQL 来完成;

解析和运行原理


MyBatis 核心组件

  1. 构造器SqlSessionFactoryBuilder,根据配置信息或点来生成 SqlSessionFactory

  2. 工厂接口SqlSessionFactory,依靠工厂来生成 SqlSession

  3. 会话SqlSession,是一个既可以发送 SQL 去执行返回结果,也可以获取 Mapper 接口;

  4. SQL Mapper:新设计的组件,由一个 Java 接口和 XML 文件(或注解)构成,需要给出对象的 SQL 和映射规则。负责发送 SQL 去执行,并返回结果;

MyBatis 编程步骤

  1. 创建 SqlSessionFactory

  2. 通过 SqlSessionFactory 创建 SqlSession

  3. 通过 SqlSession 执行数据库操作;

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

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

MyBatis 工作原理

MyBatis工作原理,源自网络

  1. 首先读取 MyBatis 配置文件mybatis-config.xml,它是 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息;

  2. 接着加载映射文件,即 SQL 映射文件,其中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 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 对结果集的解析过程;

映射器


${} 和 #{} 的区别

  1. ${} 是拼接符,字符串替换,无预编译处理;#{} 是占位符,预编译处理;

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

  3. 处理 ${} 时,是 原值传入,会将 ${} 替换为变量的值,相当于 JDBC 中的 Statement 编译;

  4. 变量替换后 ,#{} 对应变量自动加上单引号 ‘’,而 ${} 对应变量不会加单引号 ‘’

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

  6. #{} 的变量替换是在 DBMS 中;${} 的变量替换是在 DBMS 外;

预编译定义:预编译是提前对 SQL 语句进行编译,而后注入的参数不会再进行 SQL 编译;而一般 SQL 注入是发生在编译过程中,因为恶意注入了某些特殊字符,最后被编译为了恶意的执行操作,而预编译机制则能很好的防止 SQL 注入;

SQL 注入定义:Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击;主要有 广泛性、隐蔽性、危害大、操作方便 等特点;

模糊查询 like

  1. '%{question}%' 可能引起 SQL 注入,不推荐使用;

  2. "%{question}%",因为 #{} 在解析时会在最外侧自动加单引号,所以外层需要使用双引号,不能使用单引号,否则将查询不到任何结果;

  3. CONCAT('%', #{question}, '%'),使用 CONCAT() 函数,推荐使用;

  4. 使用 bind 标签;

SELECT id, sex, age, username, password from persion where username LIKE #{pattern}

mapper 中如何传递多个参数

  1. 顺序传参

#{} 中的数字代表传入参数的顺序,不推荐使用,因为 SQL 层表达不直观,而且一旦顺序跳转则容易出错;

public User selectUser(String name, int id);

SELECT * FROM user WHERE user_name = #{0} and id = #{1}

  1. @Param 注解传参

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)

image

image

注Java)**
[外链图片转存中…(img-3vSBaCdG-1711944829164)]

最后

这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香)

[外链图片转存中…(img-6yKo8iAY-1711944829164)]

[外链图片转存中…(img-yrSp1LZO-1711944829164)]

  • 12
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis是一个流行的Java持久层框架,它提供了许多优点和核心组件。在面试中,以下是一些可能会被问到的问题答案: 1. Mybatis的优点有哪些? Mybatis有以下几个优点: - Mybatis提供了灵活且强大的映射机制,可以通过XML或注解来配置和映射原生信息,将POJO映射成数据库的记录。这样可以避免编写大量的JDBC代码,并且不需要手动设置参数和获取结果集。 - Mybatis支持动态SQL,可以根据不同的条件动态生成SQL语句,提供了更好的灵活性和可扩展性。 - Mybatis具有良好的性能和可维护性,可以通过缓存机制来提升查询性能。 - Mybatis与现有的数据库交互技术无缝集成,可以很方便地与Spring等框架集成。 2. Mybatis如何处理#{}? 在处理#{}时,Mybatis会将其转换为?,然后使用PreparedStatement的set方法来设置参数的值。 3. 在使用Mybatis的<if>标签时,为什么需要@Param注解? 当只有一个参数并且在<if>标签里使用时,Mybatis需要通过@Param注解来指定参数的名称,以便正确地组装SQL语句。 4. Mybatis的核心组件有哪些? Mybatis的核心组件包括: - SqlSessionFactory:用于创建SqlSession对象的工厂。 - SqlSession:用于执行数据库操作的核心接口。 - Mapper接口:用于定义数据访问接口,通过调用Mapper接口的方法来执行SQL语句。 - Configuration:用于配置并管理Mybatis的各种设置和属性。 以上是一些关于Mybatis面试常见问题答案,希望对你有帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值