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

Mybatis框架常见问题总结

1.Mybatis框架执行流程

  1. 读取mybatis-config.xml配置文件
  2. 加载映射文件mapper.xml
  3. 定义SQL语句,在上一步的文件中加载。
  4. 创建会话工厂。(SqlSessionFactory)
  5. 创建会话(SqlSession)
  6. 通过Executor 操作数据库
  7. 输入参数和输出结果行流程

2.#{}和${}的区别

${}是 Properties 文件中的变量占位符,它可以用于标签属性值和 sql 内部,属于原样文本替换,可以替换任意内容,比如${driver}会被原样替换为com.mysql.jdbc. Driver

#{}是 sql 的参数占位符,MyBatis 会将 sql 中的#{}替换为? 号,在 sql 执行前会使用 PreparedStatement 的参数设置方法,按序给 sql 的? 号占位符设置参数值,比如 ps.setInt(0, parameterValue),#{item.name} 的取值方式为使用反射从参数对象中获取 item 对象的 name 属性值,相当于 param.getItem().getName()

3.xml映射文件中,除了常见的select insert update delete标签之外,还有哪些标签

答:<resultMap><parameterMap><sql><include><selectKey> ,加上动态 sql 的 9 个标签, trim|where|set|foreach|if|choose|when|otherwise|bind 等,其中 <sql> 为 sql 片段标签,通过 <include> 标签引入 sql 片段, <selectKey> 为不支持自增的主键生成策略标签。

4.mybatis如何实现分页的?分页插件的原理是什么?

答:(1) MyBatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页;(2) 可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,(3) 也可以使用分页插件来完成物理分页。

分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数

5.mapper传参的四种传参方式

答:①单一参数:直接传递单个参数,通常是基本数据类型或简单对象。

多个参数:使用 @Param 注解传递多个参数。

Map:将参数封装到 Map 中,键为参数名。

自定义对象:将参数封装到自定义对象中。

5.MyBatis 的xml映射文件中,不同的xml映射文件,id是否可以重复?

答:不同的 xml 映射文件,如果配置了 namespace,那么 id 可以重复;如果没有配置 namespace,那么 id 不能重复;毕竟 namespace 不是必须的,只是最佳实践而已。

原因就是 namespace+id 是作为 Map<String, MappedStatement> 的 key 使用的,如果没有 namespace,就剩下 id,那么,id 重复会导致数据互相覆盖。有了 namespace,自然 id 就可以重复,namespace 不同,namespace+id 自然也就不同。

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

答:MyBatis 有三种基本的 Executor 执行器:

  • 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 生命周期范围内

7.MyBatis是否可以映射 Enum枚举类?

答: MyBatis可以映射枚举类,不单可以映射枚举类,MyBatis可以映射任何对象到表的一列上。映射方式为自定义一个 TypeHandler,实现TypeHandler的setParameter ()和getResult()接口方法。
TypeHandler有两个作用:

—是完成从javaType 至jdbcType的转换;。

二是完成jdbeType 至javaType的转换,体现为
setParameter()和getResult()两个方法,分别代表设置sql 问号占位符参数和获取列查询结果。

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

答: Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 MyBatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM 映射工具。
 

9.mybatis的优缺点

(1)优点:

① 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;

② 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。

③ 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。

④ 能够与Spring很好的集成;

⑤ 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

(2)缺点:

① SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。

② SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

10.mybatis是否支持懒加载

答:MyBatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询。在 MyBatis 配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 计算机毕业设计Spark+Tensorflow股票推荐系统 股票预测系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI
  • 基于YOLOv8的无人机高空红外(HIT-UAV)检测算法,新的混合型扩张型残差注意力(HDRAB)助力涨点(二)
  • 小琳AI课堂:AIGC
  • 香蕉梨:自然的甜蜜宝藏
  • C\C++ Sqlite3使用详解
  • 云计算实训34——docker环境配置、镜像基本操作、容器基本操作、设置远程连接管理
  • wpf DynamicResource的ResourceKey值进行绑定
  • vue2版本空目录下创建新项目的方法2024
  • RocketMQ~刷盘机制、主从复制方式、存储机制
  • Nginx - 反向代理、缓存详解
  • msxml*.dll 错误 ‘80072f7d‘ 安全频道支持出错 解决方案
  • Linux网络配置和系统管理
  • 【发邮件】 在邮件中添加 (mailto:) 链接的返回电子邮件
  • 【Python】机器学习中的 K-均值聚类算法及其优缺点
  • 解决在IIS下typecho访问网址为localhost的问题
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Hibernate【inverse和cascade属性】知识要点
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • java2019面试题北京
  • leetcode-27. Remove Element
  • PHP 7 修改了什么呢 -- 2
  • php的插入排序,通过双层for循环
  • Terraform入门 - 1. 安装Terraform
  • Vue2 SSR 的优化之旅
  • Vue实战(四)登录/注册页的实现
  • 二维平面内的碰撞检测【一】
  • 马上搞懂 GeoJSON
  • 设计模式走一遍---观察者模式
  • 思否第一天
  • 思维导图—你不知道的JavaScript中卷
  • 与 ConTeXt MkIV 官方文档的接驳
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​secrets --- 生成管理密码的安全随机数​
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #laravel 通过手动安装依赖PHPExcel#
  • #微信小程序:微信小程序常见的配置传旨
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (160)时序收敛--->(10)时序收敛十
  • (LeetCode) T14. Longest Common Prefix
  • (libusb) usb口自动刷新
  • (Note)C++中的继承方式
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (十八)SpringBoot之发送QQ邮件
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • (自用)仿写程序
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .Net CoreRabbitMQ消息存储可靠机制