当前位置: 首页 > news >正文

Mybatis面试

Mybatis 面试

1、Mybatis 的执行流程是什么?

1、读取MyBatis配置文件:mybatis-config.xml 加载运行环境 和 映射文件

2、构造会话工厂 SqlSessionFactory (全局只有一个)

3、会话工厂创建SqlSession对象(项目与数据库的会话,包含了执行SQL 语句的所有方法,每次操作都会创建一个会话)

4、操作数据库接口,Executor 执行器,同时负责查询缓存的维护

5、Executor 接口的执行方法中有一个 MappedStatement 类型的参数,封装了映射信息

6、输入参数映射,将 Java 的对象转化为数据库所支持的类型

7、输出映射结果,再将执行后数据库的类型转化为 Java 类型

2、Mybatis 是否支持延迟加载?

Mybatis 支持延迟加载,但默认没用开启;

(局部的延迟加载)Mybatis 支持 一对一关联对象 和 一对多关联集合对象的延迟加载(加 fetchType=“lazy”)

(全局的延迟加载)可以 在Mybatis 配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false

  • 什么是延迟加载?

假设 有一个 User 实体类 ,其里面封装了关于订单的 List 属性,当查询用户时,将订单数据也查出来,此时为立即加载;若查询用户时,暂时不查询订单数据,当只有需要查询List的时候进行查询,此时为延迟加载

  • 延迟加载的原理

1、使用CGLIB 创建目标对象的代理对象

2、当调用目标方法 user.getOrderList() 时,进入拦截器invoke 方法,发现 user.getOrderList() 是 null 值,执行 sql 查询 order表

3、将order查询出来,进行封装返回

3、Mybatis 的一级、二级缓存

本地缓存,基于PerpetualCache,本质是一个HashMap

  • 一级缓存:

基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session(sqlSession),当Session进行flush或close之该Session中的所有Cache就将清空,默认打开一级缓存。

当两次查询相同时(同一个sqlSession),只会执行一次 SQL ,第一次查询后会将数据放入本地缓存中,第二次查询时,直接从缓存中得到数据。

  • 二级缓存:

作用域是namespace和mapper的作用域,不依赖于session,默认采用 PerpetualCache 的 HashMap 存储,默认时关闭二级缓存的。

开启二级缓存 在Mybatis 配置文件中 开启二级缓存 cacheEnable=true|false,并在映射文件中加 <cache/>标签 ,这时就开启了二级缓存。

当开启二级缓存时,两次查询条件相同时,但调用不同的sqlSession,只会执行一次 SQL 。

注意事项:
1,对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear。

2,二级缓存需要缓存的数据实现Serializable接口。

3,只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中

4、Mybaits $ 和 # 的区别?

#{ }可以防止Sql 注入,它会将所有传入的参数作为一个字符串来处理。

Mybatis在处理#{}时,会将SQL语句中的#{}替换为?号,调用PrepaerdStatement的set方法来赋值。

$ {} 则将传入的参数拼接到Sql上去执行,一般用于表名和字段名参数,$ 所对应的参数应该由服务器端提供,前端可以用参数进行选择,避免 Sql 注入的风险 。

Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}换成变量的值。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [BJDCTF2020]Easy MD51
  • SQL时间函数转换(持续更新中)
  • [图解]掉杠·above...duty -《分析模式》漫谈20
  • 冲击性信号的频域特征
  • python 绘制离散曲线计算包络谱
  • 二级Java真题乱序版第十一套(含真题解析)
  • 黑马Java零基础视频教程精华部分_10_面向对象进阶(2)
  • 位运算(更新中)
  • 本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备
  • PE安装win11原版系统“无法创建新的分区,也找不到现有的分区”和“windows无法对计算机进行启动到下一个安装阶段”的解决办法
  • 【参会邀请】第四届区块链技术与信息安全国际会议(ICBCTIS 2024)诚邀相聚江城!
  • 代码随想录第五十七天
  • Vue 常用组件间通信方式
  • 代码随想录算法训练营第 32 天 | LeetCode509斐波那契数列 LeetCode70爬楼梯 LeetCode749使用最小花费爬楼梯
  • 华为路由常见 LSA 类型的产生及作用域和字段详细解读
  • ES6指北【2】—— 箭头函数
  • [NodeJS] 关于Buffer
  • 「译」Node.js Streams 基础
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 2017-08-04 前端日报
  • 77. Combinations
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Linux快速复制或删除大量小文件
  • MySQL几个简单SQL的优化
  • MySQL主从复制读写分离及奇怪的问题
  • spring boot 整合mybatis 无法输出sql的问题
  • 阿里云应用高可用服务公测发布
  • 从PHP迁移至Golang - 基础篇
  • 精彩代码 vue.js
  • 判断客户端类型,Android,iOS,PC
  • 微服务入门【系列视频课程】
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 以太坊客户端Geth命令参数详解
  • 找一份好的前端工作,起点很重要
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • Android开发者必备:推荐一款助力开发的开源APP
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (二)Eureka服务搭建,服务注册,服务发现
  • (四)Controller接口控制器详解(三)
  • (五)activiti-modeler 编辑器初步优化
  • (原)Matlab的svmtrain和svmclassify
  • .NET Core中Emit的使用
  • .net 生成二级域名
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET和.COM和.CN域名区别
  • .project文件
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @Autowired @Resource @Qualifier的区别