首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
牛客910885813号
太原理工大学 Web前端
发布于上海
关注
已关注
取消关注
@江西陈胖子:
Mybatis高频面试题
Mybatis是什么?MyBatis框架是一个开源的数据持久层框架。它的内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询、存储过程和高级映射,几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis作为持久层框架,其主要思想是将程序中的大量SQL语句剥离出来,配置在配置文件当中,实现SQL的灵活配置。这样做的好处是将SQL与程序代码分离,可以在不修改代码的情况下,直接在配置文件当中修改SQL。ORM是什么ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。Mybatis和Hibernate的区别?主要有以下几点区别:Hibernate的开发难度大于MyBatis,主要由于Hibernate比较复杂,庞大,学习周期比较长。Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。数据库扩展性的区别。Hibernate与数据库具体的关联在XML中,所以HQL对具体是用什么数据库并不是很关心。MyBatis由于所有sql都是依赖数据库书写的,所以扩展性、迁移性比较差。缓存机制的区别。Hibernate的二级缓存配置在SessionFactory生成配置文件中进行详细配置,然后再在具体的表对象映射中配置那种缓存。MyBatis的二级缓存配置都是在每个具体的表对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓冲机制,并且MyBatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。日志系统完善性的区别。Hibernate日志系统非常健全,涉及广泛,而Mybatis则除了基本记录功能外,功能薄弱很多。sql的优化上,Mybatis要比Hibernate方便很多。由于Mybatis的sql都是写在xml里,因此优化sql比Hibernate方便很多。而Hibernate的sql很多都是自动生成的,无法直接维护sql;总之写sql的灵活度上Hibernate不及Mybatis。本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~********如果访问不了Github,可以访问*******。*******MyBatis框架的优缺点及其适用的场合优点与JDBC相比,减少了50%以上的代码量。MyBatis是易学的持久层框架,小巧并且简单易学。MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML文件里,从程序代码中彻底分离,降低耦合度,便于统一的管理和优化,并可重用。提供XML标签,支持编写动态的SQL,满足不同的业务需求。提供映射标签,支持对象与数据库的ORM字段关系映射。缺点SQL语句的编写工作量较大,对开发人员编写SQL的能力有一定的要求。SQL语句依赖于数据库,导致数据库不具有好的移植性,不可以随便更换数据库。适用场景MyBatis专注于SQL自身,是一个足够灵活的DAO层解决方案。对性能的要求很高,或者需求变化较多的项目,例如Web项目,那么MyBatis是不二的选择。Mybatis的工作原理读取MyBatis配置文件:mybatis-config.xml为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,例如数据库连接信息。加载映射文件。映射文件即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml文件可以加载多个映射文件,每个文件对应数据库中的一张表。构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory。创建会话对象:由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。Executor执行器:MyBatis底层定义了一个Executor 接口来操作数据库,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。MappedStatement 对象:在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。输入参数映射:输入参数类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于 JDBC对preparedStatement对象设置参数的过程。输出结果映射:输出结果类型可以是Map、List等集合类型,也可以是基本数据类型和POJO类型。输出结果映射过程类似于 JDBC对结果集的解析过程。Mybatis都有哪些Executor执行器?它们之间的区别是什么?Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次使用。简言之,就是重复使用Statement对象。BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同。作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。MyBatis中接口绑定有几种实现方式?通过注解绑定,在接口的方法上面加上 @Select@Update等注解里面包含Sql语句来绑定(SQL语句比较简单的时候,推荐注解绑定)通过xml里面写SQL来绑定, 指定xml映射文件里面的namespace必须为接口的全路径名(SQL语句比较复杂的时候,推荐xml绑定)Mybatis 是如何进行分页的?Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页,先把数据都查出来,然后再做分页。可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。分页插件的基本原理是什么?分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql(SQL 拼接 limit),根据 dialect 方言,添加对应的物理分页语句和物理分页参数,用到了技术 JDK 动态代理,用到了责任链设计模式。简述Mybatis的插件运行原理Mybatis仅可以编写针对 ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。.如何编写一个插件?编写插件:实现 Mybatis 的 Interceptor 接口并复写 intercept()方法,然后再给插件编写注解,指定要拦截哪一个接口的哪些方法即可,最后在配置文件中配置你编写的插件。给大家分享一个Github仓库,上面有大彬整理的300多本经典的计算机书籍PDF,包括C语言、C++、Java、Python、前端、数据库、操作系统、计算机网络、数据结构和算法、机器学习、编程人生等,可以star一下,下次找书直接在上面搜索,仓库持续更新中~********.Mybatis 是否支持延迟加载?Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis 配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。延迟加载的基本原理是什么?延迟加载的基本原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法。比如调用a.getB().getName(),拦截器 invoke()方法发现 a.getB()是 null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用a.setB(b),于是 a 的对象 b 属性就有值了,接着完成a.getB().getName()方法的调用。当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理都是一样的。#{}和${}的区别是什么?#{ } 被解析成预编译语句,预编译之后可以直接执行,不需要重新编译sql。//sqlMap 中如下的 sql 语句select * from user where name = #{name};//解析成为预编译语句;编译好SQL语句再取值select * from user where name = ?;${ } 仅仅为一个字符串替换,每次执行sql之前需要进行编译,存在 sql 注入问题。select * from user where name = '${name}'//传递的参数为 "ruhua" 时,解析为如下,然后发送数据库服务器进行编译。取值以后再去编译SQL语句。select * from user where name = "ruhua";Mybatis的预编译数据库接受到sql语句之后,需要词法和语义解析,优化sql语句,制定执行计划。这需要花费一些时间。如果一条sql语句需要反复执行,每次都进行语法检查和优化,会浪费很多时间。预编译语句就是将sql语句中的值用占位符替代,即将sql语句模板化。一次编译、多次运行,省去了解析优化等过程。mybatis是通过PreparedStatement和占位符来实现预编译的。mybatis底层使用PreparedStatement,默认情况下,将对所有的 sql 进行预编译,将#{}替换为?,然后将带有占位符?的sql模板发送至mysql服务器,由服务器对此无参数的sql进行编译后,将编译结果缓存,然后直接执行带有真实参数的sql。预编译的作用:预编译阶段可以优化 sql 的执行。预编译之后的 sql 多数情况下可以直接执行,数据库服务器不需要再次编译,可以提升性能。预编译语句对象可以重复利用。把一个 sql 预编译后产生的 PreparedStatement 对象缓存下来,下次对于同一个sql,可以直接使用这个缓存的 PreparedState 对象。防止SQL注入。使用预编译,而其后注入的参数将不会再进行SQL编译。也就是说其后注入进来的参数系统将不会认为它会是一条SQL语句,而默认其是一个参数。一级缓存和二级缓存缓存:合理使用缓存是优化中最常见的方法之一,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能。一级缓存是SqlSession级别的缓存:Mybatis对缓存提供支持,默认情况下只开启一级缓存,一级缓存作用范围为同一个SqlSession。在SQL和参数相同的情况下,我们使用同一个SqlSession对象调用同一个Mapper方法,往往只会执行一次SQL。因为在使用SqlSession第一次查询后,Mybatis会将结果放到缓存中,以后再次查询时,如果没有声明需要刷新,并且缓存没超时的情况下,SqlSession只会取出当前缓存的数据,不会再次发送SQL到数据库。若使用不同的SqlSession,因为不同的SqlSession是相互隔离的,不会使用一级缓存。二级缓存是mapper级别的缓存:可以使缓存在各个SqlSession之间共享。二级缓存默认不开启,需要在mybatis-config.xml开启二级缓存:<!-- 通知 MyBatis 框架开启二级缓存 --><settings> <setting name="cacheEnabled" value="true"/></settings>并在相应的Mapper.xml文件添加cache标签,表示对哪个mapper 开启缓存:<cache/>二级缓存要求返回的POJO必须是可序列化的,即要求实现Serializable接口。当开启二级缓存后,数据的查询执行的流程就是 二级缓存 -> 一级缓存 -> 数据库。
点赞 14
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
12-01 19:47
门头沟学院 Java
富途证券-后端开发工程师-风控方向一面(社招)
0. 前言 富途是一家金融科技公司,为境内外广大用户提供证券交易等服务。此岗位用的是Go语言,所以只问了项目和技术栈问题,不涉及Java。 1. 一面 耗时约47分钟。 (0)自我介绍。 (1)介绍一下自己所做的最重要的项目中自己承担的角色和所做工作,挑一个典型的业务讲一下。项目中是如何实现延迟消息的? (2)现在让你进行做一个商城秒杀活动,一万个特价商品,价格一分钱,此外还有九万件平价商品。如果你是技术负责人,全权负责此任务,你会考虑哪些问题?如何解决? (3)介绍一下MySQL中哈希索引和B+树索引的异同,MySQL的可重复读的隔离级别是如何实现的(MVCC)?它和读已提交的隔离级别有何区...
查看8道真题和解析
点赞
评论
收藏
分享
12-02 11:48
曼迪匹艾_人力资源部_HRBP(准入职员工)
MDPI内推,MDPI内推码
常见问题:3.加班吗 目前我是加班的,一般➕0.5-1h,加不加班主要看自己的进度和效率,刚入职,操作慢,一般会加班。 4.加班有加班费吗? NO,超过晚上七点🕖可以点一份工作餐(必须七点以后才可以点,需要5点之前点餐,如果你确定自己加班会超过七点,就可以点啦) 5.有KPI吗? 有的,入职3个月(发文15篇)和6个月(发文60篇)都要发文量要求。转正后每个季度30篇,超过30每篇奖励300💰。 6入职后有人带吗? 有的,入职后每个人都有师傅带,遇到的师傅就像读研选导一样,听天由命,幸运的遇到耐心负责的,运气差点的~,不过一般都还是很好的 7.公司环境如何? 和你在其他分享中看到的一样,女...
曼迪匹艾公司福利 115人发布
点赞
评论
收藏
分享
不愿透露姓名的神秘牛友
11-21 11:29
已编辑
这对吗
本人百度+腾讯实习经验,马力笔试1.5/2给我简历挂?????这对吗这对吗这对吗,真是大环境不好吗bg双非update:重新投郑州进入初试了(楼主河南人)
斯卡蒂味的鱼汤:
知道你不会来数马,就不捞你😂最近数马疯狂扩招,招聘要求挺低的,你能力肯定够,应该就是因为太强了,知道你不会来才不捞你
投递腾讯云智研发等公司7个岗位
点赞
评论
收藏
分享
10-28 22:26
蚌埠坦克学院 网络安全
26届双非本科终于拿到鹅厂offer了
投了三次,终于进了,本来都要对秋招无望了,不坚持到最后真的不知道会来得这么突然啊😭😭😭我愿意做一辈子的鹅孝子口牙!
JOJO的奇妙代码:
要提前实习嘛佬
秋招的第一个offer,...
点赞
评论
收藏
分享
12-01 14:28
门头沟学院
爱来自联影!
收到联影的offer了!已经oc了,聊完真的特别开心。这个秋招终于可以画上一个圆满的句号了。我打算寒假做两件事:第一,联系我的hrbp,看看能不能提前拿到一些学习资料,比如技术栈介绍、团队常用的工具链。想先自己熟悉起来,免得入职被大佬包围,会拖后腿什么的。第二,找机会问问有没有机会在正式入职前,和未来的主管或团队里的师兄师姐简单聊一聊。就是想提前了解下当前项目的重点有什么,看看自己现在能提前做哪些准备吧。和家里人聊的时候,他们倒是很支持我的方向。我爸说行业前景比较稳定,他就很支持我的决定。也因为这样,经验会越来越值钱吧。希望接下来一切顺利,早点融入团队。如果有同样拿到联影offer的同学,或者...
联影求职进展汇总
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
7天10面 来分享一下我的11月面筋!
5192
2
...
零经验也能斩获实习offer
1346
3
...
小红书商业化技术Java一面(挂)
1298
4
...
27届211本 百度测开实习要去吗
1101
5
...
我觉得年轻就应该选择"高薪高压" | 技术至上、业务为王.
865
6
...
26岁的我,后悔读双非硕士
864
7
...
都是匆忙的选择,感觉人生真的很儿戏
726
8
...
快手日常实习能转正吗?
630
9
...
简历书写格式参考
591
10
...
试用期没通过
541
创作者周榜
更多
正在热议
更多
#
offer帮选
#
4809103次浏览
29195人参与
#
0经验如何找实习?
#
907次浏览
27人参与
#
百融云创求职进展汇总
#
1377次浏览
17人参与
#
校招薪资来揭秘
#
348656次浏览
1897人参与
#
产品每日一题
#
72107次浏览
639人参与
#
OC/开奖
#
281600次浏览
1748人参与
#
你开始找寒假实习了吗?
#
1461次浏览
18人参与
#
如果公司降薪,你会跳槽吗?
#
108228次浏览
670人参与
#
实习,不懂就问
#
134875次浏览
1248人参与
#
跳槽时有那些注意事项
#
113153次浏览
581人参与
#
2025年终总结
#
20398次浏览
284人参与
#
你会为了工作牺牲生活吗?
#
64346次浏览
433人参与
#
Offer比较,你最看重什么?
#
241824次浏览
1493人参与
#
职场新人体验
#
152707次浏览
1110人参与
#
第一份工作能做外包吗?
#
88458次浏览
588人参与
#
硬件兄弟们 甩出你的华为奖状
#
117903次浏览
702人参与
#
25届暑期实习
#
1029915次浏览
20516人参与
#
实习中的菜狗时刻
#
449787次浏览
3516人参与
#
学历or实习经历,哪个更重要
#
204269次浏览
1086人参与
#
实习要如何选择和准备?
#
125817次浏览
1478人参与
#
uu们,春招你还来吗?
#
17644次浏览
119人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务