当前位置: 首页 > news >正文

【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的第一篇文章&#xff0c;由于篇幅太长CSDN会限流&#xff0c;因此我打算分开两期来写&#xff0c;这是第二期&#xff01;第一期在这儿&#xff1a;【Mybatis】从0学习Mybatis&#xff08;1&#xff09;-CSDN博客 1.什么是ResultMap结果映射&am…...

ChatGPT高效提问—prompt常见用法(续篇九)

ChatGPT高效提问—prompt常见用法(续篇九) ​ 如何准确地向大型语言模型提出问题,使其更好地理解我们的意图,从而得到期望的答案呢?编写有效的prompt的技巧,精心设计的prompt,获得期望的的答案。 1.1 增加条件 ​ 在各种prompt技巧中,增加条件是最常用的。在prompt中…...

echarts的title标题属性

echarts的title标题属性 title 标题组件&#xff0c;包含主标题和副标题。 位于 option对象第一层. title.text 设置主标题内容title.subtext 设置副标题内容 在 ECharts 2.x 中单个 ECharts 实例最多只能拥有一个标题组件。但是在 ECharts 3 中可以存在任意多个标题组件&am…...

【HTML+CSS】使用CSS中的Position与z-index轻松实现一个简单的自定义标题栏效果

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…...

从零开始:用 Rust 编写你的第一个 Web 服务

Rust 是一种现代、高性能的编程语言&#xff0c;近年来在 Web 开发领域也有了一席之地。本文将介绍如何使用 Rust 编写一个简单的 Web 程序&#xff0c;从搭建开发环境到创建第一个 Web 页面。 1. 开发环境搭建 首先&#xff0c;确保你已经安装了 Rust 工具链。你可以通过在终…...

机器学习复习(8)——逻辑回归

目录 逻辑函数&#xff08;Logistic Function&#xff09; 逻辑回归模型的假设函数 从逻辑回归模型转换到最大似然函数过程 最大似然函数方法 梯度下降 逻辑函数&#xff08;Logistic Function&#xff09; 首先&#xff0c;逻辑函数&#xff0c;也称为Sigmoid函数&#…...

深入解析MySQL 8:事务数据字典的变革

随着数据库技术的不断发展和完善&#xff0c;元数据的管理成为了一个日益重要的议题。在MySQL 8中&#xff0c;一项引人注目的新特性是引入了事务数据字典&#xff08;Transaction Data Dictionary&#xff0c;简称TDD&#xff09;&#xff0c;它改变了元数据的管理方式&#x…...

jquery写表格,通过后端传值,并合并单元格

<!DOCTYPE html> <html> <head><title>Table Using jQuery</title><style>#tableWrapper {width: 100%;height: 200px; /* 设置表格容器的高度 */overflow: auto; /* 添加滚动条 */margin-top: -10px; /* 负的外边距值&#xff0c;根据实际…...

百家cms代审

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

算法学习——LeetCode力扣二叉树篇3

算法学习——LeetCode力扣二叉树篇3 116. 填充每个节点的下一个右侧节点指针 116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树…...

强制卸载挂载目录

当遇到磁盘卸载失败提示 device is busy fuser -a 显示所有命令行中指定的文件&#xff0c;默认情况下被访问的文件才会被显示。 -c 和-m一样&#xff0c;用于POSIX兼容。 -k 杀掉访问文件的进程。如果没有指定-signal就会发送SIGKILL信号。结合 –signal -signal 使用指定的信…...

HiveSQL——sum(if()) 条件累加

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

Linux命令行工具使用HTTP代理的方法详解

亲爱的Linux用户们&#xff0c;有没有想过在命令行世界里&#xff0c;你的每一个指令都能悄无声息地穿越千山万水&#xff0c;而不被外界窥探&#xff1f;哈哈&#xff0c;没错&#xff0c;就是通过HTTP代理&#xff01;今天&#xff0c;我们就来一起探索如何在Linux命令行工具…...

idea mavn 中途新建gitignore文件如何生效

两种情况下项目代码中新建gitignore文件如何生效。 第一种情况项目代码下没有模块的情况 直接在该项目代码的根目录下进入git命令行执行&#xff1a; git rm -r --cached . git add . 注意上面两个命令后面都有一个点 第二种情况是有模块的情况 需要进入模块目录执行上…...

Hadoop:认识MapReduce

MapReduce是一个用于处理大数据集的编程模型和算法框架。其优势在于能够处理大量的数据&#xff0c;通过并行化来加速计算过程。它适用于那些可以分解为多个独立子任务的计算密集型作业&#xff0c;如文本处理、数据分析和大规模数据集的聚合等。然而&#xff0c;MapReduce也有…...

9.4 OpenGL帧缓冲:纹理和帧缓冲之间的反馈循环

纹理和帧缓冲之间的反馈循环 Feedback Loops Between Textures and the Framebuffer 当在图形编程中&#xff0c;特别是OpenGL这样的图形API中处理纹理&#xff08;Texture&#xff09;和帧缓冲区&#xff08;Framebuffer&#xff09;时&#xff0c;可能会出现一种称为“反馈循…...

相机图像质量研究(6)常见问题总结:光学结构对成像的影响--对焦距离

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

fast.ai 机器学习笔记(二)

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

vue3 elementplus DateTimePicker 日期时间设置默认时间为当天

DateTimePicker里面有个自带属性 可以实现这个需求&#xff0c;如图&#xff1a; // 设置当前当天时间范围 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 错误如下&#xff1a; [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" …...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...