面试官:哟,Mybatis讲的挺透彻啊? 网友:看完这篇Mybatis,思路突然清晰了!

_set的用法,本章适用多对多和一对多查询 说说set用法 首先你有两个类 一个类有桥(A) 一个正常(B) 1、如果通过A访问B 就是 A.桥.B中的属性 2、如果通过B访问A 就是 B_set.A中的属性 或者你在一对多或者多对多的外键中指定related_name的值 B.related_name.A中的属性 # Create your models here. class Yuedui(models.Model): ... 阅读详情

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC
代码和手动设置参数以及获取结果集。

什么是 MyBatis?

答:

  • MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。

mybatis框架

在这里插入图片描述

讲下 MyBatis 的缓存

答:

  • MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面,默认就有,二级缓存放在它的命名空间里,默认是不打开的,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态),可在它的映射文件中配置

本人在这里整理了20多家公司的面试题,以及各种关于Spring、Spring boot、Spring MVC、MyBatis、MySQL、JVM等知识点,如果有需要的小伙伴可以加群1149778920 暗号:qf
在这里插入图片描述

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

答:

  • Mybatis 使用 RowBounds 对象进行分页,也可以直接编写 sql 实现分页,也可以使用Mybatis 的分页插件。
  • 分页插件的原理:实现 Mybatis 提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql。
    举例:select * from student,拦截 sql 后重写为:select t.* from (select * from student)tlimit 0,10

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

答:

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

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 有哪些不同?

答:

  • Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己编写 Sql 语句,不过 mybatis 可以通过 XML 或注解方式灵活配置要运行的 sql 语句,并将java 对象和 sql 语句映射生成最终执行的 sql,最后将 sql 执行的结果再映射生成 java 对象。
  • Mybatis 学习门槛低,简单易学,程序员直接编写原生态 sql,可严格控制 sql 执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套 sql 映射文件,工作量大。
  • Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用 hibernate 开发可以节省很多代码,提高效率。但是Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。

MyBatis 里面的动态 Sql 是怎么设定的?用什么语法?

答:MyBatis 里面的动态 Sql 一般是通过 if 节点来实现,通过 OGNL 语法来实现,但是如果要
写的完整,必须配合 where,trim 节点,where 节点是判断包含节点有内容就插入 where,否则不
插入,trim 节点是用来判断如果动态语句是以 and 或 or 开始,那么会自动把这个 and 或者 or
取掉。

Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?

答:
第一种是使用标签,逐一定义列名和对象属性名之间的映射关系。
第二种是使用 sql 列的别名功能,将列别名书写为对象属性名,比如 T_NAME AS NAME,对
象属性名一般是 name,小写,但是列名不区分大小写,Mybatis 会忽略列名大小写,智能
找到与之对应对象属性名,你甚至可以写成 T_NAME AS NaMe,Mybatis 一样可以正常工
作。
有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时使用反射给对象的属性
逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

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

答:还有很多其他的标签,、、、、
,加上动态 sql 的 9 个标签,
trim|where|set|foreach|if|choose|when|otherwise|bind 等,其中为 sql 片段标签,通
过标签引入 sql 片段,为不支持自增的主键生成策略标签。

当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定 pojo?

答:
1)通过在查询的 sql 语句中定义字段名的别名。
2)通过来映射字段名和实体类属性名的一一对应的关系。

模糊查询 like 语句该怎么写

答:
1)在 java 中拼接通配符,通过#{}赋值
2)在 Sql 语句中拼接通配符 (不安全 会引起 Sql 注入)

最后

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
有需要的小伙伴可以加群1149778920 暗号:qf

在这里插入图片描述
在这里插入图片描述

浅谈 Mybatis 框架 MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程(多条SQL语句的集合)以及高级映射。MyBatis 去除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO (Plain Old Java Objects,普通老式Java对象)为数据库中的记录。存储过程:高级映射:程序中的类对应数据库中的表,程序中的类里的属性对应数据库的表中的字段。 阅读详情

相关推荐

django admin.py 外键,反向查询的实例

今天小编就为大家分享一django admin.py 外键,反向查询的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Django之单表查询,多表查询(正向、反向查询),聚合查询

一、 常用字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。 IntegerField 一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,) CharField 字符类型,必须提供m...

weixin_30537391的博客 428

Django使用详解:ORM 的反向查找(related_name)

今天小编就为大家分享一Django使用详解:ORM 的反向查找(related_name),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Mybatis 框架 基础语法

考点: SQL 注入#{}最终生成预编译sql,预编译Sql语句中?替换#{}内容一个#{} 替换一个?在模糊查询时要使用′{}%’ ,因为?不能出现在‘’中,而${}不会生成预编译sql,会直接将传过来的字符串进行拼接。但这种方式性能低、不安全、存在SQL注入问题因此可换成:concat(‘%’,‘张’,‘%’)插件在idea中下载 MybatisX插件,更好地使用mybtiais。

twtongwei的博客 1319

MyBatis基础语法详解,真的全面

关于Mybatis学习的一点经验分享,简单易懂

qq_42176665的博客 7283

四、mybatis第四节

在我们日常使用中,缺少不了分页查询,就好比你百度时,那么多的数据,肯定需要分页来处理。那么我们就可以用分页插件来帮我们快速实现分页查询操作首先了解一下分页查询的sql语句: 其中的page代表你想要查询的页码数,pageSize代表你想要每页显示的数据个数。 那么我们该如何使用分页插件呢?具体步骤如下:(1)在pom.xml中引入pageHelper的依赖jar包 (2) 在mybatis.xml中设置pageHelper的拦截器(写在configuration标签内)

lrs998563的博客 1123

Java面试高效突击:AI辅助与真题驱动的2026秋招备考方案

在软件工程领域,面试准备是开发者职业发展中的关键环节,其核心在于构建系统化的知识体系和提升问题解决能力。其原理是通过结构化学习与刻意练习,将分散的知识点整合为可复用的认知模型。掌握高效的备考方法具有重要技术价值,它能帮助开发者在有限时间内精准提升技术深度与广度,从容应对技术考察。这一过程尤其适用于求职冲刺、知识体系梳理等应用场景。本文聚焦于Java后端面试,深入探讨如何利用AI大模型进行模拟面试和真题驱动的逆向学习法,实现高效、精准的备考,为即将到来的招聘季做好充分准备。

weixin_34060299的博客 424

django的正向查询和反向查询

django的正向查询和反向查询

weixin_62935305的博客 3031

Django 数据库高级操作-过滤,反向查询,性能

Django 数据库高级操作-过滤,反向查询,性能 单表的基本操作 http://beanxyz.blog.51cto.com/5570417/1945887 常见字段的使用 http://beanxyz.blog.51cto.com/5570417/1945909 ...

litang199612的博客 1510

Django模型进阶

接上一节。

Kongfutu的博客 630

【超详细】MyBatis详解

Mybatis

weixin_48373085的博客 2万+

MyBatis原理及搭建教程

1. MyBatis MyBatis是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 持久化:持久化就是将程序的数据在持久状态和瞬时状态转化的过程。 持久层: Dao层、Service层、Controller层 1. 第一

小辣鸡富贵的博客 540

Django使用:ORM 的反向查找(related_name)

先定义两个模型,一个是A,一个是B,是一对多的类型。class A(models.Model): name= models.CharField('名称', max_length=32)class B(models.Model): a= models.ForeignKey(A, verbose_name='A类',related_name = "test") name = mo

GTraveler 1万+

django ORM的反向查找related_name

首先说一下什么是正向查找, 比如order表,有一个表项在model中定义为:     order = models.ForeignKey(         'oms.Order',         related_name='order_detail',         on_delete=models.CASCADE) order_details = OrderDetail

Power of technology will free your body and spirit 2007

【Django】外键查询和反向查询

【Django】外键查询和反向查询 在models.py中有两个模型,Person表是主表,Car是子表,Car表外键至Person表。Car与Person是多对一关系 from django.db import models class Person(models.Model): name = models.CharField(max_length=64) age = models.IntegerField() tel = models.CharField(max_length=

xmy7007的博客 4016

面试有点慌?来看看18个MyBatis高频知识及学习笔记

下面是精心整理的18个MyBatis高频知识及学习笔记,不管处不处在面试阶段的朋友都可以领取保存,以备不时之需01 18个MyBatis高频知识点(含解析)1 精#{}和${}的区别是什么?既然{}会引起sql注入,为什么有了#{}还需要有{}呢?那其存在的意义是什么? #{}主要用于预编译,而预编译的场景其实非常受限,而${}用于替换,很多场景会出现替换,而这种场景可不是预编译 2 数据库链接中断如何处理? 数据库的访问底层是通过tcp实现的,当链接中断是程序是无法得知,导致程序一直会停顿一段时间在这,

老男孩的架构路 287

Django中的反向查找

反向查询即通过主表查询子表信息,子表是带有外键的表。 先定义三个模型,一个是A,一个是B,一个是C,其中A与B,A与C是一对多的类型,B的外键里面设置了related_name,C没有 class A(models.Model): name= models.CharField('类A', max_length=32) class B(models.Model): a= model...

weixin_42143550的博客 1976
上一篇: MySQL数据库:超强优化,强悍与实用并齐的性能调优!
下一篇: 跟面试官整整对线了一个小时的并发编程,最后赢得却是我!
SpringBoot_
博客等级 码龄7年 445粉丝 96原创
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值