【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配置方式,看你喜欢吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue3快速上手(一)使用vite创建项目

一、准备 在此之前&#xff0c;你的电脑&#xff0c;需要安装node.js,我这边v18.19.0 wangdymb 2024code % node -v v18.19.0二、创建 执行npm create vuelatest命令即可使用vite创建vue3项目 有的同学可能卡主不动&#xff0c;可能是npm的registry设置的问题 先看下&#x…

MES生产制造管理:汽车零部件生产MES解决方案

某某汽车部件科技有限公司是一家铝合金零部件研发、压铸和精加工为一体的高新技术企业,拥有先进压铸、机加、检测等设备,并配套自动化生产线。为解决发动机支架等产品的全程生产质量追溯和实现机台设备联网,梅施科技提供了车间级的MES解决方案,如图所示&#xff1a; 梅施科技采…

IF=82.9!高分文献解读|吉西他滨联合顺铂化疗激活肿瘤免疫新机制

鼻咽癌&#xff08;nasopharyngeal carcinoma, NPC&#xff09;是一种发生于鼻咽部上皮细胞的恶性肿瘤&#xff0c;且高发于中国。吉西他滨联合顺铂&#xff08;GP&#xff09;化疗作为鼻咽癌的一种全球标准治疗方案&#xff0c;然而治疗的具体机制目前尚不清楚。中山大学肿瘤防…

好“云”来!盘点春节与云计算息息相关的那些事儿

在过去的几年里&#xff0c;因为疫情的缘故好多人都选择了就地过年。春节期间&#xff0c;在科技的推动下&#xff0c;“云拜年”“云团圆”“云聚餐”等过年新模式正成为人们过年的选项&#xff0c;各种新模式让相隔千里的亲朋也能感受到浓浓的亲情和喜庆的年味。 那春节里有…

多线程 --- [ 线程概念,线程控制 ]

目录 1. 补充知识 1.1. 什么叫做进程呢&#xff1f; 1.2. 堆区的知识补充 1.3. 虚拟地址到物理地址的转化过程 2. 线程概念 3. 见见代码 3.1. pthread_create 4. Linux进程 && 线程 4.1. 线程如何看待进程内部的资源 4.2. 进程 vs 线程 4.3. 线程的优点 4.…

JVM 性能调优 - 参数基础(2)

查看 JDK 版本 $ java -version java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode) 查看 Java 帮助文档 $ java -help 用法: java [-options] class [args...] …

vue element 组件 form深层 :prop 验证失效问题解决

此图源自官网 借鉴。 当我们简单单层验证的时候发现是没有问题的&#xff0c;但是有的时候可能会涉及到深层prop&#xff0c;发现在去绑定的时候就不生效了。例如我们在form单里面循环验证&#xff0c;在去循环数据验证。 就如下图的写法了 :prop"pumplist. i .device…

YUM | 起源 | 发展 | 运行逻辑

介绍 YUM&#xff08;Yellowdog Updater, Modified&#xff09;起源于 Red Hat Linux 发行版 up2date 工具。 最初&#xff0c;up2date 是由 Red Hat 公司提供的用于管理系统更新的工具。然而&#xff0c;社区逐渐对 up2date 出现一些不满&#xff0c;主要是由于其使用体验和…

【考研408】算法与数据结构笔记

文章目录 绪论数据结构的基本概念算法和算法评价 线性表线性表的定义和基本操作线性表的顺序表示线性表的链式表示 栈和队列栈基本操作栈的顺序存储结构栈的链式存储 队列队列常见的基本操作队列的顺序存储结构队列的链式存储结构双端队列 栈和队列的应用栈在括号匹配中的应用栈…

【C/C++ 17】继承

目录 一、继承的概念 二、基类和派生类对象赋值转换 三、继承的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员变量 七、菱形继承与虚拟继承 一、继承的概念 继承是指一个类可以通过继承获得另一个类的属性和方法&#xff0c;扩展自己的功能&…

Mysql-数据库压力测试

安装软件 官方软件 安装插件提供了更多的监听器选项 数据库驱动 数据库测试 配置 这里以一个简单的案例进行&#xff0c;进行连接池为10,20,30的梯度压测&#xff1a; select * from tb_order_item where id 1410932957404114945;新建一个线程组 新增一个连接池配置 新建一…

【Java】MybatisPlus入门

学习目标 能够基于MyBatisPlus完成标准Dao开发 能够掌握MyBatisPlus的条件查询 能够掌握MyBatisPlus的字段映射与表名映射 能够掌握id生成策略控制 能够理解代码生成器的相关配置 一、MyBatisPlus简介 1. 入门案例 问题导入 MyBatisPlus环境搭建的步骤&#xff1f; 1.1 Sp…

在VM虚拟机上搭建MariaDB数据库服务器

例题&#xff1a;搭建MariaDB数据库服务器&#xff0c;并实现主主复制。 1.在二台服务器中分别MariaDB安装。 2.在二台服务器中分别配置my.cnf文件&#xff0c;开启log_bin。 3.在二台服务器中分别创建专用于数据库同步的用户replication_user&#xff0c;并授权SLAVE。&#x…

【ARM 嵌入式 编译系列 2.7 -- GCC 编译优化参数详细介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 GCC 编译优化概述常用优化等级-O1 打开的优化选项-O2 打开的优化选项-O3 打开的优化选项-Os 打开的优化选项优化技术使用优化选项的注意事项GCC 编译优化概述 GCC(GNU Compiler Collection)包含了用于C、C++、Objective-C、Fort…

机器学习之DeepSequence软件使用学习1

简介 DeepSequence 是一个生成性的、无监督的生物序列潜变量模型。给定一个多重序列比对作为输入&#xff0c;它可以用来预测可获得的突变&#xff0c;提取监督式学习的定量特征&#xff0c;并生成满足明显约束的新序列文库。它将序列中的高阶依赖性建模为残差子集之间约束的非…

FLUENT Meshing Watertight Geometry工作流入门 - 6 描述几何体

本视频中学到的内容&#xff1a; 讨论“描述几何”任务中所需各种输入的工作细节如何为流体区域创建盖面使用“创建区域”任务创建流体区域 视频链接&#xff1a; FLUENT Meshing入门教程-6描述几何体_哔哩哔哩_bilibili 【Import Mesh】 启动 Ansys Fluent 进入网格模式。转…

从头开始构建和训练 Transformer(下)

导 读 上一篇推文从头开始构建和训练 Transformer&#xff08;上&#xff09;https://blog.csdn.net/weixin_46287760/article/details/136048418介绍了构建和训练Transformer的过程和构建每个组件的代码示例。本文将使用数据对该架构进行代码演示&#xff0c;验证其模型性能。…

[office] Excel如何快速统一数字编号长度 #经验分享#其他

Excel如何快速统一数字编号长度 我们在办公室使用Excel统计数据的时候&#xff0c;经常会遇到第一列数据全部是数字编号&#xff0c;但是因为数字的位数不一样&#xff0c;长短不一的样子看起来不是很协调。那么如何快速统一数字编号长度呢&#xff1f;一起来了解一下吧 我们在…

STM32内部Flash

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

【Java数据结构】单向 不带头 非循环 链表实现

模拟实现LinkedList&#xff1a;下一篇文章 LinkedList底层是双向、不带头结点、非循环的链表 /*** LinkedList的模拟实现*单向 不带头 非循环链表实现*/ class SingleLinkedList {class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val …