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

Java面试——MyBatis相关知识

目录

1.什么是MyBatis

2.MyBatis优缺点

3.MyBatis工作原理

4.MyBatis缓存模式

5.MyBatis代码相关问题

6.MyBatis和hibernate区别


1.什么是MyBatis

MyBatis是一个半ORM持久层框架(对象关系映射),基于JDBC进行封装,使得开发者可以专注于SQL语句,不用关系JDBC操作的流程。

MyBatis支持定制化 、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOS(Plain Ordinary Java Object,普通的 Java对象,即实际开发中的实体类)映射成数据库中的记录。

2.MyBatis优缺点

MyBatis作为市面上应用最为广泛的数据库框架,具有以下优点:

  • 简单易学:本身就很小且简单。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

  • 灵活便捷:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。同时,减少了JDBC相关代码,大大减少了代码量。

  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

  • 兼容性好:基于JDBC进行封装,所以可以和很多数据库兼容。

  • 提供xml标签,支持编写动态sql。

但同时,MyBatis也还具有一定的缺点:

  • SQL语句编程量较大,较为考验使用者的SQL功力。
  • SQL语句与具体数据库依赖很大,使得数据库移植性差。

3.MyBatis工作原理

MyBatis的工作原理主要依赖于SqlSessionFactory和SqlSession两大类。其主要分为两大过程:

(1)MyBatis启动加载。Mybatis会获取一个SqlSessionFactory对象,完成全局配置文件和映射文件的加载解析操作,然后把相关信息保存到Configuration对象中。然后通过SqlSessionFactory获取SqlSession对象(基于DefaultSqlSessio对象实现)。

SqlSessionFactory类,它是单个数据库映射关系经过编译后的内存镜像,主要是创建DefaultSqlSessionFactory对象进行具体实现。而SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得,而SqlSessionFactoryBuildr则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。

(2)MyBatis处理请求。SqlSession类中提供了处理请求的方法(select、update等),并调用对应的Executor处理。处理过程中,如果有配置缓存,先走二级缓存,再走一级缓存,缓存不命中,再走数据库操作。会通过StatementHandler处理,先通过ParameterHandler处理SQL中的占位符,再通过ResultSetHandler处理结果集的映射。

SqlSession类,同理,主要是创建DefaultSqlSession对象进行具体实现。SqlSession接口实例执行方法的过程中主要会去执行Executor类的方法,进行请求的具体处理。

总结来说,具体的工作流程就是通过SqlSessionFactoryBuilder从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例,再由SqlSessionFactory创建出一个SqlSession,并由该SqlSession进行请求的处理,执行事务和SQL语句。

4.MyBatis缓存模式

mybatis为减轻数据库压力,提高数据库性能,提供了两级缓存机制:

(1)一级缓存:

基于会话(session)的缓存。一级缓存是默认放开的,但需开启事务进行使用(就是同一个事务中的第二次查询会走缓存)。MyBatis中一级缓存也叫做本地缓存,于SqlSession层面实现的,所以作用范围是在同一个SqlSession中,不同的SqlSession及时查询相同的数据也不会走缓存。

(2)二级缓存:

基于进程(使用装饰器维护,涉及到了装饰器模式,需要了解可参考java设计模式——装饰器模式)的缓存。MyBatis中二级缓存的作用域是namespace(命名空间),所以很显然二级缓存是需要存储在SqlSession之外的:

二级缓存缓存范围比一级缓存更大,不同的SQLSession可以访问二级缓存的内容,所以二级缓存需要自己开启,哪些数据放入二级缓存需要自己指定。

开启方式(application.yml文件配置):

# mybatis相关配置
mybatis:configuration:#开启MyBatis的二级缓存cache-enabled: true

或是在mapper.xml文件中添加代码:

 其中eviction属性指缓存回收策略,flushInterval则是缓存更新时间(上述代码中为1分钟)

eviction:缓存的回收策略,默认的是 LRU。

  • LRU - 最近最少使用,移除最长时间不被使用的对象。
  •     FIFO - 先进先出,按对象进入缓存的顺序来移除它们。
  •     SOFT - 软引用,移除基于垃圾回收器状态和软引用规则的对象。
  •     WEAK - 弱引用,更积极地移除基于垃圾收集器和弱引用规则的对象。
     

(3)三级缓存:

三级缓存又称为自定义缓存,如使用Redis进行缓存等,需要自行进行配置操作。

实际代码中如何开启

5.MyBatis代码相关问题

(1)获取自增主键:如果数据库中设计了主键id自动增长,那么可以通过MyBatis中的mapper.xml文件中的属性配置,获取该值,并进行插入:

<insert id="addEmployee" parameterType="employee" useGeneratedKeys="true" keyProperty="id">insert into tbl_employee (id, name, email, gender)values (#{id}, #{name}, #{email}, #{gender});
</insert>

核心代码为: useGeneratedKeys="true" keyProperty="id"

(2)属性名和字段名不一致:主要通过resultMap标签处理。

<resultMap id="empResultMap" type="Emp"><id column="student_id" property="id"></id><result column="s_name" property="name"></result>    
</resultMap>
<select resultMap="empResultMap">select * from student where student_id = #{id}
</select>

(3)#和$的区别:

  • #{}是预编译处理,会把传入的数据都当成一个字符串来处理,所以会在传入的数据上面加一个双引号。其在mybatis处理时替换为?,然后进行赋值。
  • ${}是在mybatis处理时直接替换,作用相等于是字符串拼接,所以会有SQL注入风险。

例子:

select * from student where name= #{name}

上述语句中,该sql语句会将#{name}替换为?,然后获取到传入的@Param的参数值时(比如name="seven"),再传入(整个"seven"进行传入)。

select * from student where name= ${name}

 如果传入的name类型为整型类型,那么在执行sql语句时就不会出错,但是如果传入的name类型为字符串型,就会变成select * from student where name=seven,执行会报错。

所以,一般情况下,传入参数使用 #{},如果需要凭借SQL语句时,才使用${}。

6.MyBatis和hibernate区别

Hibernate也是一个对象关系映射框架,同样基于JDBC进行封装,工作原理与MyBatis类似。其余MyBatis之间主要区别如下:

MyBatisHibernate
半自动框架,需要手动编写SQL语句全自动的orm框架,hibernate可以自动生成SQL语句,自动执行
日志模块只有基本记录功能拥有完成的日志系统
缓存模块需要在每个表-对象进行详细配置缓存机制上更优
移植性较差移植性更强
由于sql都是手动编写,且存于xml文件中,优化更为便捷

由于sql都是自动生成,优化较为困难,且遇到一些较为复杂的sql操作时,无法达成目的。

总结来说,mybatis较为轻便简单,而直接使用sql语句,开发更方便,上手更快。Hibernate框架更为复杂,也更加严谨。

相关文章:

Java面试——MyBatis相关知识

目录 1.什么是MyBatis 2.MyBatis优缺点 3.MyBatis工作原理 4.MyBatis缓存模式 5.MyBatis代码相关问题 6.MyBatis和hibernate区别 1.什么是MyBatis MyBatis是一个半ORM持久层框架&#xff08;对象关系映射&#xff09;&#xff0c;基于JDBC进行封装&#xff0c;使得开发者…...

Cortex-M0编程入门

目录1.嵌入式系统编程入门微控制器是如何启动的嵌入式程序设计2.输入和输出3.开发流程4.C编程和汇编编程5.什么是程序映像6.C编程&#xff1a;数据类型7.用C语言操作外设8.Cortex微控制器软件接口标准&#xff08;CMSIS&#xff09;简介标准化内容组织结构使用方法优势1.嵌入式…...

字符串函数能有什么坏心思?

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;夏目的C语言宝藏 &#x1f4ac;总结&#xff1a;希望你看完之…...

Vue3 组件之间的通信

组件之间的通信 经过前面几章的阅读&#xff0c;相信开发者已经可以搭建一个基础的 Vue 3 项目了&#xff01; 但实际业务开发过程中&#xff0c;还会遇到一些组件之间的通信问题&#xff0c;父子组件通信、兄弟组件通信、爷孙组件通信&#xff0c;还有一些全局通信的场景。 …...

多路查找树

1.二叉树与 B 树 1.1二叉树的问题分析 二叉树的操作效率较高&#xff0c;但是也存在问题, 请看下面的二叉树 二叉树需要加载到内存的&#xff0c;如果二叉树的节点少&#xff0c;没有什么问题&#xff0c;但是如果二叉树的节点很多(比如 1 亿)&#xff0c; 就 存在如下问题:问…...

Mybatis——注入执行sql查询、更新、新增以及建表语句

文章目录前言案例dao和mapper编写XXXmapper.xml编写编写业务层代码&#xff0c;进行注入调用额外扩展--创建表语句前言 在平时的项目开发中&#xff0c;mybatis应用非常广泛&#xff0c;但一般都是直接CRUD类型sql的执行。 本片博客主要说明一个另类的操作&#xff0c;注入sq…...

即时通讯系列-4-如何设计写扩散下的同步协议方案

1. 背景信息 上篇提到了, IM协议层是主要解决会话和消息的同步, 在实现上, 以推模式为主, 拉模式为辅. 本文Agenda: (How)如何同步(How)如何设计同步位点如何设计 Gap过大(SyncGapOverflow) 机制如何设计Ack机制总结 提示: 本系列文章不会单纯的给出结论, 希望能够分享的是&…...

tui-swipe-action组件上的按钮点击后有阴影的解决方法

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 目录 前言问题描述问题解决前言 一直未敢涉足电商领域,总觉得这里面的道道很多,又是支付、又是物流的,还涉及到金钱,所以我们所做的项目,一直都是XXXX管理系统,XXX考核系统,移动端的也是,XX健康管理平台…… 但…...

【大数据Hadoop】Hadoop 3.x 新特性总览

Hadoop 3.x 新特性剖析系列11. 概述2. 内容2.1 JDK2.2 EC技术2.3 YARN的时间线V.2服务2.3.1 伸缩性2.3.2 可用性2.3.3 架构体系2.4 优化Hadoop Shell脚本2.5 重构Hadoop Client Jar包2.6 支持等待容器和分布式调度2.7 支持多个NameNode节点2.8 默认的服务端口被修改2.9 支持文件…...

Python-第三天 Python判断语句

Python-第三天 Python判断语句一、 布尔类型和比较运算符1.布尔类型2.比较运算符二、if语句的基本格式1.if 判断语句语法2.案例三、 if else 语句1.语法2.案例四 if elif else语句1.语法五、判断语句的嵌套1.语法六、实战案例一、 布尔类型和比较运算符 1.布尔类型 布尔&…...

失手删表删库,赶紧跑路?!

在数据资源日益宝贵的数字时代公司最怕什么&#xff1f;人还在&#xff0c;库没了是粮库、车库&#xff0c;还是小金库&#xff1f;实际上&#xff0c;这里的“库”是指的数据库Ta是公司各类信息的保险柜小到企业官网和客户信息大到金融机构的资产数据和国家秘密即便没有跟数据…...

技术树基础——16排它平方数(Bigdecimal,int,string,数组的转换)

题目&#xff1a;03879 * 203879 41566646641这有什么神奇呢&#xff1f;仔细观察&#xff0c;203879 是个6位数&#xff0c;并且它的每个数位上的数字都是不同的&#xff0c;并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个&#xff0c;请你…...

04动手实践:手把手带你实现gRPC的Hello World

这篇文章就从实践的角度出发,带大家一起体验一下gRPC的Hello World。文中的代码将全部使用Go语言实现,使用到的示例也是GitHub上提供的grpc-go,下面我们开始: Hello World官方示例 首先我们要clone GitHub上gRPC的源代码到我们本地 git clone https://github.com/grpc/g…...

区块链技术与应用1——BTC-密码学原理

文章目录比特币中的密码学原理1. 哈希函数2. 数字签名3. 比特币中的哈希函数和数字签名简单介绍&#xff1a;比特币与以太坊都是以区块链技术为基础的两种加密货币&#xff0c;因为他们应用最广泛&#xff0c;所以讲区块链技术一般就讲比特币和以太坊。比特币中的密码学原理 1…...

PyTorch学习笔记:data.WeightedRandomSampler——数据权重概率采样

PyTorch学习笔记&#xff1a;data.WeightedRandomSampler——数据权重概率采样 torch.utils.data.WeightedRandomSampler(weights, num_samples, replacementTrue, generatorNone)功能&#xff1a;按给定的权重(概率)[p0,p1,…,pn−1][p_0,p_1,\dots,p_{n-1}][p0​,p1​,…,pn…...

SpringMVC对请求参数的处理

如何获取SpringMVC中请求中的信息 &#xff1f; 默认情况下&#xff0c;可以直接在方法的参数中填写跟请求参数一样的名称&#xff0c;此时会默认接受参 数 &#xff0c;如果有值&#xff0c;直接赋值&#xff0c;如果没有&#xff0c;那么直接给空值 。Controller RequestMapp…...

12年老外贸的经验分享

回想这12年的经历&#xff0c;很庆幸自己的三观一直是正确的&#xff0c;就是买家第一不管什么原因&#xff0c;只要你想退货&#xff0c;我都可以接受退款。不能退给上级供应商&#xff0c;我就自己留着&#xff0c;就是为了避免因为这个拒收而失去买家。不管是什么质量原因&a…...

电子电路中的各种接地(接地保护与GND)

前言多年以前&#xff0c;雷雨天气下&#xff0c;建筑会遭遇雷击&#xff0c;从而破坏建筑以及伤害建筑内的人&#xff0c;为了避免雷击的伤害&#xff0c;人们发明了避雷针&#xff0c;并将避雷针接地线&#xff0c;从而引导雷击产生的电流经过地线流入到地下。地线&#xff1…...

php实现农历公历日期的相互转换

农历&#xff08;Lunar calendar&#xff09;和公历&#xff08;Gregorian calendar&#xff09;是两种不同的日历系统。公历是基于太阳和地球的运动来计算时间的&#xff0c;而农历是基于月亮的运动来计算时间的。农历中的月份是根据月亮的相对位置来确定的&#xff0c;而公历…...

基于SpringBoot的房屋租赁管理系统的设计与实现

基于SpringBoot的房屋租赁管理系统的设计与实现 1 绪论 1.1 课题来源 随着社会的不断发展以及大家生活水平的提高&#xff0c;越来越多的年轻人选择在大城市发展。在大城市发展就意味着要在外面有一处安身的地方。在租房的过程中&#xff0c;大家也面临着各种各样的问题&…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...