1.mybatisԴ?码面?????
2.Mybatis面试题(总结最全面的面试题!!码面!码面)
3.Mybatis 码面面试题 ---insert自增主键Id实现原理
4.10道不得不会的MyBatis面试题
5.2023最新Java大厂面试题——MyBatis面试题,看完拿捏面试官
6.mybatis常见面试题有哪些?码面
mybatisԴ??????
一位求职者在年底之际收获了美团、快手等公司的码面知名大型软件源码库录用通知,面对阿里三面的码面邀请,他抱有期待。码面然而,码面面试过程却出乎意料地受挫,码面主要原因是码面面试官针对MyBatis源码提出了深入的问题。其中包括设计模式的码面应用、调试模式的码面实现机制、数据库连接池操作、码面二级缓存功能的码面实现以及源码中涉及的术语如“缓存雪崩”。
面试官热衷于考察源码理解,因为这不仅能测试技术深度,还能展现开发者的思维方式和问题解决能力。正如淘宝创始人团队成员多隆,他凭借对源码的深入研究,不仅提升了工作效率,还帮助同事解决难题。掌握源码对于程序员意味着编写高效代码的经验、微观架构设计的提升、工作中的疑难杂症解决,以及学习大牛的思维模式。
然而,学习MyBatis源码并非易事,市面上的教材要么难以理解,要么过于专业。但好消息是,有一份详尽的学习指南,包含了学习文档、视频讲解和思维导图,从入门到精通,涵盖了高级用法和设计模式。对于有需要的朋友,可以通过此资源进行高效学习,点击此处获取:( 点这里)免费领取,我们非常诚挚地邀请您的支持!
此外,对于Java技术、面试问题和架构实战内容,我们也有更多精选资源:Java面试题和实战文档,欢迎感兴趣的朋友点击左下角支持我们。
Mybatis面试题(总结最全面的面试题!!!)
Mybatis面试题全面总结:数据持久化与ORM框架解析
数据持久化是将应用程序中的数据保存在数据库中,以便长期存储和管理。Mybatis是一种流行的Java ORM(对象关系映射)框架,它简化了与数据库的交互,减少了手动编写SQL的成品源码搭建繁琐工作。
MyBatis的优点包括:轻量级,易于理解和使用;SQL编写清晰,查询灵活;支持一对一和一对多关系映射。然而,它的缺点可能包括学习曲线较陡,对于复杂的SQL逻辑可能不如原生SQL直接;另外,它对数据库的依赖较高,不适用于对性能极致追求的场景。
与Hibernate相比,Mybatis更强调SQL编写,灵活性更强,而Hibernate更倾向于全自动的ORM,提供更完整的对象映射。#{ }和${ }的区别在于,#{ }是预编译占位符,防止SQL注入,而${ }是变量值的输出。
遇到实体类属性名与表字段名不一致时,可通过配置别名或自定义结果映射解决。模糊查询在Mybatis中通过like关键字配合通配符实现。
Dao接口在Mybatis中是与数据库交互的接口,方法参数不同时不会重载,因为Mybatis通过参数映射处理。分页功能主要通过Mybatis提供的分页插件,它在执行SQL时动态添加LIMIT子句。
Mybatis通过映射文件(如XML)描述SQL执行逻辑,支持多种映射形式,如一对一和一对多关系的映射。动态SQL则允许在运行时动态生成SQL,提高灵活性。不同XML映射文件的id可以重复,但需确保唯一性。
Mybatis被称为半自动ORM工具,因为它需要手动编写部分映射代码,与全自动ORM(如Hibernate)相比,减少了对对象和数据库之间关系的自动处理。实现一对一和一对多关系主要通过关系映射和子查询。
MyBatis支持延迟加载,通过在查询时设置懒加载属性,提高性能。一级和二级缓存分别在Mybatis的Session和全局级别存储数据,提高数据访问速度。接口绑定则是通过Mapper接口和XML映射实现数据操作。
在使用Mapper接口时,需要确保传入的参数与映射中的参数匹配,并注意防止SQL注入。Mybatis通过预编译语句和参数化查询避免了直接拼接SQL,实现了安全的SQL执行。
最后,如果你需要深入学习Mybatis,推荐观看配套学习视频,不断巩固和提升技能。基金买卖源码更多的编程资源也欢迎探索。
Mybatis 面试题 ---insert自增主键Id实现原理
实现Mybatis中使用insert语句自动生成主键ID,涉及多层技术细节。
底层依赖MySQL JDBC驱动,利用Statement.RETURN_GENERATED_KEYS参数,MySQL在执行insert语句后返回生成的ID。
Mybatis通过StatementHandler接口创建Statement对象,并执行SQL。拦截器依据需求选择调用此API。
执行后,通过KeyGenerator后置拦截器获取生成的自增ID,并将其赋值给实体对象。
道不得不会的MyBatis面试题
本系列《最少必要面试题》
1. 什么是MyBatis?
这个问题主要是对比JDBC来看,MyBatis是一个基于Java的持久层框架,它将SQL语句与Java代码分离,通过XML或注解配置来实现数据库操作,简化了开发过程。
2. MyBatis的优点
MyBatis的优点包括配置简单、SQL语句执行效率高、易于维护、灵活性强等。
3. #{ }和${ }的区别是什么?
Mybatis在处理#{ }的时候会将sql中的#{ }替换成?号,调用PreparedStatement来赋值;Mybatis在处理${ }替换成变量的值,调用Statement来赋值。
4. 一个 Xml 映射文件,都会写一个 Dao 接口与之对应,这个 Dao 接口的工作原理是什么?
Dao 接口就是人们常说的 Mapper 接口,接口的全限名,就是映射文件中的 namespace 的值,接口的方法名就是映射文件中MappedStatement 的 id 值,接口方法内的参数就是传递给 sql 的参数。接口里的方法是不能重载的,因为是全限名+方法名的保存和寻找策略。Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行接口方法所对应的MappedStatement所代表的sql,然后将sql执行结果返回。
5. 如何获取自动生成的(主)键值?
用法:在 标签中添加 useGeneratedKeys="true" 等属性。当 Mybatis 解析 xml节点是,读到insert 有配置时,会判断是否 有配置 useGeneratedKeys,如果有则会使用 Jdbc3KeyGenerator 作为sql回显,否则会以 NoKeyGenerator 作为主键回显。底层封装了JDBC获取自增主键,即当使用 prepareStatement 或者 Statement时候,可以通过getGeneratedKeys 获取 当条插入语句的自增而成的主键。
6. Mybatis 动态 sql 有什么用?有哪些动态 sql?执行原理?
Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。Mybatis 提供了9种动态sql标签:trim | where | set | foreach | if | choose | when | otherwise | bind。其执行原理为,lv溯源码使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。
7. 什么是Mybatis的一级、二级缓存?
一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 将清空。二级缓存与一级缓存其机制相同,不同在于其存储作用域为 Mapper(Namespace)。即使开启了二级缓存,不同的sqlsession之间的缓存数据也不是想互访就能互访的,必须等到sqlsession关闭了以后,才会把其一级缓存中的数据写入二级缓存。
8. MyBatis的工作原理
一图胜千文
9. 什么是MyBatis的接口绑定?有哪些实现方式?
接口绑定,就是在 MyBatis 中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。接口绑定有两种实现方式。
. Mybatis的分页原理
Mybatis 使用 RowBounds 对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,所以一般不会使用。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。分页插件的原理就是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的SQL,然后根据设置的 dialect(方言),和设置的分页参数,重写SQL ,生成带有分页语句的SQL,执行重写后的SQL,从而实现分页。
最新Java大厂面试题——MyBatis面试题,看完拿捏面试官
最新Java大厂面试题深入解析MyBatis面试要点
MyBatis,一个半ORM框架,简化了JDBC操作,程序员只需关注SQL,无需处理连接和参数管理。它通过XML或注解配置,将Java对象映射至数据库记录,提供了高灵活性和性能控制。优点包括:灵活的SQL编程,减少代码量,兼容性强,与Spring集成,支持ORM映射。然而,它也存在挑战,php 库存源码如SQL编写复杂度和对数据库依赖性。MyBatis适用于对性能要求高、需求变化频繁的项目,尤其是互联网项目。
与Hibernate相比,MyBatis更侧重SQL,程序员需编写原生SQL,这在性能和灵活性上有所提升,但对SQL编写能力有较高要求。Hibernate则更适用于需要强对象关系映射和数据库无关性的场景。
面试中可能会问到#{ }和${ }的区别,前者是预编译处理,提供安全性能,后者是字符串替换。实体类属性和表字段名不一致时,可通过别名或字段映射处理。模糊查询使用like时,需注意防止SQL注入。Mapper接口与XML映射文件的对应关系,以及如何进行分页和对象映射也是常见问题。
MyBatis通过RowBounds实现内存分页,支持自定义分页插件。对象属性与数据库列的映射方式、批量插入、主键获取、多参数传递和动态SQL的使用,都是面试时可能涉及的关键知识点。
mybatis常见面试题有哪些?
MyBatis是一款广受欢迎的持久层框架,尤其在中国有着广泛的应用,常与Spring和Mybatis结合使用,简称为SSM组合中的M。
MyBatis的强项之一是动态SQL支持,大幅减少了编写JDBC代码的繁琐,避免了手动设置参数和处理结果集的麻烦。动态SQL特性使得根据不同的条件拼接SQL语句变得简单且高效。
在MyBatis中,可以使用两种符号进行动态SQL的拼接:${ } 和 #{ }。虽然两者功能相似,但它们在使用上有显著的区别。
基本用法上,#和$都可以用于动态SQL拼接。使用$时,会在SQL字符串中多加一对单引号,这实际上是将SQL语句视为普通字符串。而#则是预处理语句的符号,用于代替参数。区别在于,使用#可以避免SQL注入风险,因为它将参数当作SQL语句的一部分,而非直接插入到SQL中,从而防止恶意的SQL注入攻击。
SQL注入是当用户输入的参数在生成SQL语句时未得到适当处理时,攻击者可以注入恶意的SQL代码,导致非预期的数据库操作。一个简单的例子可以说明这个问题:假设有一个查询语句,要求根据用户名和密码查询用户是否存在。如果参数未得到安全处理,恶意用户可以输入如`' or 1=1 --`这样的参数,即使用户名部分是正确的,整个查询语句实际上变成了一个永远返回真值的语句,这即为SQL注入。
为了避免SQL注入,通常不推荐使用$符号拼接SQL语句,而应使用#符号。因为使用#可以确保参数被正确地作为参数处理,而非作为SQL语句的一部分。
在某些特殊情况下,如将数据库对象作为参数传递,特别是当字段名不确定时(例如在分组排序查询中),只能使用$符号。这是因为#预处理之后会将数据库字段名识别为字符串,可能导致错误。
总结来说,#符号在MyBatis中提供了额外的安全性,避免了SQL注入的风险。在大多数情况下,推荐使用#符号进行动态SQL的拼接。而当需要将数据库对象作为参数传递时,则需要使用$符号。
MyBatis最新面试题汇总(只看这篇就够了)
MyBatis的优缺点
优点:一是基于 SQL 语句编程,具有高度灵活性,且与程序代码分离,便于统一管理;二是与JDBC相比,大幅减少代码量,降低了维护成本,避免了JDBC代码的冗余;三是提供XML标签支持动态SQL,便于重用和调整;四是能与各种数据库兼容,借助JDBC实现。
缺点:一是在编写SQL语句时对开发者的功底要求较高;二是SQL语句的变动可能导致数据库移植性问题。
${ }与#{ }的区别
${ }执行字符串替换,而#{ }则通过预编译处理SQL,能有效防止SQL注入,提高系统安全性。
解决JDBC编程不足之处的方法
1)使用数据库连接池管理连接,避免资源浪费和性能影响,通过在SQLMapConfig.xml中配置连接池解决。
2)将SQL语句配置在mapper.xml文件中,与JAVA代码分离,提高代码维护性。
3)利用#{ }参数传递方式,避免SQL注入风险,提高安全性。
4)自动将JAVA对象映射为SQL执行结果,简化结果集解析过程。
处理实体类属性与表字段不一致的方法
通过定义字段别名或配置映射关系,确保属性名与字段名一致。
MyBatis编程步骤
1、创建SQLSessionFactory
2、使用SQLSessionFactory创建SQLSession
3、通过SQLSession执行数据库操作
4、调用session.commit()提交事物
5、调用session.close()关闭会话
模糊查询的实现
使用like %xx%结构,推荐使用字符串拼接函数避免错误。
使用Mybatis的mapper接口调用要求
确保接口方法名、输入参数类型和结果类型与mapper.xml文件中的SQL相匹配,且namespace与接口全限定名一致。
实现动态SQL的方法
MyBatis通过接口的全限定名和方法名匹配MapperStatement对象,实现SQL动态生成。
分页机制与插件原理
使用RowBounds对象进行内存分页,插件通过拦截方法重写SQL,实现物理分页功能。
MyBatis常用注解与映射形式
通过标签和列别名实现对象属性与数据库列的映射,利用反射创建并赋值。
其他标签与动态SQL
除常见标签外,还包括用于逻辑判断、条件组合等功能的标签。
MyBatis插件运行原理与编写
通过JDK动态代理实现接口方法拦截,配置插件注解以指定拦截方法。
支持延迟加载的机制与原理
在配置文件中启用,使用CGLIB创建代理对象,动态生成查询关联对象的SQL。
映射文件与内部数据结构关系
Xml配置信息封装至Configuration对象,标签解析为不同类型对象,最终形成MappedStatement。
Mybatis高频面试题总结(最新)
Mybatis是半自动的ORM映射工具,与全自动工具如Hibernate的区别在于处理关联对象和集合时的自动化程度。Hibernate能自动获取对象关系模型中的关联,而Mybatis则需要手动编写SQL。MyBatis的优势在于其灵活性和对性能的专注,适用于对性能要求高或需求变化频繁的项目,如Web开发。
MyBatis的三种Executor执行器——SimpleExecutor、ReuseExecutor和BatchExecutor各有特点:SimpleExecutor每次操作后关闭Statement,ReuseExecutor复用Statement,BatchExecutor支持批处理。这些执行器在SqlSession生命周期内工作。
Mybatis通过RowBounds进行内存分页,支持直接在SQL中添加物理分页参数或使用插件实现。分页插件利用动态代理和责任链模式修改SQL实现物理分页。
插件是通过实现Interceptor接口,指定拦截的接口和方法,然后在配置文件中启用。Mybatis支持association和collection的延迟加载,通过CGLIB创建代理对象来实现。
#{ } 和 ${ } 的区别在于,前者是预编译语句,安全且无需编译,后者是字符串替换,可能导致SQL注入。预编译通过PreparedStatement优化SQL执行效率。
一级缓存是SqlSession级别的,只在相同SqlSession和参数条件下复用查询结果,而二级缓存是Mapper级别,可跨SqlSession共享,但要求返回的POJO是可序列化的。
总结来说,Mybatis通过其独特的设计和特性,提供了高效的数据库操作和灵活的缓存机制,适用于特定的开发场景。
Mybatis面试题
知乎的排版可能不好,而且颜色不够鲜明,我把它也整理到了我的网站,还有答主面试整理的高频题:
需要的可以访问: Java小白求职之路
1、MyBatis的工作原理
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 对结果集的解析过程。
2、Mybatis 缓存
Mybatis中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且是不能关闭的。
一级缓存是指 SqlSession 级别的缓存,当在同一个 SqlSession 中进行相同的 SQL 语句查询时,第二次以后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多缓存 条 SQL。
二级缓存是指可以跨 SqlSession 的缓存。是 mapper 级别的缓存,对于mapper 级别的缓存不同的sqlsession 是可以共享的。
3、Mybatis 的一级缓存原理 ( sqlsession 级别 )
第一次发出一个查询 sql,sql 查询结果写入 sqlsession 的一级缓存中,缓存使用的数据结构是一个 map。
key:MapperID+offset+limit+Sql+所有的入参 value:用户信息
同一个 sqlsession 再次发出相同的 sql,就从缓存中取出数据。如果两次中间出现 commit 操作 (修改、添加、删除),本 sqlsession 中的一级缓存区域全部清空,下次再去缓存中查询不到 所以要从数据库查询,从数据库查询到再写入缓存。
4、二级缓存原理 ( mapper 级别)
二级缓存的范围是 mapper 级别(mapper同一个命名空间,Namespace),mapper 以命名空间为单位创建缓存数据结构,结构是 map。mybatis 的二级缓存是通过 CacheExecutor 实现的。CacheExecutor其实是 Executor 的代理对象。所有的查询操作,在 CacheExecutor 中都会先匹配缓存中是否存在,不存在则查询数据库。 key:MapperID+offset+limit+Sql+所有的入参
具体使用需要配置:
5、#{ }和${ }的区别是什么
#{ }是预编译处理,${ }是字符串替换。
Mybatis在处理#{ }时,会将sql中的#{ }替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${ }时,就是把${ }替换成变量的值。
使用#{ }可以有效的防止SQL注入,提高系统安全性。
预编译语句的优势在于归纳 为:一次编译、多次运行,省去了解析优化等过程;此外预编译语句能防止sql注入。
6、什么是MyBatis的接口绑定?有哪些实现方式?
接口绑定,就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置。
接口绑定有两种实现方式:
7、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
8、Mybatis一对一、一对多的查询
MyBatis 中使用collection标签来解决一对多的关联查询,collection标签可用的属性如下: property:指的是集合属性的值. ofType:指的是集合中元素的类型. column:所对应的外键字段名称. select:使用另一个查询封装的结果.
MyBatis 中使用association标签来解决一对一的关联查询,association标签可用的属性如下: property:对象属性的名称. javaType:对象属性的类型. column:所对应的外键字段名称. select:使用另一个查询封装的结果!
如:
个人觉得,发送一个sql去查询,使用List 作为回参也可以做到。
上面这段代码,也是面试经常问到的将sql执行结果封装为目标对象并返回,其实现的过程就是通过resultMap进行封装,而property和 column 进行映射,使数据库的列名和对象的名称对应。Mybatis也会智能匹配,比如可以指定驼峰,如果找不到映射对应的关系,就是默认值。
9、Mybatis的分页原理
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的原理就是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的SQL,然后根据设置的dialect(方言),和设置的分页参数,重写SQL ,生成带有分页语句的SQL,执行重写后的SQL,从而实现分页。
举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,
、什么是Mybatis的动态SQL?
1) 传统的JDBC的方法,在组合SQL语句的时候需要去拼接,稍微不注意就会少少了一个空格,标点符号,都会导致系统错误。Mybatis的动态SQL就是为了解决这种问题而产生的;Mybatis的动态SQL语句值基于OGNL表达式的,方便在SQL语句中实现某些逻辑;可以使用标签组合成灵活的sql语句,提供开发的效率。
2) Mybatis的动态SQL标签主要由以下几类: If语句(简单的条件判断) Choose(when/otherwise),相当于java语言中的switch,与jstl中choose类似 Trim(对包含的内容加上prefix,或者suffix) Where(主要是用来简化SQL语句中where条件判断,能智能的处理and/or 不用担心多余的语法导致的错误) Set(主要用于更新时候) Foreach(一般使用在mybatis in语句查询时特别有用)
其他面试题:
年轻人,到这里你是否头秃了! 年轻人不讲武德,耗子尾汁是不可能的。
需要资源的可点这里(思维导图+Java学习路线+入门视频+框架视频+简历模板+面试题):