【Mybatis】从0学习Mybatis(2)

news2024/11/15 13:45:42

前言

本篇文章是从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.coloradmin.cn/o/1436537.html

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

相关文章

力扣热门100题 - 5.最长回文子串

力扣热门100题 - 5.最长回文子串 题目描述&#xff1a;示例&#xff1a;提示&#xff1a;解题思路&#xff1a;&#xff08;动态规划&#xff09;代码&#xff1a; 题目链接&#xff1a;5. 最长回文子串 题目描述&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回…

Python爬虫requests库详解

使用 requests 上一节中&#xff0c;我们了解了 urllib 的基本用法&#xff0c;但是其中确实有不方便的地方&#xff0c;比如处理网页验证和 Cookies 时&#xff0c;需要写 Opener 和 Handler 来处理。为了更加方便地实现这些操作&#xff0c;就有了更为强大的库 requests&…

「HarmonyOS」CustomDialogController自定义弹窗使用方法

需求背景&#xff1a; 在开发的过程中&#xff0c;总会遇到一些功能需要使用到弹窗进行信息的输入和修改&#xff0c;如用户个人信息的修改&#xff1b;在UI设计上每个App通常都会有各自的样式&#xff0c;而不是使用系统的标准样式&#xff0c;所以通常我们需要进行自定义弹窗…

TryHackMe-Net Sec Challenge练习

本文相关的TryHackMe实验房间链接&#xff1a;TryHackMe | Why Subscribe nmap nmap -T5 -p- 10.10.90.32 -T5 扫描速度 -p- 全端口扫描 答题&#xff1a; 这题叫我们找藏在http服务下的flag&#xff0c;根据上面扫出来的端口&#xff0c;所以我们开始搞80 这里简单介绍一下…

2.6 假期作业

分布编译 -ESc iso 1.预处理:头文件展开&#xff0c;宏替换&#xff0c;删除注释&#xff0c;不会查找语法错误 例&#xff1a;gcc -E 1.c -o 1.i 2.编译&#xff1a;生成汇编文件&#xff0c;会查找语法错误 例&#xff1a;gcc -S 1.i -o 1.s 3.汇编&#xff1a;生成二…

亚马逊认证考试系列 - 知识点 - LightSail介绍

一、引言 在当今云计算的时代&#xff0c;亚马逊网络服务&#xff08;AWS&#xff09;已成为业界领先的云服务提供商。其中&#xff0c;LightSail服务是AWS为简化云计算的入门和使用而推出的一项服务。它特别适合那些想要快速搭建网站、开发环境或小型应用的用户。通过LightSa…

代码随想录算法训练营第二八天 | 分割 子集

目录 复原IP地址子集子集 II LeetCode 93.复原IP地址 LeetCode 78.子集 LeetCode 90.子集II 复原IP地址 一些字符串的基本操作不会 s.insert(i 1, ‘.’); s.deleteCharAt(i 1); class Solution {List<String> result new ArrayList<>();public List<St…

EMC测试介绍

EMC测试介绍 EMC包括电磁干扰(EMI) 和抗电磁干扰(EMS)两个部分。发射干扰传导发射测试极限线以峰值检坡器测量时使用的决策树应用EN55022标准的波形示例测试仪器![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4580f693ae9a4f84891ece29681c7bf2.png) 辐射发射测试…

【Iceberg学习二】Branch和Tag在Iceberg中的应用

Iceberg 表元数据保持一个快照日志&#xff0c;记录了对表所做的更改。快照在 Iceberg 中至关重要&#xff0c;因为它们是读者隔离和时间旅行查询的基础。为了控制元数据大小和存储成本&#xff0c;Iceberg 提供了快照生命周期管理程序&#xff0c;如 expire_snapshots&#xf…

c语言--指针的传值调用和传址调用

目录 一、前言二、传值调用。三、传址调用四、总结 一、前言 学习指针的目的是使用指针解决问题&#xff0c;那什么问题&#xff0c;非指针不可呢&#xff1f; 二、传值调用。 写个函数&#xff0c;交换两个整数的内容。 #include<stdio.h> void Swap1(int x, int y)…

【halcon】write_image 图片保存

前言 write_image 是一个可以用来保存图片的算子&#xff0c;可以将Image对象保存成各种格式的图片。还可以对图片进行压缩。 正文 参数&#xff1a; Image&#xff08;输入对象&#xff09;&#xff1a; 输入图像或输入图像的数组。支持的像素类型包括byte、direction、cy…

opencv c++ (6):直方图

1. 绘制直方图 api不在做详细介绍&#xff0c;具体看以下代码例子 #include <iostream> #include<opencv.hpp> #include<opencv2\highgui\highgui.hpp>using namespace std; using namespace cv;int main() {Mat src imread("src.jpg");if (src…

Qt 常见容器类用法(二)

目录 QList类 QLinkedList类 QList类 对于不同的数据类型&#xff0c;QList<T>采取不同的存储策略&#xff0c;存储策略如下&#xff1a; 如果T是一个指针类型或指针大小的基本数据类型(该基本类型占有的字节数和指针类型占有的字节数相同)&#xff0c;QList<T>…

python 爬虫安装http请求库

我的是window环境&#xff0c;安装的python3&#xff0c;如果再linux环境&#xff1a;pip install requests 开始&#xff1a; 上面我们成功发送请求并获取到响应&#xff0c;现在需要解析html或xml获取数据&#xff0c;因此我使用现成的工具库Beautiful Soup

期末账项调整

目录 一. 概念二. 期末账项调整的种类及应用三. 基本调整事项3.1 应计项目3.2 递延项目 四. 估计项目的调整 \quad 一. 概念 \quad 在会计期末对一些没有明显经济业务发生(没有原始凭证)&#xff0c;但按照权责发生制要求&#xff0c;却影响本会计期间收益的一些隐含事项进行调…

windows+vscode配置远程Linux开发环境

1.Linux运行sshd服务 安装openssh-server sudo apt install openssh-server 开启服务 sudo service ssh start 检查sshd是否开启 sudo ps -aux | grep sshd 2.vscode上安装RemoteDevelopment插件 其他依赖性会自动安装 3.配置远程Linux主机信息 Linux主机ip 4.在vscode…

必看!第六版CCF(中国计算机学会)推荐B类国际学术会议!

中国计算机学会 中国计算机学会&#xff08;CCF&#xff09;是全国性、学术性、非营利的学术团体&#xff0c;由从事计算机及相关科学技术领域的个人和单位自愿组成。作为独立社团法人&#xff0c;CCF是中国科学技术协会的成员之一&#xff0c;是全国一级学会&#xff01; CCF的…

CTF-show WEB入门--web19

今晚web19也就顺便解决了 老样子我们先打开题目看看题目提示&#xff1a; 可以看到题目提示为&#xff1a; 密钥什么的&#xff0c;就不要放在前端了 然后我们打开题目链接&#xff1a; 然后我们查看网页源代码&#xff1a; 可以发现有用的内容全在网页源代码里。 前端验证…

NLP_词的向量表示Word2Vec 和 Embedding

文章目录 词向量Word2Vec&#xff1a;CBOW模型和Skip-Gram模型通过nn.Embedding来实现词嵌入Word2Vec小结 词向量 下面这张图就形象地呈现了词向量的内涵:把词转化为向量&#xff0c;从而捕捉词与词之间的语义和句法关系&#xff0c;使得具有相似含义或相关性的词语在向量空间…

掌握Linux du命令:高效查看文件和目录大小

今天我们在生产环境中的服务器上收到了有关/var磁盘目录使用率较高的警报。为了解决这一问题&#xff0c;我们进行了/var目录下一些大文件的清理和转移操作。在查找那些占用磁盘空间较多的文件时&#xff0c;我们频繁使用了du命令。在Linux系统中&#xff0c;du命令是一款功能强…