【Mybatis】从0学习Mybatis(2)

前言

本篇文章是从0学习Mybatis的第一篇文章,由于篇幅太长CSDN会限流,因此我打算分开两期来写,这是第二期!第一期在这儿:【Mybatis】从0学习Mybatis(1)-CSDN博客

1.什么是ResultMap结果映射?

ResultMap是一种用于定义查询结果映射规则的配置方式。它可以将数据库查询结果映射到Java对象中,方便在应用程序中使用。当你的查询结果简单时,你还不觉得这个东西很牛逼,但是当你的查询结果很复杂的时候,它将你这些复杂的查询结果映射为Java对象你就觉得这个东西很猛了。

举个例子:

假设我们有一个NBA球队的数据模型,其中包含球队的名称、所在城市和成立年份等信息,以及球队的球员列表。在Java中,使用ResultMap结果映射可以将数据库查询结果映射到对象模型中,方便数据的处理和使用。

我们以一个简化的NBA球队和球员的例子来说明ResultMap结果映射。假设我们有两张数据库表:Team(球队表)和Player(球员表),它们之间通过外键关联。Team表包含球队的id、名称和所在城市等信息,Player表包含球员的id、姓名和所属球队id等信息。

首先,我们创建一个Team类和Player类来表示球队和球员的属性和行为:

接下来,我们使用MyBatis作为持久化框架,定义一个Mapper接口和对应的XML映射文件来配置数据库查询和结果映射。假设我们的Mapper接口为TeamMapper,对应的XML映射文件为teamMapper.xml。

在teamMapper.xml文件中,我们可以定义ResultMap来指定如何将数据库查询结果映射到Team对象中。具体配置如下:

在上述配置中,我们使用<resultMap>元素定义了一个名为"teamResultMap"的ResultMap。其中,<id>元素用于指定id属性的映射关系,<result>元素用于指定其他普通属性的映射关系。而对于关联属性players,我们使用<collection>元素进行配置,其中ofType属性指定了集合元素的类型为Player。通过指定column属性,我们将数据库查询结果的列与对象属性进行映射。

通过使用ResultMap结果映射,我们可以方便地将数据库查询结果映射到对象模型中,实现数据的处理和使用。在上述例子中,通过配置ResultMap,我们将Team和Player表的数据关联起来,并将查询结果映射到Team对象中,包括球队的基本信息和球员列表。这样,我们可以通过Team对象方便地访问和操作球队及其球员的数据。

2.MyBatis日志是什么?Mybatis内置了日志工厂,这些工厂又有什么用呢?

日志工厂并不是用于存储日志信息的地方,而是一个用于生成日志记录器实例的工厂。它负责创建日志记录器,而日志记录器则负责实际的日志输出。

3.数据库事务是什么?

4.讲一讲MyBatis的数据写入(3种写操作)?

(1)使用Insert语句:最常见的方式是使用MyBatis的Insert语句来插入数据。在MyBatis中,你可以编写SQL语句,在XML映射文件中定义Insert语句。这样,你可以指定要插入的表、列以及要插入的值。然后,通过调用MyBatis的执行方法,将数据写入数据库。

(2)使用Update语句:除了插入数据,你还可以使用MyBatis的Update语句来更新已有的数据。在XML映射文件中定义Update语句,指定要更新的表、列以及更新的条件和值。然后,通过调用MyBatis的执行方法,将更新操作应用到数据库。

(3)使用Delete语句:如果需要删除已有的数据,可以使用MyBatis的Delete语句。在XML映射文件中定义Delete语句,指定要删除的表、列以及删除的条件。然后,通过调用MyBatis的执行方法,将删除操作应用到数据库。

5.在MyBatis中,Map的适用场景是什么?

(1)Map为SQL语句传入多个参数:在MyBatis中,可以将多个参数封装到一个Map对象中,以便将其作为参数传递给SQL语句。这种方式可以实现将多个参数传递给SQL语句的需求,而不需要在方法签名中显式列出每个参数,特别适用于参数数量较多的时候,用Map就爽死了。

在上述示例中,getUsersByCriteria 方法接收一个 Map<String, Object> 类型的参数 criteria,其中包含了两个键值对:name 和 minAge。

接下来,可以在Java代码中创建一个Map对象,将参数以键值对的形式放入Map中,并调用查询方法:

在上述代码中,我们创建了一个Map对象 criteria,将参数 name 和 minAge 以键值对的形式放入Map中。然后,调用 getUsersByCriteria 方法,并将 criteria 对象作为参数传递给该方法。

MyBatis会根据映射文件中配置的参数类型和语句中的参数引用,自动将Map中的对应键值传递给SQL语句。在这个例子中,SQL语句中的 #{name} 会匹配到Map中的键 name 对应的值,#{minAge} 会匹配到Map中的键 minAge 对应的值。

(2)查询返结果包含跨表字段:假设有两个表,一个是用户表,另一个是订单表,并且这两个表之间存在外键关联。当查询订单信息时,可能需要同时获取订单表中的字段(如订单日期、金额)以及用户表中的字段(如用户名)。在这种情况下,可以使用Map来存储查询结果。

我说的其实是很笼统,没有详细的去说明,你意会得到就好了,不需要深究。

6.MyBatis预防SQL注入攻击是什么意思?

MyBatis 提供了一些机制来预防 SQL 注入攻击,这是一种常见的安全漏洞,当恶意用户通过构造特定的输入来改变 SQL 语句的结构,从而执行非授权的操作或者泄露敏感信息。

预防 SQL 注入攻击的主要思想是通过参数化查询或者使用预编译语句来确保输入的数据不会直接被拼接到 SQL 语句中,而是作为参数传递给数据库引擎,从而防止恶意用户在输入中注入恶意的 SQL 代码。

7.SLF4j和Logback是什么?

SLF4J是一个日志框架的抽象层,它提供了一套简单的日志接口,以便在应用程序中使用统一的日志记录方式。SLF4J 的目的是将应用程序代码与特定的日志实现解耦,使开发者能够在不更改应用程序代码的情况下,灵活地切换和配置不同的日志实现。

Logback 是 SLF4J 的一个具体实现,它实现了 SLF4J 的接口,并提供了完整的日志记录功能。Logback 是由 Ceki Gülcü 创造的,他也是 SLF4J 的创始人。Logback 提供了日志记录器(Logger)、附加器(Appender)、布局(Layout)等组件,以及各种配置选项,用于将日志消息输出到不同的目标,并对日志消息进行格式化和过滤。

因此,SLF4J 是一个日志框架的抽象层,而 Logback 是实现了 SLF4J 接口的具体日志实现。开发者可以使用 SLF4J 的接口编写日志记录代码,然后通过配置选择使用 Logback 来实际记录日志。

MyBatis 是一个非常好的例子,它使用了日志门面和日志实现的组合。MyBatis 使用 SLF4J 作为日志门面,在应用程序中使用 SLF4J 的接口进行日志记录。然后,通过选择适当的日志实现(如 Logback、Log4j、Java Util Logging 等),可以实现实际的日志记录。

8.MyBatis的动态SQL是什么?

MyBatis是一个流行的Java持久化框架,它提供了一种称为动态SQL的功能。动态SQL是指能够根据不同的条件和参数生成不同的SQL语句的技术。

在MyBatis中,动态SQL可以通过XML映射文件或注解来实现。以下是一些常见的动态SQL元素:<if>,<choose>、<when>和<otherwise>,<foreach>。

9.MyBatis中的一级缓存和二级缓存是什么?

一级缓存是MyBatis中的默认缓存级别,它是在SqlSession级别的缓存。也就是说,在同一个SqlSession中执行的多个查询操作可以共享同一个一级缓存。一级缓存是在同一个SqlSession中共享的,对于不同的SqlSession,它们之间的一级缓存是相互独立的。如果需要在不同的SqlSession之间共享缓存,可以考虑使用二级缓存。

二级缓存是MyBatis中的一种缓存级别,它可以在多个SqlSession之间共享缓存。换句话说,当一个SqlSession执行查询操作后,查询结果会被缓存到二级缓存中,其他的SqlSession在执行相同的查询操作时,可以直接从二级缓存中获取结果,而不需要再次查询数据库。二级缓存的作用域是Mapper级别,即同一个Mapper接口下的不同SqlSession可以共享同一个二级缓存。

10.分页插件pagehelper是什么?为什么需要它

PageHelper是一个用于在MyBatis中实现分页查询的开源插件。它提供了一组简单易用的方法,可以方便地处理分页查询的逻辑,减少了开发人员编写复杂的分页查询代码的工作量。它有很多功能,比如:

(1)自动拦截和修改SQL语句:PageHelper会拦截执行的SQL语句,自动在其后添加分页查询的相关语句,以实现分页功能。

(2)提供简单的API:PageHelper提供了一组简单易用的API,可以通过设置分页参数(页码、每页记录数等)来进行分页查询。

使用PageHelper插件的好处包括:

(1)减少开发工作量:PageHelper可以自动处理分页查询的逻辑,减少了手动编写分页查询代码的工作量。

(2)提高代码可读性:通过使用PageHelper提供的简单API,分页查询的代码更加简洁、易于理解。

要使用PageHelper,需要在项目中引入PageHelper的依赖,并在MyBatis的配置文件中进行相应的配置。

11.C3P0连接池是什么?为什么需要连接池这玩意儿?

C3P0是一个开源的Java数据库连接池,用于管理数据库连接的创建、销毁和重用。它是一个成熟且广泛使用的连接池实现之一。

在传统的数据库访问中,每次执行数据库操作都需要建立一个数据库连接,然后再执行完毕后关闭连接。

连接池的作用就是解决上述问题。它在应用程序启动时创建一定数量的数据库连接,并将这些连接保存在连接池中。当应用程序需要访问数据库时,从连接池中获取一个可用的数据库连接,执行完毕后将连接归还给连接池,而不是每次都创建和销毁连接。

通过MyBatis,你就可以使用连接池来管理数据库连接。

12.Mybatis注解和C语言的注释是一样的吗?

MyBatis注解和C语言中的注释是不一样的,这里说的注解在运行时会被解析和执行的有效代码。当使用MyBatis进行注解开发时,这些注解会被MyBatis框架读取和解析,然后根据注解的定义执行相应的数据库操作。例如,@Select注解用于定义查询语句,@Insert注解用于定义插入语句,@Update注解用于定义更新语句,@Delete注解用于定义删除语句等。在运行时,MyBatis会扫描注解标记的接口或类,并根据注解的定义生成相应的SQL语句和映射关系。这些SQL语句会被发送到数据库执行,并将查询结果映射到Java对象中,或者执行对应的插入、更新、删除等操作。

13.Mybatis提供了哪些注解?

MyBatis提供了一些用于注解开发的注解,这些注解可以帮助进行数据库映射和SQL语句的定义。以下是MyBatis中一些常用的注解:

@Mapper:用于标记接口或类,表示该接口或类是一个MyBatis的Mapper接口或Mapper类。

@Select:用于定义查询语句,将该注解标记在接口的方法上,表示该方法执行对应的查询操作。

@Insert:用于定义插入语句,将该注解标记在接口的方法上,表示该方法执行对应的插入操作。

@Update:用于定义更新语句,将该注解标记在接口的方法上,表示该方法执行对应的更新操作。

@Delete:用于定义删除语句,将该注解标记在接口的方法上,表示该方法执行对应的删除操作。

@Results:用于定义结果映射,将该注解标记在接口的方法上,指定将查询结果映射到Java对象的方式。

@Result:用于定义单个字段的映射关系,将该注解标记在@Results注解内部,指定将查询结果中的字段映射到Java对象的属性。

@Param:用于指定方法参数的名称,将该注解标记在方法参数上,可以在SQL语句中引用该参数。

这些注解可以与XML配置方式结合使用,或者完全代替XML配置方式,看你喜欢吧。

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

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

相关文章

从小白到入门webrtc音视频通话

0. 写在前面 先会骑车&#xff0c;再研究为什么这么骑&#xff0c;才是我认为学习技术的思路&#xff0c;底部付了demo例子&#xff0c;根据例子上面的介绍即可运行。 1. 音视频通话要用到的技术简介 websocket 介绍&#xff1a;1. 服务器可以向浏览器推送信息&#xff1b;2…

C#,河豚算法(Blowfish Algorithm)的加密、解密源代码

Bruce Schneier 1 河豚算法&#xff08;Blowfish Algorithm&#xff09; 河豚算法&#xff08;Blowfish Algorithm&#xff09;是1993年11月由Bruce Schneier设计的一个完全开源的算法。 Blowfish算法是一个分组长度为64位、密钥长度可变的对称分组密码算法。 Blowfish算法具…

学习Android的第五天

目录 Android ConstraintLayout 约束布局 简介 ConstraintLayout 约束布局分类 1、相对定位 (Relative positioning) 2、边距 ( Margins ) 3、居中定位和偏向 ( Centering positioning and bias ) 4、环形定位 ( Circular positioning ) 5、对可见性的处理 ( Visibilit…

万物皆可播时代,我们如何把握机遇

在万物皆可播的时代&#xff0c;我们可以通过以下方式来把握机遇&#xff1a; 了解市场需求&#xff1a;通过观察和了解消费者的需求和偏好&#xff0c;发现具有潜力的市场空白。关注时尚、美妆、美食、旅游等领域的发展趋势&#xff0c;掌握最新的流行趋势&#xff0c;结合自…

春运开始,北斗卫星助力盲区来车预警提示

春运开始&#xff0c;北斗卫星助力盲区来车预警提示 近期春运开始&#xff0c;高德地图启动了2024年的“温暖回家路”服务计划&#xff0c;通过数字化服务创新保障春运出行。除了具备自学习能力的新能源导航首发亮相外&#xff0c;还重点升级了盲区会车预警服务。在山区弯道、…

❤ React18 环境搭建项目与运行(地址已经放Gitee开源)

❤ React项目搭建与运行 环境介绍 node v20.11.0 react 18.2 react-dom 18.2.0一、React环境搭建 第一种普通cra搭建 1、检查本地环境 node版本 18.17.0 检查node和npm环境 node -v npm -v 2、安装yarn npm install -g yarn yarn --version 3、创建一个新的React项目…

ABAP 笔记--内表结构不一致,无法更新数据库MODIFY和UPDATE

目录 ABAP 笔记内表结构不一致&#xff0c;无法更新数据库MODIFY和UPDATE ABAP 笔记 内表结构不一致&#xff0c;无法更新数据库 MODIFY和UPDATE 如果是使用MODIFY或者UPDATE

Live800:从客户反馈中学习与改进,塑造卓越的企业客户服务

在当今的商业环境中&#xff0c;客户反馈已经成为企业改进产品和服务&#xff0c;提升客户满意度&#xff0c;增强品牌形象的重要工具。今天将以企业客户服务为例&#xff0c;探讨如何从客户反馈中学习和改进&#xff0c;包括收集客户反馈、分析客户反馈、实施改进措施等方面。…

远程主机可能不符合 glibc 和 libstdc++ Vs Code 服务器的先决条件

vscode连接远程主机报错&#xff0c;原因官方已经公布过了&#xff0c;需要远程主机 glibc>2.28&#xff0c;所以Ubuntu18及以下版本没法再远程连接了&#xff0c;其他Linux系统执行ldd --version查看glibc版本自行判断。 解决方案建议&#xff1a; 不要再想升级glibc了 问题…

Golang GC 介绍

文章目录 0.前言1.发展史2.并发三色标记清除和混合写屏障2.1 三色标记2.2 并发标记问题2.3 屏障机制Dijkstra 插入写屏障Yuasa 删除写屏障混合写屏障 3.GC 过程4.GC 触发时机5.哪里记录了对象的三色状态&#xff1f;6.如何观察 GC&#xff1f;方式1&#xff1a;GODEBUGgctrace1…

机器学习 | 探索朴素贝叶斯算法的应用

朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法。它被广泛应用于文本分类、垃圾邮件过滤、情感分析等领域&#xff0c;并且在实际应用中表现出色。 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法&#xff1a; 1&#xff09;对于给定的待分类项r…

Architecture Lab:Part C【流水线通用原理/Y86-64的流水线实现/实现IIADDQ指令】

目录 任务描述 知识回顾 流水线通用原理 Y86-64流水线实现&#xff08;PIPE-与PIPE&#xff09; 开始实验 IIADDQ指令的添加 优化 ncopy.ys 仅用第四章知识&#xff0c;CEP11.55 8x1展开&#xff0c;CPE9.35 8x1展开2x1展开消除气泡&#xff0c;CPE8.10 流水线化通过…

算法每日一题: 使用循环数组所有元素相等的最少秒数 | 哈希

大家好&#xff0c;我是星恒&#xff0c;今天给大家带来的是一道需要感觉规律的题目&#xff0c;只要读懂题目中的规律&#xff0c;就可以做出来了 这道题用到了哈希&#xff0c;还有一个关键点比较类似循环队列 题目&#xff1a;leetcode 2808 给你一个下标从 0 开始长度为 n…

Postman发送带登录信息的请求

环境&#xff1a;win10Postman10.17.7 假设有个请求是这样的&#xff1a; RequiresPermissions("tool:add") PostMapping(value"/predict") ResponseBody /** * xxx * param seqOrderJson json格式的参数 * return */ public String predictSampleIds(Req…

svg基础(三)分组、渐变

上一篇文章简单介绍了svg常用标签及其属性,本篇主要介绍分组&#xff0c;渐变 1 分组<g> 分组容器 添加到g元素上的变换会应用到其所有的子元素上添加到g元素的属性会被其所有的子元素继承定义复杂对象&#xff0c;可通过<use>元素引用 1.1 分组 <svg>&…

EasyExcel分页上传数据

EasyExcel分页上传数据 一、实例 controller上传入口 PostMapping("/upload")ResponseBodyLog(title "导入工单", businessType BusinessType.IMPORT)public AjaxResult uploadFile(HttpServletRequest request, MultipartFile files) throws Exceptio…

Node.js+Express+Mysql服务添加环境变量

1、使用dotenv插件 1&#xff09;安装插件&#xff1a;npm install dotenv-cli --save-dev 2&#xff09;在项目根目录下添加对应的 .env 配置文件&#xff1b; // .env配置文件内容 MODEdevelopment, BASE_URLhttp://127.0.0.1:80813) 在启动命令中设置对应的加载文件&#…

springboot159基于springboot框架开发的景区民宿预约系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

STM32内部Flash

目录 一、内部Flash简介 二、内部Flash构成 1. 主存储器 2. 系统存储区 3. 选项字节 三、内部Flash写入过程 1. 解锁 2. 页擦除 3. 写入数据 四、工程空间分布 某工程的ROM存储器分布映像&#xff1a; 1. 程序ROM的加载与执行空间 2. ROM空间分布表 一、内部Flash…

2024.3.28-29日ICVS-AI智能汽车产业峰会(杭州)

本次安策将携手泰雷兹一起&#xff0c;参展ICVS2024第四届AI智能汽车产业峰会(杭州)&#xff0c;2024年3月28日-29日&#xff0c;欢迎新老朋友参加和莅临27号展台交流。 随着自动驾驶汽车政策密集落地。从我国四部门联合发布《关于开展智能网联汽车准入和上路通行试点工作的通知…