java架构师面试题——MyBatis篇

Java架构师常见基础面试题(附答案) 1)Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、Executor这4种接口的插件,Mybatis通过动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。spring是一个业务层的框架,是一个整合的框架,能够很好的黏合表示层和持久层。 阅读详情

1、什么是MyBatis

(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL

语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直

接编写原生态sql,可以严格控制sql执行性能,灵活度高。

(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避

免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和

statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果

映射为java对象并返回。(从执行sql到返回result的过程)。

2、说说MyBatis的优点和缺点

优点:

(1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写

在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并

可重用。

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

接;

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

库MyBatis都支持)。

(4)能够与Spring很好的集成;

(5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象

关系组件维护。

缺点

(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有

一定要求。

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

3、#{}和${}的区别是什么?

#{}是预编译处理,${}是字符串替换。

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

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

使用#{}可以有效的防止SQL注入,提高系统安全性。

4、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>

select order_id id, order_no orderno ,order_price price form orders where

order_id=#{id};

</select>

第2种: 通过来映射字段名和实体类属性名的一一对应的关系。

<select id="getOrder" parameterType="int" resultMap="orderresultmap">

select * from orders where order_id=#{id}

</select>

<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>

<!–用id属性来映射主键字段–>

<id property=”id” column=”order_id”>

<!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–>

<result property = “orderno” column =”order_no”/>

<result property=”price” column=”order_price” />

</reslutMap>

5、Mybatis是如何进行分页的?分页插件的原理是什么?

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分

页。可以在sql内直接拼写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物

理分页,比如:MySQL数据的时候,在原有SQL后面拼写limit。

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截

待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

6、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有

哪些映射形式?

第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。

第二种是使用sql列的别名功能,将列的别名书写为对象属性名。

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋

值并返回,那些找不到映射关系的属性,是无法完成赋值的。

7、 如何执行批量插入?

首先,创建一个简单的insert语句:

<insert id=”insertname”>

insert into names (name) values (#{value})

</insert>

然后在java代码中像下面这样执行批处理插入:

list<string> names = new arraylist();

names.add(“fred”);

names.add(“barney”);

names.add(“betty”);

names.add(“wilma”);

// 注意这里 executortype.batch

sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch);

try {

namemapper mapper = sqlsession.getmapper(namemapper.class);

for (string name : names) {

mapper.insertname(name);

}

sqlsession.commit();

}catch(Exception e){

e.printStackTrace();

sqlSession.rollback();

throw e;

}

finally {

sqlsession.close();

}

8、Xml映射文件中,除了常见的select|insert|updae|delete

标签之外,还有哪些标签?

加上动态sql的9个标签,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策

略标签。

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

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置

association节点配置一对一的类就可以完成;

嵌套查询是先查一个表,根据这个表里面的结果的 外键id,去再另外一个表里面查询数据,也是通过

association配置,但另外一个表的查询通过select属性配置。

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

11、说说Mybatis的缓存机制:

Mybatis整体:

一级缓存localCache

在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的 SQL,

MyBatis 提供了一级缓存的方案优化这部分场景,如果是相同的 SQL 语句,会优先命中一级缓存,

避免直接对数据库进行查询,提高性能。

每个 SqlSession 中持有了 Executor,每个 Executor 中有一个 LocalCache。当用户发起查询时,

MyBatis 根据当前执行的语句生成 MappedStatement,在 Local Cache 进行查询,如果缓存命中

的话,直接返回结果给用户,如果缓存没有命中的话,查询数据库,结果写入 Local Cache,最后

返回结果给用户。具体实现类的类关系图如下图所示:

1. MyBatis 一级缓存的生命周期和 SqlSession 一致。

2. MyBatis 一级缓存内部设计简单,只是一个没有容量限定的 HashMap,在缓存的功能性上有

所欠缺。

3. MyBatis 的一级缓存最大范围是 SqlSession 内部,有多个 SqlSession 或者分布式的环境下,

数据库写操作会引起脏数据,建议设定缓存级别为 Statement。

二级缓存

在上文中提到的一级缓存中,其最大的共享范围就是一个 SqlSession 内部,如果多个 SqlSession

之间需要共享缓存,则需要使用到二级缓存。开启二级缓存后,会使用 CachingExecutor 装饰

Executor,进入一级缓存的查询流程前,先在 CachingExecutor 进行二级缓存的查询,具体的工作

流程如下所示。

二级缓存开启后,同一个 namespace 下的所有操作语句,都影响着同一个 Cache,即二级缓存被

多个 SqlSession 共享,是一个全局的变量。

当开启缓存后,数据的查询执行的流程为:

二级缓存 -> 一级缓存 -> 数据库

1. MyBatis 的二级缓存相对于一级缓存来说,实现了 SqlSession 之间缓存数据的共享,同时粒度

更加细,能够到 namespace 级别,通过 Cache 接口实现类不同的组合,对 Cache 的可控性

也更强。

2. MyBatis 在多表查询时,极大可能会出现脏数据,有设计上的缺陷,安全使用二级缓存的条件

比较苛刻。

3. 在分布式环境下,由于默认的 MyBatis Cache 实现都是基于本地的,分布式环境下必然会出现

读取到脏数据,需要使用集中式缓存将 MyBatis 的 Cache 接口实现,有一定的开发成本,直

接使用 Redis、Memcached 等分布式缓存可能成本更低,安全性也更高。

12、JDBC 编程有哪些步骤?

1.装载相应的数据库的 JDBC 驱动并进行初始化:

Class.forName("com.mysql.jdbc.Driver");

2.建立 JDBC 和数据库之间的 Connection 连接:

Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?

characterEncoding=UTF-8", "root", "123456");

3.创建 Statement 或者 PreparedStatement 接口,执行 SQL 语句。

4.处理和显示结果。

5.释放资源。

13、MyBatis 中见过什么设计模式?

14、MyBatis 中比如 UserMapper.java 是接口,为什么没有实

现类还能调用?

使用JDK动态代理+MapperProxy。本质上调用的是MapperProxy的invoke方法。

1000+道 互联网Java架构师面试题 这套 1000+ 道的 Java 面试手册我整理了足足 1 个月,上传到 GitHub 上目前 star 数达到了 30K+ 。2022 年的互联网行业竞争越来越严峻,面试也是越来越难,一直以来我都想整理一套完美的面试宝典,直到现在刚弄好。 阅读详情

相关推荐

最全架构师面试130题

最全架构师面试130题!

Java面试——MyBatis篇

Java面试——MyBatis篇

不迁怒,不贰过。小知识,大智慧。 4716

RISC-V V向量指令集学习笔记——访存指令

RISC-V V向量指令集学习笔记——访存指令

qq_41724469的博客 5137

Java——《面试题——MyBatis篇》

(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直 接编写原生态sql,可以严格控制sql执行性能,灵活度高。(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避 免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

行秋的博客 1369

KUKA机器人与S7-1200 PLC实现Profinet通讯配置步骤详解

在工业自动化产线中,PLC与工业机器人之间的高效数据交换是控制逻辑落地的关键。传统硬接线方案在信号点多时布线复杂、故障排查困难,而现场总线技术通过一根网线即可实现主从设备间的周期通讯。Profinet作为主流工业以太网协议,由S7-1200作为IO Controller主站,KUKA机器人作为IO Device从站,在WorkVisual与TIA Portal中完成设备组态、I/O映射及信号分配,即可替代成捆电缆,稳定传输启停、状态及报警信号。这一方案适用于汽车、3C、物流等行业的自动化产线,尤其适合需要扩

weixin_42519985的博客 251

ACR 磁共振安全手册 2024 更新版:全面保障 MRI 安全实践

MR 环境:MR 系统周围的三维空间,包含法拉第屏蔽体积和 9 高斯线,医疗设备在此区域可能因暴露于 MR 设备产生的电磁场而构成危险,需进行访问控制以降低风险MR 受控访问区域:MR 系统周围的局部定义区域,包含 MR 环境(包括其静磁场),访问仅限于授权人员MR 抛射物区域:围绕 MRI 系统的 IV 区区域,铁磁物体在此有成为抛射物的风险图一 磁共振环境:场地规划与区域划分。

楚山之石的博客 2604

2023 Java 面试题之MyBatis篇

持续更新内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、 Linux 等技术栈(滴滴滴.会持续更新哦,记得点赞、关注、分享三连击哈).MyBatis 面试题:(关注末尾获取完整答案)1、什么是 Mybatis?1、Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身

程序员泥瓦匠 956

10.2 构网型变流器引发的次同步振荡与宽频振荡问题:机理分析与抑制技术

随着构网型变流器在新型电力系统中的规模化部署,其作为电压源主动支撑电网的能力得到验证的同时,也引发了一系列前所未有的稳定性问题。传统的同步发电机主导的电力系统中,振荡模式主要集中于**低频区间**。然而,构网型变流器通过快速数字控制实现的虚拟同步、惯性响应等先进功能,其控制环路动态与电网阻抗、其他电力电子设备之间产生了复杂的交互作用。这种交互不仅可能诱发经典的**次同步振荡**,更可能催生频率范围从数赫兹到数百赫兹甚至上千赫兹的**宽频振荡**。

技术工作者 1315

Mybatis常见的面试题

8.2 MyBatis面试题总结 8.2.1 #{}与${}的区别 #{}:是sql的参数占位符,Mybatis会将sql中的#{}替换为?,按序给sql的?占位符设置参数值。 这个是根据参数变化不是动态sql(是有if语句之类的sql) ${}:是在数据库配置文件中的变量占位符,属于静态文本替换,比如${Driver}会被静态替换为com.mysql.jdbc.Driver。 8.2.2 Xml映射文件中,除了常见的select/Inserct/update/delete标签之外..

qq_40262372的博客 3914

【WRF运行报错】总结WRF运行时报错及解决方案(持续更新)

总结WRF运行时报错及解决方案(持续更新)

WW、forever的博客 1634

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水果识别系统(Python+PySide6界面+训练代码)

本文详细介绍了基于YOLO系列目标检测算法(包括YOLOv5、YOLOv6、YOLOv7和YOLOv8)的水果识别系统的设计与实现。系统采用Python语言开发,结合PySide6构建用户界面,实现了从数据准备、模型训练到部署应用的全流程。本文将提供完整的代码实现、详细的训练过程分析以及性能对比实验,并给出推荐的数据集资源。该系统可以准确识别多种水果类型,为智能农业、自动售货、食品加工等领域提供技术支持。

YOLO 566

JAVA面试题之mybatis

能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运。要拦截哪一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。、当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定。不仅可以执行一对一、一对多的关联查询,还可以执行多对一,多对多的。逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。时,可以根据对象关系模型直接获取,所以它是全自动的。关联查询,多对一查询,其实就是一对一查询,只需要把。提供的接口,实现自定义插件,在插件的拦截方法内拦。

Annzz123的博客 776

在 RAP 中把业务对象“搬到网口上”:service definition 与 service binding 的全流程、范式与实战

本文解析了SAP ABAP开发中service definition和service binding的关键作用。service definition负责选择要暴露的CDS实体和行为,形成服务模型;而service binding则将服务绑定到具体协议(如OData),生成可访问的端点。两者分离带来三大优势:支持同一模型多重发布、降低环境迁移耦合度、强化安全治理。文章通过预订业务对象的端到端示例,展示了如何从CDS建模到生成Fiori Elements预览。最后以售后工单业务为例,说明这种架构如何支持内外服务

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 392

阿里巴巴Java架构师岗面试题(正式版)!

1、为什么要用SpringBoot2、Spring Boot的核心注解是哪个?它主要由哪几个注...3、运行Spring Boot有哪几种方式?4、如何理解Spring Boot中的Starters?5、如何在Spring Boot启动的时候运行—些特定的代码?6、Spring Boot需要独立的容器运行吗?7、Spring Boot中的监视器是什么?8、如何使用Spring Boot实现异常处理?9、你如何理解Spring Boot中的Starters?

程序员高级码农的博客 1322

UG\NX二次开发 获取对象的引用集

获取对象的引用集,一个对象可能有多个引用集,下面这个封装函数可以获取对象的所有引用集。

王牌飞行员_里海的博客 490

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

网易资深Java架构师:php转java

前言 本份文档内容涵盖: Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、 Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux等技术栈,共1000多道面试题。 由于文档内容过多,所以只列举了以下目录部分,每个知识点都有更细化的内容! 一面 自我介绍 项目难度介绍 如何实现延时任务 如何实现限流 线程池的参数 能不能自己实现一个java.lang

m0_57501529的博客 155

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

这份485页32W字Java面试手册,让众多粉丝直通阿里!

前言 现在"内卷"是个热门词,各行各业,从学习到工作,言必谈内卷。没想到在阿里,我也能遇到内卷,一位阿里P8架构师熬了一个月肝出了这份32W字Java面试手册,在Github标星31K+,我只能直呼牛逼!这么厉害的大佬为我们整理出了一套完美的面试资料,我们有什么资格不努力,今天我特地问这位大佬要来了这份面试题,分享给大家,已经有人靠这份面试题那些众多大厂的offer了。 这套面试题有一千多道,全是大厂面试真题,内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、M

weixin_57907028的博客 278

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

可能是最全的java架构师面试题

架构师必读 最全最新java面试题系列全家桶(带答案) 架构师职位常见面试题 源码分析 常用设计模式 23种经典设计模式都有哪些,如何分类 阿里java设计模式面试题 Spring 框架中都用到了哪些设计模式 开发中都用到了那些设计模式?用在什么场合? 微服务架构的六种常用设计模式是什么? 1、proxy代理模式 2、factory工厂模式 3、singleton单例模式 4、delegate委派...

jovisoft的专栏 2万+

1000 道 Java 架构师岗面试题

面试中总结了 1000 道经典的 Java 面试题,里面包含面试要回答的知识重点,并且我根据知识类型进行了分类,可以说非常全面了~由于文章篇幅问题,以下只展示部分题目内容,需要完整文档的朋友可以在文末获取。

sjkflw121150的博客 893

《互联网Java架构师面试题集锦》

《互联网Java架构师面试题集锦》 去发现同类优质开源项目:https://gitcode.com/ 欢迎来到本资源仓库!在这里,我们为您提供了一份全面的面试题集,包含1000道专为互联网Java架构师设计的面试题目。此资料集是您准备面试过程中的宝贵助手,可以帮助您深入了解Java及相关技术栈。 资源简介 本资源文件包含以下技术栈的面试题: Java 基础与进阶 MyBatis ZooKeepe...

gitblog_06706的博客 651

Java架构师面试题及核心知识资源集

Java架构师面试题及核心知识资源集 去发现同类优质开源项目:https://gitcode.com/ 资源介绍 本资源仓库包含两份珍贵的资料,旨在帮助广大Java工程师和架构师在面试中脱颖而出,以及在日常工作中巩固和提升技术栈。 资源一:1000道互联网Java架构师面试题.pdf 这是一本涵盖Java架构师面试常见题目的宝典,内容包括但不限于以下技术栈: Java 基础 MyBatis Zo...

gitblog_06798的博客 503

Java架构师面试题系列之Mybatis面试专题(36题,含详细答案解析)

关联对象查询,有两种实现方式,一种是单独发送一个 sql 去查询关联对象,赋给主对象,然后返回主对象。毕竟 namespace 不是必须的,只是最佳实践而已。原理是,Mybatis 解析 A 标签,发现 A 标签引用了 B 标签,但是 B 标签尚未解析到,尚不存在,此时,Mybatis 会将 A 标签标记为未解析状态,然后继续解析余下的标签,包含 B 标签,待所有标签解析完毕,Mybatis 会重新解析那些被标记为未解析的标签,此时再解析 A 标签时,B 标签已经存在,A 标签也就可以正常解析完成了。

pingguocu3的博客 605

2026版Java架构师面试题及答案整理汇总

这套面试题可以说是你面试必备的题库,由于篇幅限制,笔记无法全部为大家展示出来,就以截图主要内容的形式让大家参考啦,需要完整版的小伙伴可以点击下方名片获取。

m0_69632475的博客 1018

2026年1000道Java架构师岗面试题汇总

面试中总结了1000道经典的Java面试题,里面包含面试要回答的知识重点,并且我根据知识类型进行了分类,可以说非常全面了!

sjkflw121150的博客 723

互联网Java架构师面试题集锦:全面掌握Java架构核心技能

互联网Java架构师面试题集锦:全面掌握Java架构核心技能 去发现同类优质开源项目:https://gitcode.com/ 互联网Java架构师面试题集锦:项目的核心功能/场景 全面覆盖Java架构师面试必备题目,助力求职者顺利通关。 项目介绍 在互联网行业,Java架构师是一个至关重要的角色。《互联网Java架构师面试题集锦》项目旨在为广大Java架构师求职者提供一份全面的面试题库。这份题库...

gitblog_06793的博客 461
上一篇: java架构师面试题——Spring篇
下一篇: java架构师面试题——ElasticSearch篇
杜引强
博客等级 码龄13年 806粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值