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

【Mybatis】从0学习Mybatis(2)
前言 本篇文章是从0学习Mybatis的第一篇文章,由于篇幅太长CSDN会限流,因此我打算分开两期来写,这是第二期!第一期在这儿:【Mybatis】从0学习Mybatis(1)-CSDN博客 1.什么是ResultMap结果映射&am…...

ChatGPT高效提问—prompt常见用法(续篇九)
ChatGPT高效提问—prompt常见用法(续篇九) 如何准确地向大型语言模型提出问题,使其更好地理解我们的意图,从而得到期望的答案呢?编写有效的prompt的技巧,精心设计的prompt,获得期望的的答案。 1.1 增加条件 在各种prompt技巧中,增加条件是最常用的。在prompt中…...
echarts的title标题属性
echarts的title标题属性 title 标题组件,包含主标题和副标题。 位于 option对象第一层. title.text 设置主标题内容title.subtext 设置副标题内容 在 ECharts 2.x 中单个 ECharts 实例最多只能拥有一个标题组件。但是在 ECharts 3 中可以存在任意多个标题组件&am…...

【HTML+CSS】使用CSS中的Position与z-index轻松实现一个简单的自定义标题栏效果
🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起学习和进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&a…...
从零开始:用 Rust 编写你的第一个 Web 服务
Rust 是一种现代、高性能的编程语言,近年来在 Web 开发领域也有了一席之地。本文将介绍如何使用 Rust 编写一个简单的 Web 程序,从搭建开发环境到创建第一个 Web 页面。 1. 开发环境搭建 首先,确保你已经安装了 Rust 工具链。你可以通过在终…...

机器学习复习(8)——逻辑回归
目录 逻辑函数(Logistic Function) 逻辑回归模型的假设函数 从逻辑回归模型转换到最大似然函数过程 最大似然函数方法 梯度下降 逻辑函数(Logistic Function) 首先,逻辑函数,也称为Sigmoid函数&#…...
深入解析MySQL 8:事务数据字典的变革
随着数据库技术的不断发展和完善,元数据的管理成为了一个日益重要的议题。在MySQL 8中,一项引人注目的新特性是引入了事务数据字典(Transaction Data Dictionary,简称TDD),它改变了元数据的管理方式&#x…...

jquery写表格,通过后端传值,并合并单元格
<!DOCTYPE html> <html> <head><title>Table Using jQuery</title><style>#tableWrapper {width: 100%;height: 200px; /* 设置表格容器的高度 */overflow: auto; /* 添加滚动条 */margin-top: -10px; /* 负的外边距值,根据实际…...

百家cms代审
参考博客: PHP代码审计之旅之百家CMS-腾讯云开发者社区-腾讯云 环境搭建 源码链接如下所示 https://gitee.com/openbaijia/baijiacms 安装至本地后 直接解压到phpstudy的www目录下即可 接下来去创建一个数据库用于存储CMS信息。(在Mysql命令行中执行…...

算法学习——LeetCode力扣二叉树篇3
算法学习——LeetCode力扣二叉树篇3 116. 填充每个节点的下一个右侧节点指针 116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode) 描述 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树…...
强制卸载挂载目录
当遇到磁盘卸载失败提示 device is busy fuser -a 显示所有命令行中指定的文件,默认情况下被访问的文件才会被显示。 -c 和-m一样,用于POSIX兼容。 -k 杀掉访问文件的进程。如果没有指定-signal就会发送SIGKILL信号。结合 –signal -signal 使用指定的信…...

HiveSQL——sum(if()) 条件累加
注:参考文章: HiveSql面试题10--sum(if)统计问题_hive sum if-CSDN博客文章浏览阅读5.8k次,点赞6次,收藏19次。0 需求分析t_order表结构字段名含义oid订单编号uid用户idotime订单时间(yyyy-MM-dd)oamount订…...

Linux命令行工具使用HTTP代理的方法详解
亲爱的Linux用户们,有没有想过在命令行世界里,你的每一个指令都能悄无声息地穿越千山万水,而不被外界窥探?哈哈,没错,就是通过HTTP代理!今天,我们就来一起探索如何在Linux命令行工具…...
idea mavn 中途新建gitignore文件如何生效
两种情况下项目代码中新建gitignore文件如何生效。 第一种情况项目代码下没有模块的情况 直接在该项目代码的根目录下进入git命令行执行: git rm -r --cached . git add . 注意上面两个命令后面都有一个点 第二种情况是有模块的情况 需要进入模块目录执行上…...

Hadoop:认识MapReduce
MapReduce是一个用于处理大数据集的编程模型和算法框架。其优势在于能够处理大量的数据,通过并行化来加速计算过程。它适用于那些可以分解为多个独立子任务的计算密集型作业,如文本处理、数据分析和大规模数据集的聚合等。然而,MapReduce也有…...
9.4 OpenGL帧缓冲:纹理和帧缓冲之间的反馈循环
纹理和帧缓冲之间的反馈循环 Feedback Loops Between Textures and the Framebuffer 当在图形编程中,特别是OpenGL这样的图形API中处理纹理(Texture)和帧缓冲区(Framebuffer)时,可能会出现一种称为“反馈循…...

相机图像质量研究(6)常见问题总结:光学结构对成像的影响--对焦距离
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...

fast.ai 机器学习笔记(二)
机器学习 1:第 5 课 原文:medium.com/hiromi_suenaga/machine-learning-1-lesson-5-df45f0c99618 译者:飞龙 协议:CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续更…...

vue3 elementplus DateTimePicker 日期时间设置默认时间为当天
DateTimePicker里面有个自带属性 可以实现这个需求,如图: // 设置当前当天时间范围 00: 00: 00 - 23:59:59 const currentDate [setDefaultDate(0), setDefaultDate(1)]const setDefaultDate (type:number ): string > {let t ;let date new Da…...
2024年笔记--centos docker离线安装启动失败
Failed to start Docker Application Container Engine 错误如下: [rootel70 docker]# systemctl start docker.service Job for docker.service failed because start of the service was attempted too often. See "systemctl status docker.service" …...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...