Mybatis面经

Mybatis

📑前言

本文主要是【Mybatis】——Mybatis面经的文章,如果有什么需要改进的地方还请大佬指出⛺️

🎬作者简介:大家好,我是听风与他🥇
☁️博客首页:CSDN主页听风与他
🌄每日一句:狠狠沉淀,顶峰相见

目录

  • Mybatis
    • 📑前言
    • 1.缓存
      • 1.1一级缓存
      • 1.3二级缓存
      • 1.4在配置文件中,开启二级缓存的总开关
      • 2.在mapper映射文件中开启二级缓存
    • 2.mybatis是半自动ORM映射工具,它与全自动的区别?
    • 3.Mybatis和Hibernate有哪些不同?
    • 4.Mybatis中#{ }和${ }的区别
    • 5.resultmap与resulttype的区别
    • 📑文章末尾

1.缓存

  • mybatis对缓存提供支持,一级缓存是默认使用的,二级缓存需要手动开启。

区别:

  • 一级缓存的作用域是一个sqlsession内;
  • 二级缓存作用域是针对mapper进行缓存;

1.1一级缓存

  • 在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SqlSession第一次查询后,Mybatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。
  • 一级缓存执行commit,close,增删改等操作,就会清空当前的一级缓存,当对SqlSession执行更新操作(update,delete,insert)后执行commit时,不仅清空自身的一级缓存(执行更新操作的效果),也清空二级缓存(执行commit()的效果)

1.3二级缓存

  • 二级缓存指的是同一个namespace下的mapper,二级缓存中,也有一个map结构,这个区域就是一级缓存区域。一级缓存中的key是由sql语句,条件,statement等信息组成一个唯一值,一级缓存中的value,就是查询出的结果对象。

1.4在配置文件中,开启二级缓存的总开关

<setting name="cacheEnabled" value="true" />

2.在mapper映射文件中开启二级缓存

<cache eviction="FIFO" flushInterval="60000" size="512" 
readOnly="true"/>

禁用缓存

<select id="findAllPets" resultMap="petsMap" useCache="false">select * from pets
</select>

刷新缓存

  • 在印射文件中,属性: flushCache='true’刷新缓存,在查询语句中,默认值是falsh,在新增删除修改语句中,默认值是true(清空缓存)

2.mybatis是半自动ORM映射工具,它与全自动的区别?

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

3.Mybatis和Hibernate有哪些不同?

  • Mybatis和Hibernate不同,它不完全是一个ORM框架,因为Mybatis需要程序员自己编写sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
  • Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一旦需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

4.Mybatis中#{ }和${ }的区别

  • 相同点:都能取到变量的值

  • 不同点:#{ }可以实现预编译,会先把#{ }编译成?,在执行时再取值,可以防止sql注入。

  • ${ }是直接进行字符串替换

  • #符号解析:主要在数据类型检查和安全检查两部分。

    • 数据类型检查表现在:若检测到为数值类型,就不加引号,若检测到为字符串类型,就加上引号,即’?’
    • 安全检查表现在:若变量的值带有引号,会对引号进行转义处理,这样可以防止sql注入。
  • #符号的应用场景:需要在sql映射文件中动态拼接sql时的开发场景,比如传入多个变量进行条件查询,传入一个pojo进行数据插入等。

  • 符号解析: { }符号解析: 符号解析:符号主要用于传入的参数是sql片段的场景下,会直接进行字符串替换,完成了sql的拼接,

  • 比如我们不在sql映射文件中利用mybatis的动态sql来拼接sql,而是在java代码中去动态的拼接sql,然后将拼接的sql片段作为变量传入sql映射文件。上面也说了$符号只是进行字符串的替换,如果我们传入一个sql片段的话,相当于直接进行了sql拼接,就不用在sql映射文件中利用mybatis提供的动态sql标签来拼接sql了。甚至可以这样:

    <select id="getUserPage" resultType="com.ymxx.oa.bean.User">${sql片段}
    </select>
    

    *对于这样外部传入的sql,就不能使用#{},上面也说了,#{}会进行预编译,检测到该sql片段是个字符串,就会加上引号,即’sql片段’,这样就是字符串了而不是sql,执行会报错。*

依据$适用于传入sql片段的情况,我们可以将数据表字段名、表名、数据库名等传入,来进行sql拼接,如:

$符号的应用场景:
比如:select ${columns} from ${tableName},假设columns变量的值是userName,age 。tableName变量的值是user,那么该sql语句就会被解析成:select userName,age from user

比如有这样一个需求:对于后台管理系统的table列,想让用户选择展示哪些列,不展示哪些列,或者根据权限来分配不同的用户可以看到哪些列?

这个需求正好用到了 符号,我们可以将每个用户对于一个 t a b l e 能看到哪些列,存储到数据表中,对该数据表进行 c r u d ,每次展示列表的时候,先根据用户 I D 和 t a b l e 类型,到数据表中查询该用户对该 t a b l e 能看到的列名 ( 字段名 ) 列表,然后将该字段名列表作为 s q l 片段传入 m y b a t i s 进行查询,此时就必须得用到 符号,我们可以将每个用户对于一个table能看到哪些列,存储到数据表中,对该数据表进行crud,每次展示列表的时候,先根据用户ID和table类型,到数据表中查询该用户对该table能看到的列名(字段名)列表,然后将该字段名列表作为sql片段传入mybatis进行查询,此时就必须得用到 符号,我们可以将每个用户对于一个table能看到哪些列,存储到数据表中,对该数据表进行crud,每次展示列表的时候,先根据用户IDtable类型,到数据表中查询该用户对该table能看到的列名(字段名)列表,然后将该字段名列表作为sql片段传入mybatis进行查询,此时就必须得用到符号,而不能用#符号了。

符号的 s q l 注入问题:用 符号的sql注入问题: 用 符号的sql注入问题:用{}时要特别注意sql注入的风险,如果该sql片段是根据用户的输入拼接的,要注意检查sql注入的问题,防止数据的泄露与丢失!

5.resultmap与resulttype的区别

  • resultmap与resulttype的区别为:对象不同,描述不同,类型适用不同。
  • 简单来说,就是resultmap和resulttype功能差不多,但是resultmap功能更强大。

resultType:

  • 使用resultType进行输出映射时,至少查询出来的列名和pojo(简单实例对象)中的属性名一致,该列才可以映射成功。

  • int,string,list中元素的类型

       <select id="count" resultType="int">select count(id) from t_paper as pLEFT JOIN  t_type as tONp.type_id=t.id</select>
    

resultMap:

  • resultMap可以实现将查询结果映射为复杂类型的pojo,简单来说就是,resultType解决不了的,都交给resultMap来解决。在使用resultMap之前我们需要先定义一个符合当前需求的resultMap.
   <resultMap id="paperResult" type="Paper"><!-- column:数据库字段名 property:实体的属(变量)名 --><result column="id" property="id"/> <result column="title" property="title"/><result column="type_id" property="typeId"/><result column="paper_summary" property="paperSummary"/><result column="paper_path" property="paperPath"/></resultMap><select id="selectPaperListByCondition" resultMap="paperResult">SELECTp.*, t.type_name from t_paper as pLEFT JOINt_type as tONp.type_id=t.idWHEREtitle='' and type_name=''<where><if test="title != null and title != ''">and title like '%${title}%'</if><if test="typeName != null and typeName != ''">and type_name=#{typeName}</if></where>limit #{start},#{size}</select>

📑文章末尾

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【书生·浦语大模型实战营03】《基于 InternLM 和 LangChain 搭建你的知识库》学习笔记

《基于 InternLM 和 LangChain 搭建你的知识库》 常见术语 RAG: Retrieval Augmented Generation&#xff0c;检索增强生成 1. 大模型开发范式 1.1 RAG VS Finetune RAGFinetune低成本可个性化微调可实时更新知识覆盖面广受基座模型影响大成本高昂单次回答知识有限无法实时…

Elasticsearch:Search tutorial - 使用 Python 进行搜索 (二)

这个是继上一篇文章 “Elasticsearch&#xff1a;Serarch tutorial - 使用 Python 进行搜索 &#xff08;一&#xff09;” 的续篇。在今天的文章中&#xff0c;我们接着来完成如何进行分页及过滤。 分页 - pagination 应用程序处理大量结果通常是不切实际的。 因此&#xff0…

代码随想录二刷 |二叉树 | 验证二叉搜索树

代码随想录二刷 &#xff5c;二叉树 &#xff5c; 验证二叉搜索树 题目描述解题思路递归法迭代法 代码实现递归法迭代法 题目描述 98.验证二叉搜索树 给定一个二叉树&#xff0c;判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征&#xff1a; 节点的左子…

Eureka的自我保护机制

一&#xff1a;Eureka的自我保护机制是什么&#xff1f; 保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式&#xff0c;Eureka Server将会尝试保护其服务注册表中的信息&#xff0c;不再删除服务注册表中的数据&#xff0c;也就是不…

关于电脑屏幕亮度的调整,看这篇文章就够了

你可能需要定期更改屏幕亮度。当外面很亮的时候,你想把它调大,这样你就能看到。当你在黑暗的房间里时,你会希望它变暗,这样就不会伤害你的眼睛。降低屏幕亮度也有助于节省电力并延长笔记本电脑的电池寿命。 除了手动更改屏幕亮度外,Windows还可以通过多种方式自动更改屏幕…

ROS-Ubuntu20.04安装noetic

ROS-Ubuntu20.04环境安装 1.系统和ROS版本 操作系统&#xff1a;Ubuntu20.04 ROS版本&#xff1a;ROS noetic 2.安装步骤 1.配置ROS软件源 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/r…

Pytorch常用的函数(六)常见的归一化总结(BatchNorm/LayerNorm/InsNorm/GroupNorm)

Pytorch常用的函数(六)常见的归一化总结(BatchNorm/LayerNorm/InsNorm/GroupNorm) 常见的归一化操作有&#xff1a;批量归一化&#xff08;Batch Normalization&#xff09;、层归一化&#xff08;Layer Normalization&#xff09;、实例归一化&#xff08;Instance Normaliza…

【React系列】React生命周期、setState深入理解、 shouldComponentUpdate和PureComponent性能优化、脚手架

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 生命周期 1.1. 认识生命周期 很多的事物都有从创建到销毁的整个过程&#xff0c;这个过程称之为是生命周期&…

【华为OD机试真题 JavaScript】项目排期|解题思路、代码解析

文章目录 题目描述输入输出示例1输入输出说明解题思路实现代码题目描述 项目组共有N个开发人员,项目经理接到了M个独立的需求,每个需求的工作量不同,且每个需求只能由一个开发人员独立完成,不能多人合作。假定各个需求直接无任何先后依赖关系,请设计算法帮助项目经理进行…

案例分析——如何优化跨境直播网络

跨境直播 风口已至 这些年越来越多商家加入直播带货行列&#xff0c;各种玩法日渐成熟。而TikTok作为当前国外最火爆的直播平台&#xff0c;不少卖家都会定期做TikTok直播引流&#xff0c;但时常会面临着远程访问导致直播画面模糊、卡顿掉线、延迟高&#xff0c;甚至可能限流黑…

Django 4.2.7 ORM 连接MySQLServer 完成单表CRUD

文章目录 Django ORM介绍1.使用pycharm新建一个Django项目2.修改settings.py文件中 DATABASES3.创建APP4.创建模型5.操作数据库 Django ORM介绍 Django 模型使用自带的 ORM。 对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称 ORM &#xff09;用于实现面向…

C++ Trie树模版 及模版题 || Trie字符串统计

Trie树&#xff1a;用来高效的存储和查找字符串集合的数据结构。 维护一个字符串集合&#xff0c;支持两种操作&#xff1a; I x 向集合中插入一个字符串 x &#xff1b; Q x 询问一个字符串在集合中出现了多少次。 共有 N 个操作&#xff0c;所有输入的字符串总长度不超过 1…

vue2打包后,接口地址可在打包文件中配置

项目中遇到一个需要&#xff0c;打包后的项目需要部署到多个服务器&#xff0c;所以每次打包都需要修改环境变量的api的接口&#xff0c;先需要直接在打包文件中修改&#xff0c;不用每次都重新打包&#xff1a; 1.在public下创建config文件&#xff1a; window.apiConfig{&q…

OpenHarmony内存泄漏指南 - 解决问题(综合)

本系列文章旨在提供定位与解决OpenHarmony应用与子系统内存泄露的常见手段与思路&#xff0c;将会分成几个部分来讲解。首先我们需要掌握发现内存泄漏问题的工具与方法&#xff0c;以及判断是否可能存在泄漏。接着需要掌握定位泄漏问题的工具&#xff0c;以及抓取trace、分析tr…

Golang : Bson\Json互转

代码 package bson_jsonimport ("encoding/json""errors""fmt""gopkg.in/mgo.v2/bson""os""testing" )type User struct {Name string json:"name,omitempty" bson:"name,omitempty"CSD…

解密威胁:应对.faust勒索攻击的实用解决方案

引言&#xff1a; 在数字犯罪的舞台上&#xff0c;.faust勒索病毒以其狡猾的特征而备受瞩目&#xff0c;其中最为引人注目的之一是其对文件扩展名的变革。这种诡异的舞蹈不仅是攻击者的标志&#xff0c;更是对受害者数据的无情捉弄。本节将深入研究.faust勒索病毒对文件扩展名…

GDB调试技巧实战--chatGPT辅助考察strace原理

想法 本想写一篇strace代码解读的帖子,但是市面上已经有很多介绍strace原理的文章。就不重复造轮子了。还是授人以鱼不如授人以渔,讲讲如何利用GDB+ChatGPT辅助通过实践理解strace主要程序流吧。 既然strace的主要原理是利用ptrace系统函数控制tracee(被调试者) 及 wait4等…

回溯算法part03 算法

回溯算法part03 算法 今日任务 ● 39. 组合总和 ● 40.组合总和II ● 131.分割回文串 1.leetcode 39. 组合总和 https://leetcode.cn/problems/combination-sum/ class Solution {List<List<Integer>> resultnew ArrayList<>();List<Integer> pat…

JS函数调用的this指向与apply,call,bind调用模式

1、函数调用的四种模式与this指向 普通函数调用&#xff1a;this指向全局对象对象方法调用&#xff1a;this指向该调用的对象构造函数调用&#xff1a;this指向构造函数new的对象call,apply和bind间接调用&#xff1a;显式绑定this&#xff0c;传入的第一个参数绑定的对象 2、…

静态网页设计——天行九歌(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a;https://www.bilibili.com/video/BV1de411m7y4/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.com…