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

互联网Java工程师面试题·MyBatis 篇·第二弹

目录

16、Xml 映射文件中,除了常见的 select|insert|updae|delete标签之外,还有哪些标签?

17、Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

18、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

19、 一对一、一对多的关联查询 ?

20、MyBatis 实现一对一有几种方式?具体怎么操作的?

21、MyBatis 实现一对多有几种方式,怎么操作的?

22、Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?

23、Mybatis 的一级、二级缓存:

24、什么是 MyBatis 的接口绑定?有哪些实现方式?

25、使用 MyBatis 的 mapper 接口调用时有哪些要求?

26、Mapper 编写有哪几种方式?

27、简述 Mybatis 的插件运行原理,以及如何编写一个插件。


16Xml 映射文件中,除了常见的 select|insert|updae|delete标签之外,还有哪些标签?

<resultMap> <parameterMap> <sql> <include> 、 <selectKey>,加上动态 sql 9 个标签,其中 <sql> sql 片段标签,通过 <include>标签引入 sql 片段, <selectKey> 为不支持自增的主键生成策略标 签。

17Mybatis Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

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

18、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

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

19、 一对一、一对多的关联查询 ?

<mapper namespace="com.dljd.mapping.userMapper"><!--association 一对一关联查询 --><select id="getClass" parameterType="int"
resultMap="ClassesResultMap">select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id}</select><resultMap type="com.dljd.user.Classes" id="ClassesResultMap"><!-- 实体类的字段名和数据表的字段名映射 --><id property="id" column="c_id"/><result property="name" column="c_name"/><association property="teacher"
javaType="com.dljd.user.Teacher"><id property="id" column="t_id"/><result property="name" column="t_name"/></association></resultMap><!--collection 一对多关联查询 --><select id="getClass2" parameterType="int" resultMap="ClassesResultMap2">select * from class c,teacher t,student s where c.teacher_id=t.t_id
and c.c_id=s.class_id and c.c_id=#{id}</select><resultMap type="com.dljd.user.Classes" id="ClassesResultMap2"><id property="id" column="c_id"/><result property="name" column="c_name"/><association property="teacher"
javaType="com.dljd.user.Teacher"><id property="id" column="t_id"/><result property="name" column="t_name"/></association><collection property="student"
ofType="com.dljd.user.Student"><id property="id" column="s_id"/><result property="name" column="s_name"/></collection></resultMap>
</mapper>

20MyBatis 实现一对一有几种方式?具体怎么操作的?

        有联合查询和嵌套查询 , 联合查询是几个表联合查询 , 只查询一次 , 通过在resultMap 里面配置 association 节点配置一对一的类就可以完成;
        嵌套查询是先查一个表,根据这个表里面的结果的 外键 id ,去再另外一个表里面查询数据, 也是通过 association 配置,但另外一个表的查询通过 select 属性配置。

21MyBatis 实现一对多有几种方式,怎么操作的?

        有联合查询和嵌套查询。联合查询是几个表联合查询 , 只查询一次 , 通过在 resultMap 里面的 collection 节点配置一对多的类就可以完成;嵌套查询是先查一个表, 根据这个表里面的 结果的外键 id, 去再另外一个表里面查询数据 , 也是通过配置 collection, 但另外一个表的查询通过 select 节点配置。

22Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?

        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 ,支持延迟加载的原理都是一样的。

23Mybatis 的一级、二级缓存:

1 )一级缓存 : 基于 PerpetualCache HashMap 本地缓存,其存储作用域为Session,当 Session flush close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
2 )二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache HashMap存储,不同在于其存储作用域为 Mapper(Namespace) ,并且可自定义存储源,如 Ehcache 。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口 ( 可用来保存对象的状态 ), 可在它的映射文件中配置<cache/> ;
3 )对于缓存数据更新机制,当某一个作用域 ( 一级缓存 Session/ 二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear

24、什么是 MyBatis 的接口绑定?有哪些实现方式?

        接口绑定,就是在 MyBatis 中任意定义接口 , 然后把接口里面的方法和 SQL 语句绑定, 我们直接调用接口方法就可以 , 这样比起原来了 SqlSession 提供的方法我们可以有更加灵活的选择和设置。
        接口绑定有两种实现方式 , 一种是通过注解绑定,就是在接口的方法上面加上@Select、 @Update 等注解,里面包含 Sql 语句来绑定;另外一种就是通过 xml里面写 SQL 来绑定 , 在这种情况下 , 要指定 xml 映射文件里面的 namespace 必须为接口的全路径名。当 Sql 语句比较简单时候 , 用注解绑定 , SQL 语句比较复杂时候, xml 绑定 , 一般用 xml 绑定的比较多。

25、使用 MyBatis mapper 接口调用时有哪些要求?

1 Mapper 接口方法名和 mapper.xml 中定义的每个 sql id 相同;
2 Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的parameterType 的类型相同;
3 Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的resultType 的类型相同;
4 Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径。

26Mapper 编写有哪几种方式?

第一种:接口实现类继承 SqlSessionDaoSupport :使用此种方法需要编写mapper 接口, mapper 接口实现类、 mapper.xml 文件。
1 、在 sqlMapConfig.xml 中配置 mapper.xml 的位置
<mappers><mapper resource="mapper.xml 文件的地址" /><mapper resource="mapper.xml 文件的地址" />
</mappers>
1 、定义 mapper 接口
3 、实现类集成 SqlSessionDaoSupport mapper 方法中可以 this.getSqlSession() 进行数据增删改查。
4 spring 配置
<bean id=" " class="mapper 接口的实现"><property name="sqlSessionFactory"
ref="sqlSessionFactory"></property>
</bean>
第二种:使用 org.mybatis.spring.mapper.MapperFactoryBean
1 、在 sqlMapConfig.xml 中配置 mapper.xml 的位置,如果 mapper.xml 和mappre 接口的名称相同且在同一个目录,这里可以不用配置
<mappers><mapper resource="mapper.xml 文件的地址" /><mapper resource="mapper.xml 文件的地址" />
</mappers>
2 、定义 mapper 接口:
1) mapper.xml 中的 namespace mapper 接口的地址
2) mapper 接口中的方法名和 mapper.xml 中的定义的 statement id 保持一
3) Spring 中定义
<bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="mapper 接口地址" /><property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
第三种:使用 mapper 扫描器:
1 mapper.xml 文件编写:
mapper.xml 中的 namespace mapper 接口的地址;
mapper 接口中的方法名和 mapper.xml 中的定义的 statement id 保持一致;
如果将 mapper.xml mapper 接口的名称保持一致则不用在 sqlMapConfig.xml 中进行配置。
2 、定义 mapper 接口:
注意 mapper.xml 的文件名和 mapper 的接口名称保持一致,且放在同一个目录
3 、配置 mapper 扫描器:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="mapper 接口包地址
"></property><property name="sqlSessionFactoryBeanName"
value="sqlSessionFactory"/>
</bean>
4 、使用扫描器后从 spring 容器中获取 mapper 的实现对象。

27、简述 Mybatis 的插件运行原理,以及如何编写一个插件。

        Mybatis 仅可以编写针对 ParameterHandler ResultSetHandler 、 StatementHandler、 Executor 4 种接口的插件, Mybatis 使用 JDK 的动态代 理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这 4 种 接口对象的方法时,就会进入拦截方法,具体就是 InvocationHandler invoke() 方法,当然,只会拦截那些你指定需要拦截的方法。
        编写插件:实现 Mybatis Interceptor 接口并复写 intercept() 方法,然后在给 插件编写注解,指定要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文 件中配置你编写的插件。


要想了解更多:

千题千解·Java面试宝典_时光の尘的博客-CSDN博客

相关文章:

互联网Java工程师面试题·MyBatis 篇·第二弹

目录 16、Xml 映射文件中&#xff0c;除了常见的 select|insert|updae|delete标签之外&#xff0c;还有哪些标签&#xff1f; 17、Mybatis 的 Xml 映射文件中&#xff0c;不同的 Xml 映射文件&#xff0c;id 是否可以重复&#xff1f; 18、为什么说 Mybatis 是半自动 ORM 映射…...

Linux 下如何调试代码

debug 和 release 在Linux下的默认模式是什么&#xff1f; 是release模式 那你怎么证明他就是release版本? 我们知道如果一个程序可以被调试&#xff0c;那么它一定是debug版本&#xff0c;如果它是release版本&#xff0c;它是没法被调试的&#xff0c;所以说我们可以来调试一…...

腾讯云服务器简介和使用流程

腾讯云服务器在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是云服务器价格便宜比较省钱。腾讯云服务器网来详细说下腾…...

python 二分查找

1.二分查找首先被查找的序列是一个有序的。 2.明确序列的左右边界 3.找出序列中间的元素&#xff0c;判断如果是要查找的元素&#xff0c;返回元素 4.如果中间元素&#xff0c;大于或者小于查找的元素&#xff0c;那么改变左右边间&#xff0c;直到中间的数等于查找的元素。…...

通过async方式在浏览器中调用web worker

通过async方式在浏览器中调用web worker 近年来&#xff0c;网络应用程序变得越来越复杂&#xff0c;增加了越来越多的功能。因此&#xff0c;性能和响应性已成为 Web 开发人员关注的重点。解决这个问题的一个办法是使用web worker。 web worker简介 web worker是一个 javas…...

FPGA project : TFT_LCD

实验目标&#xff1a; 驱动TFT_LCD显示十色彩条。 重点掌握的知识&#xff1a; 1&#xff0c;液晶显示器&#xff0c;简称LCD(Liquid Crystal Display)&#xff0c;相对于上一代CRT显示器(阴极射线管显示器)&#xff0c;LCD显示器具有功耗低、体积小、承载的信息量大及不伤眼…...

2023年-华为机试题库B卷(Python)【满分】

华为机试题库B卷 已于5月10号 更新为2023 B卷 &#xff08;2023-10-04 更新本文&#xff09; 华为机试有三道题目&#xff0c;前两道属于简单或中等题&#xff0c;分值为100分&#xff0c;第三道为中等或困难题&#xff0c;分值为200分。总分为 400 分&#xff0c;150分钟考试…...

创建GCP service账号并管理权限

列出当前GCP项目的所有service account 我们可以用gcloud 命令 gcloud iam service-accounts list gcloud iam service-accounts list DISPLAY NAME EMAIL DISABLED terraform …...

想要精通算法和SQL的成长之路 - 验证二叉树

想要精通算法和SQL的成长之路 - 验证二叉树 前言一. 验证二叉树1.1 并查集1.2 入度以及边数检查 前言 想要精通算法和SQL的成长之路 - 系列导航 并查集的运用 一. 验证二叉树 原题链接 思路如下&#xff1a; 对于一颗二叉树&#xff0c;我们需要做哪些校验&#xff1f; 首先…...

ERROR 6400 --- [ main] com.zaxxer.hikari.pool.HikariPool : root - Exception

在引用的日志中&#xff0c;报告了Hikari连接池初始化期间的异常。具体异常信息是"Exception during pool initialization"。这个异常可能是由于与MySQL数据库的通信链接失败导致的。在引用中也提到了与SSL连接相关的错误。 根据引用中提供的代码&#xff0c;可以看到…...

CART算法解密:从原理到Python实现

目录 一、简介CART算法的背景例子&#xff1a;医疗诊断 应用场景例子&#xff1a;金融风控 定义与组成例子&#xff1a;电子邮件分类 二、决策树基础什么是决策树例子&#xff1a;天气预测 如何构建简单的决策树例子&#xff1a;动物分类 决策树算法的类型例子&#xff1a;垃圾…...

C++项目:【高并发内存池】

文章目录 一、项目介绍 二、什么是内存池 1.池化技术 2.内存池 3.内存池主要解决的问题 4.malloc 三、定长的内存池 四、高并发内存池整体框架设计 1.高并发内存池--thread cache 1.1申请内存&#xff1a; 1.2释放内存&#xff1a; 1.3用TLS实现thread cache无锁访…...

[论文笔记]BitFit

引言 今天带来一篇参数高效微调的论文笔记,论文题目为 基于Transformer掩码语言模型简单高效的参数微调。 BitFit,一种稀疏的微调方法,仅修改模型的偏置项(或它们的子集)。对于小到中等规模数据,应用BitFit去微调预训练的BERT模型能达到(有时超过)微调整个模型。对于大规…...

浅谈yolov5中的anchor

默认锚框 YOLOv5的锚框设定是针对COCO数据集中大部分物体来拟定的&#xff0c;其中图像尺寸都是640640的情况。 anchors参数共3行&#xff1a; 第一行是在最大的特征图上的锚框 第二行是在中间的特征图上的锚框 第三行是在最小的特征图上的锚框 在目标检测中&#xff0c;一…...

RabbitMQ-工作队列

接上文 RabbitMQ-死信队列 1 工作队列模式 xx模式只是一种设计思路&#xff0c;并不是指具体的某种实现&#xff0c;可理解为实现XX模式需要怎么去写业务代码。 之前的是简单的一个消费者一个生产者模式&#xff0c;下边是一个生产者多个消费者的情况&#xff1a; 这里先定义两…...

网站安全防护措施

网络安全的重要性在网站和app的发展下已经被带到了全新的高度&#xff0c;已然成为各大运维人员工作里不可或缺的环节&#xff0c;重视网络安全能给我们的网站带来更好的口碑&#xff0c;也能为企业生产创造更稳定的环境。下面我们一起来看看有哪些是我们运维人员能够做的。 1、…...

C++的继承基础和虚继承原理

1.继承概念 “继承”是面向对象语言的三大特性之一&#xff08;封装、继承、多态&#xff09;。 继承&#xff08;inheritance&#xff09;机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性基础上进行扩展&#xff0c;增加功能&…...

第三章:最新版零基础学习 PYTHON 教程(第十三节 - Python 运算符—Python 中的运算符函数 - 套装2)

Python 中的运算符函数 - 套装1 本文将讨论更多功能。 1. setitem(ob, pos, val):- 该函数用于在容器中的 特定位置分配值。操作 – ob[pos] = val 2. delitem(ob, pos):- 该函数用于删除容器中 特定位置的值。 操作 – del ob[pos] 3. getitem(ob, pos)&#x...

Linux网络编程:详解https协议

目录 一. https协议概述 二. 中间人截获 三. 常见的加密方法 3.1 对称加密 3.2 非对称加密 四. 数据摘要和数据签名的概念 五. https不同加密方式的安全性的探究 5.1 使用对称加密 5.2 使用非对称加密 5.3 非对称加密和对称加密配合使用 六. CA认证 七. 总结 一.…...

LLVM IR 文档 专门解释 LLVM IR

https://llvm.org/docs/LangRef.html#phi-instruction...

免费服务器搭建网盘教程,给电脑挂载500G磁盘

免费服务器搭建网盘教程&#xff0c;给电脑挂载500G磁盘 请勿注册下载&#xff0c;注册下载是空白文件&#xff0c;使用免登录下载 免费搭建网盘教程&#xff0c;给电脑挂载500G磁盘 其他按照下载教程操作教程代码: 下载下来的文件pancn 文件拖到您创建的容器 手机的话点击…...

【Java】微服务——Nacos配置管理(统一配置管理热更新配置共享Nacos集群搭建)

目录 1.统一配置管理1.1.在nacos中添加配置文件1.2.从微服务拉取配置1.3总结 2.配置热更新2.1.方式一2.2.方式二2.3总结 3.配置共享1&#xff09;添加一个环境共享配置2&#xff09;在user-service中读取共享配置3&#xff09;运行两个UserApplication&#xff0c;使用不同的pr…...

QT基础入门——信号和槽机制(二)

前言&#xff1a; 在Qt中&#xff0c;有一种回调技术的替代方法&#xff1a;那就是信号和槽机制。当特定事件发生时&#xff0c;会发出一个信号。Qt的小部件中有许多预定义的信号&#xff0c;但我们可以将小部件子类化&#xff0c;向它们添加自定义的信号。槽是响应特定信号的…...

黑豹程序员-架构师学习路线图-百科:JavaScript-网页三剑客

文章目录 1、为什么需要JavaScript2、发展历史3、什么是JavaScript3.1、JavaScript介绍3.2、JavaScript内部结构3.3、主要功能 4、TypeScript 1、为什么需要JavaScript 前面我们已经了解了网页三剑客的HTML和CSS&#xff0c;已经明确了它们的职责。 HTML负责页面的展现&#x…...

三、互联网技术——IP子网划分

文章目录 一、IP地址基础1.1 IP地址分类1.2 网络掩码/子网掩码 二、子网划分VLSM2.1 为什么要进行子网划分2.2 怎么进行子网划分2.3 子网划分原理2.4 例题一2.5 例题二2.6 例题三2.6 例题四2.7 例题五2.8 例题六2.9 例题七2.10 例题八 三、无类域间路由CIDR3.1 例题一3.2 例题二…...

TinyWebServer学习笔记-log

为什么服务器要有一个日志系统&#xff1f; 故障排查和调试&#xff1a; 在服务器运行期间&#xff0c;可能会发生各种问题和故障&#xff0c;例如程序崩溃、性能下降、异常请求等。日志记录了服务器的运行状态、错误信息和各种操作&#xff0c;这些日志可以用来快速定位和排查…...

【kubernetes】CRI OCI

1 OCI OCI(Open Container Initiative)&#xff1a;由Linux基金会主导&#xff0c;主要包含容器镜像规范和容器运行时规范&#xff1a; Image Specification(image-spec)Runtime Specification(runtime-spec)runC image-spec定义了镜像的格式&#xff0c;镜像的格式有以下几…...

竞赛 机器视觉opencv答题卡识别系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 答题卡识别系统 - opencv python 图像识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分…...

Youtube视频下载工具分享-油管视频,音乐,字幕下载方法汇总

YouTube视频下载方法简介 互联网上存在很多 YouTube 下载工具&#xff0c;但我们经常会发现自己收藏的工具没过多久就会失效&#xff0c;我们为大家整理的这几种方法&#xff0c;是存在时间较久并且亲测可用的。后续如果这些工具失效或者有更好的工具&#xff0c;我们也会分享…...

【算法练习Day11】滑动窗口最大值前 K 个高频元素

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 滑动窗口最大值前 K 个高频…...

最好的产品网站建设/网络推广费用大概价格

如何使技术工程师也能写出清晰和简洁的语句&#xff1f; 以新闻报道的文风加上技术报告的格式。在新闻报道里&#xff0c;各段落都是以重要性先后排列的&#xff0c;所以读者可以在任何一个丧失兴趣的段落停下来&#xff0c;他们知道最重要的部分都已经读到&#xff0c;余下未读…...

网站app制作教程/品牌广告文案

Java中的计算主要有double,float,int,long,BigDecimal1、float和double主要用户科学计算和工程计算&#xff0c;它们执行二进制浮点运算&#xff0c;这是为了在广泛的数值范围上提供较为精确的快速近似计算而设计的。然而它们并没有提供完全精确的结果&#xff0c;所以不应该被…...

免费英文网站建设/网络营销与直播电商专升本

把数组排成最小的数(三十二) 题目描述 输入一个正整数数组&#xff0c;把数组里所有数字拼接起来排成一个数&#xff0c;打印能拼接出的所有数字中最小的一个。例如输入数组{3&#xff0c;32&#xff0c;321}&#xff0c;则打印出这三个数字能排成的最小数字为321323。 代码…...

做网站公司汉狮价格/西安网站外包

在发布APP后&#xff0c;发现等了很久都访问不出来页面&#xff0c;这个可能是因为我们没有将本地的文件公开出去。 在【Assets】中按照以下步骤将数据公开即可...

政府网站建设 江苏省/百度新闻官网

Android的包文件APK分为两个部分&#xff1a;代码和资源&#xff0c;所以打包方面也分为资源打包和代码打包两个方面&#xff0c;这篇文章就来分析资源和代码的编译打包原理。 具体说来&#xff1a; 1.通过AAPT工具进行资源文件&#xff08;包括AndroidManifest.xml、布局文件、…...

手机网站 宽度/台州网站制作维护

传送门&#xff1a;poj 1077 Eight 题目大意 输入的八数码 将一个八数码最后转换为 1 2 3 4 5 6 7 8 x 的格式&#xff0c;然后打印出路径 康拓展开 如果按照平常的思路&#xff0c;把x的位置看做0&#xff0c;一共有8&#xff01;个状态&#xff0c;来判断某一个状态…...