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

MyBatis通过注解配置执行SQL语句原理源码分析

文章目录

      • 前置准备
      • 流程简要分析
      • 配置文件解析
      • 加载 Mapper 接口
      • MapperAnnotationBuilder解析接口方法注解
      • parseStatement 方法详解
      • MapperBuilderAssistant

前置准备

创建一个mybatis-config.xml文件,配置mapper接口

<mappers><!--注解配置--><mapper class="mybatis.test.dao.IUserDao"/></mappers>

创建一个mapper接口,使用注解方式编写SQL

public interface IUserDao {@Select("SELECT id, userId, userName, userHead\n" +"FROM user\n" +"where id = #{id}")User queryUserInfoById(Long id);@Select("SELECT id, userId, userName, userHead\n" +"        FROM user\n" +"        where id = #{id}")User queryUserInfo(User req);@Select("SELECT id, userId, userName, userHead\n" +"FROM user")List<User> queryUserInfoList();@Update("UPDATE user\n" +"SET userName = #{userName}\n" +"WHERE id = #{id}")int updateUserInfo(User req);@Insert("INSERT INTO user\n" +"(userId, userName, userHead, createTime, updateTime)\n" +"VALUES (#{userId}, #{userName}, #{userHead}, now(), now())")void insertUserInfo(User req);@Insert("DELETE FROM user WHERE userId = #{userId}")int deleteUserInfoByUserId(String userId);}

流程简要分析

【1】 解析 mybatis-config.xml 配置文件
MyBatis 启动时加载 mybatis-config.xml 配置文件,初始化全局配置。
【2】通过配置的mapper路径反射 加载 Mapper 接口
MapperRegistry 注册 Mapper 接口类,检查每个 Mapper 是否已注册。
【3】 创建 MapperProxyFactory
为每个 Mapper 接口创建 MapperProxyFactory,用于生成接口的代理对象。
【4】 解析接口方法注解
MapperAnnotationBuilder 解析接口方法上的 SQL 注解(如 @Select、@Insert 等)。
【5】 注册 SQL 映射
通过 MappedStatement 将 SQL 语句与方法绑定,并注册到 Configuration 中。
【6】 生成代理对象
MapperProxyFactory 使用代理模式为 Mapper 接口生成代理对象。
【7】 执行 SQL 语句
代理对象拦截方法调用,解析注解中的 SQL,交由 MyBatis 执行。

配置文件解析

    /*** 解析配置;类型别名、插件、对象工厂、对象包装工厂、设置、环境、类型转换、映射器** @return Configuration*/public Configuration parse() {try {// 环境environmentsElement(root.element("environments"));// 解析映射器mapperElement(root.element("mappers"));} catch (Exception e) {throw new RuntimeException("Error parsing SQL Mapper Configuration. Cause: " + e, e);}return configuration;}

mapperElement(root.element(“mappers”));代码解析出配置文件中配置的节点,获取节点对象。
在这里插入图片描述
在这里插入图片描述
遍历获取的节点,在这里会根据mapper属性中的resource和class来判断是加载xml还是接口配置SQL。如果resource不为空说明这里关联的一个外部文件,则执行xml文件的解析和SQL解析。如果是class,则进行接口注解配置方式的解析。然后通过Resources.classForName(mapperClass)加载类对象。此时就获取到了关联的接口类型。

加载 Mapper 接口

    public <T> void addMapper(Class<T> type) {/* Mapper 必须是接口才会注册 */if (type.isInterface()) {if (hasMapper(type)) {// 如果重复添加了,报错throw new RuntimeException("Type " + type + " is already known to the MapperRegistry.");}// 注册映射器代理工厂knownMappers.put(type, new MapperProxyFactory<>(type));// 解析注解类语句配置MapperAnnotationBuilder parser = new MapperAnnotationBuilder(config, type);parser.parse();}}

这个方法用于将 Mapper 接口注册到 MyBatis 中。它的目的是确保 Mapper 接口可以通过注解配置 SQL 语句,并且为该接口创建代理对象。
首先检查传入的 type 是否为接口。只有接口才能作为 Mapper 接口在 MyBatis 中注册。因为 MyBatis 使用 Java 的动态代理来为接口生成实现类,如果是类(而非接口),则不能注册。hasMapper(type) 检查该 Mapper 接口是否已经被注册过。如果已经注册,抛出 RuntimeException 异常,避免重复注册同一个接口。这样做是为了防止配置冲突或逻辑错误。
通过 MapperProxyFactory 为指定的 type 接口类型创建代理工厂,并将其存储到 knownMappers 中,knownMappers是一个 Map<Class, MapperProxyFactory> 类型的集合,记录了所有已注册的 Mapper 类型及其对应的代理工厂。
MapperProxyFactory 是 MyBatis 的一个代理工厂类,它负责生成指定 Mapper 接口的代理对象。通过动态代理,MyBatis 可以拦截接口方法调用,并执行相应的 SQL 操作。
MapperAnnotationBuilder 负责解析 Mapper 接口中的注解配置(如 @Select、@Insert 等),并将注解中的 SQL 语句解析并注册到 MyBatis 的 MappedStatement 中。

MapperAnnotationBuilder解析接口方法注解

mybatis.builder.annotation.MapperAnnotationBuilder#parse

    public void parse() {String resource = type.toString();if (!configuration.isResourceLoaded(resource)) {assistant.setCurrentNamespace(type.getName());Method[] methods = type.getMethods();for (Method method : methods) {if (!method.isBridge()) {// 解析语句parseStatement(method);}}}}

parse() 方法的功能是遍历 Mapper 接口中的每个方法,解析其中的 SQL 注解,并将对应的 SQL 语句注册到 MyBatis 的配置中,使得接口方法能够直接执行对应的 SQL 语句。
通过 type.getMethods() 获取当前 Mapper 接口的所有方法(包括继承自 Object 类的方法)。
遍历每个方法,使用 method.isBridge() 排除桥接方法(泛型方法的代理方法)。
对每个非桥接方法,调用 parseStatement(method) 来解析该方法上的 SQL 注解,提取出 SQL 语句,并进行注册。桥接方法是 Java 编译器为支持泛型而生成的特殊方法,通常与实际的业务逻辑无关,所以在解析时被跳过。

parseStatement 方法详解

  /*** 解析语句*/private void parseStatement(Method method) {Class<?> parameterTypeClass = getParameterType(method);LanguageDriver languageDriver = getLanguageDriver(method);SqlSource sqlSource = getSqlSourceFromAnnotations(method, parameterTypeClass, languageDriver);if (sqlSource != null) {final String mappedStatementId = type.getName() + "." + method.getName();SqlCommandType sqlCommandType = getSqlCommandType(method);boolean isSelect = sqlCommandType == SqlCommandType.SELECT;String resultMapId = null;if (isSelect) {resultMapId = parseResultMap(method);}}}

parseStatement 方法是 MyBatis 中 MapperAnnotationBuilder 类的一个重要方法,用于解析 Mapper 接口中的 SQL 注解(如 @Select、@Insert 等),并根据注解创建 SqlSource 和相关的 SQL 配置(MappedStatement)。
通过 getParameterType(method) 获取当前方法的参数类型。这是为了确定 SQL 执行时需要传入的参数类型,以便正确地构造 SQL 语句。
调用 getLanguageDriver(method) 获取与该方法对应的 LanguageDriver,它用于解析 SQL 语句,并确定如何处理注解中的 SQL。
通过 getSqlSourceFromAnnotations() 方法,根据方法上的 SQL 注解(如 @Select、@Insert)获取 SqlSource。SqlSource 是 MyBatis 中封装 SQL 语句和参数的对象。
通过 type.getName()(Mapper 接口的类名)和 method.getName()(方法名)拼接得到 MappedStatement 的唯一标识符(ID)。这个 ID 用于在 MyBatis 中唯一标识一个 SQL 语句。
通过 getSqlCommandType(method) 获取当前方法对应的 SQL 类型(如 SELECT、INSERT 等)。如果是 SELECT 类型的 SQL,isSelect 设置为 true。
如果 SQL 类型是 SELECT,则通过 parseResultMap(method) 获取查询结果的 ResultMap ID。ResultMap 用于将查询结果的字段映射到 Java 对象。

MapperBuilderAssistant

/*** 添加映射器语句*/public MappedStatement addMappedStatement(String id,SqlSource sqlSource,SqlCommandType sqlCommandType,Class<?> parameterType,String resultMap,Class<?> resultType,LanguageDriver lang) {// 给id加上namespace前缀:xxx.test.dao.IUserDao.queryUserInfoByIdid = applyCurrentNamespace(id, false);MappedStatement.Builder statementBuilder = new MappedStatement.Builder(configuration, id, sqlCommandType, sqlSource, resultType);// 结果映射,给 MappedStatement#resultMapssetStatementResultMap(resultMap, resultType, statementBuilder);MappedStatement statement = statementBuilder.build();// 映射语句信息,建造完存放到配置项中configuration.addMappedStatement(statement);return statement;}

addMappedStatement 方法是 MyBatis 中用于创建并注册 SQL 映射语句的核心方法之一。它接受多个参数,用于配置一个完整的 SQL 语句映射并将其添加到 MyBatis 的 Configuration 中.
使用 MappedStatement.Builder 创建一个 MappedStatement 对象。MappedStatement 是 MyBatis 用于封装 SQL 语句信息、参数类型、返回结果等数据的核心对象。
调用 setStatementResultMap 方法,为 MappedStatement 设置结果映射。resultMap 定义了 SQL 查询结果与 Java 对象之间的映射关系。
通过 statementBuilder.build() 方法构建最终的 MappedStatement 对象。此时,MappedStatement 包含了 SQL 语句源、ID、结果类型、命令类型等信息。
将构建完成的 MappedStatement 添加到 MyBatis 的全局配置(configuration)中,确保该 SQL 映射信息被 MyBatis 管理和执行。
这个方法主要用于将从注解解析的 SQL 语句及相关配置注册到 MyBatis 中,使得 MyBatis 能够执行对应的 SQL 语句并正确地映射结果。

相关文章:

MyBatis通过注解配置执行SQL语句原理源码分析

文章目录 前置准备流程简要分析配置文件解析加载 Mapper 接口MapperAnnotationBuilder解析接口方法注解parseStatement 方法详解MapperBuilderAssistant 前置准备 创建一个mybatis-config.xml文件&#xff0c;配置mapper接口 <mappers><!--注解配置--><mapper…...

12_HTML5 Video(视频) --[HTML5 API 学习之旅]

HTML5 引入了 <video> 标签&#xff0c;使得在网页中嵌入和控制视频变得非常简单。<video> 元素允许你直接在 HTML 中指定视频文件&#xff0c;并提供了多种属性和方法来控制视频的播放、暂停、音量等。 基本用法 HTML5 的 <video> 标签让嵌入和控制视频变…...

JaxaFx学习(三)

目录&#xff1a; &#xff08;1&#xff09;JavaFx MVVM架构实现 &#xff08;2&#xff09;javaFX知识点 &#xff08;3&#xff09;JavaFx的MVC架构 &#xff08;4&#xff09;JavaFx事件处理机制 &#xff08;5&#xff09;多窗体编程 &#xff08;6&#xff09;数据…...

视频点播系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...

Springboot 学习 之 logback-spring.xml 日志压缩 .tmp 临时文件问题

文章目录 前言功能简述1. 自定义日志文件名2. 归档规则 && 压缩2.1. 归档配置2.2. 归档压缩2.3. 日志格式 && 编码 现象原因解决办法 前言 在 Springboot 应用中&#xff0c;默认使用 logback-spring.xml 配置日志相关 功能简述 1. 自定义日志文件名 <fi…...

智慧工地整体解决方案

智慧工地背景与需求 智慧工地解决方案的提出&#xff0c;源于建筑行业面临的诸多挑战。安全事故频发、环保体系不健全、建筑信息化水平低以及施工现场管理难度大等问题&#xff0c;迫切需要通过智能化手段来提升工地管理的效率与安全性。智慧工地利用现代信息技术&#xff0c…...

【读书打卡版】【读书笔记】半小时漫画中国地理3

一 如果全中国是个班级&#xff0c;江南五省各不同 继续跟随长江的脚步&#xff0c;认识坐在长江中下游平原上的省份&#xff1a;安徽、江苏、江西、浙江、上海。他们同属于一个美丽又富饶的大区——江南。 那么问题来了&#xff0c;一提到江南&#xff0c;你会想到什么&#…...

harmony UI组件学习(1)

Image 图片组件 string格式&#xff0c;通常用来加载网络图片&#xff0c;需要申请网络访问权限:ohos.permission.INTERNET Image(https://xxx.png) PixelMap格式&#xff0c;可以加载像素图&#xff0c;常用在图片编辑中 Image(pixelMapobject) Resource格式&#xff0c;加…...

ECharts热力图-笛卡尔坐标系上的热力图,附视频讲解与代码下载

引言&#xff1a; 热力图&#xff08;Heatmap&#xff09;是一种数据可视化技术&#xff0c;它通过颜色的深浅变化来表示数据在不同区域的分布密集程度。在二维平面上&#xff0c;热力图将数据值映射为颜色&#xff0c;通常颜色越深表示数据值越大&#xff0c;颜色越浅表示数…...

React状态管理常见面试题目(一)

1. Redux 如何实现多个组件之间的通信?多个组件使用相同状态时如何进行管理? Redux 实现组件通信 Redux 是一个集中式的状态管理工具&#xff0c;通过共享一个全局 store 来实现多个组件之间的通信。 通信机制&#xff1a; 所有状态保存在 Redux 的全局 store 中。使用 ma…...

.NET周刊【12月第2期 2024-12-08】

国内文章 终于解决了.net在线客服系统总是被360误报的问题&#xff08;对软件进行数字签名&#xff09; https://www.cnblogs.com/sheng_chao/p/18581139 升讯威在线客服与营销系统由.net core和WPF开发&#xff0c;旨在开放、开源、共享。开发者为解决360与其他国产管家的误…...

YOLOv8目标检测(七)_AB压力测试

YOLOv8目标检测(一)_检测流程梳理&#xff1a;YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集&#xff1a;YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型&#xff1a;YOLOv8目标检测(三)_训…...

多个图片转换为PDF文件

将多个图片转换为PDF文件在Python中可以通过多个库来实现&#xff0c;其中最常用的库之一是Pillow&#xff08;用于图像处理&#xff09;和reportlab&#xff08;用于生成PDF&#xff09;。不过&#xff0c;对于直接图片转PDF的操作&#xff0c;更推荐使用Pillow配合PyMuPDF&am…...

【递归,搜索与回溯算法 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(一)

找出所有子集的异或总和再求和 题目解析 算法原理 解法 决策树 这种决策使得每一次递归都是有效的递归&#xff0c;每一个节点都是最终的结果&#xff0c;所以这棵决策树是不用剪枝的&#xff0c;也没有递归出口的&#xff1b; 注意 决策树执行添加元素…...

对 MYSQL 架构的了解

MySQL 是一种广泛使用的关系型数据库管理系统&#xff0c;其架构主要包括以下几个关键部分&#xff1a; 一、连接层 客户端连接管理&#xff1a;MySQL 服务器可以同时处理多个客户端的连接请求。当客户端应用程序&#xff08;如使用 Java、Python 等语言编写的程序&#xff09;…...

深入解析 StarRocks 物化视图:全方位的查询改写机制

小编导读&#xff1a; 本文将重点介绍如何利用物化视图进行查询改写。文章将全面介绍物化视图的基本原理、关键特性、应用案例、使用场景、代码细节以及主流大数据产品的物化视图改写能力对比。 物化视图在 StarRocks 中扮演着至关重要的角色&#xff0c;它是进行数据建模和加速…...

k8s常见问题及debug

ERROR1 ErrImagePull pod pending 外网无法方位集群服务 kubectl 命令失败 Pod Error 进入容器失败 pod重启 Running not ready CrashLoopBackOff PV/PVC helm install...

Winnows基础(2)

Target 了解常见端口及服务&#xff0c;熟练cmd命令&#xff0c;编写简单的 .bat 病毒程序。 Trail 常见服务及端口 80 web 80-89 可能是web 443 ssl心脏滴血漏洞以及一些web漏洞测试 445 smb 1433 mssql 1521 oracle 2082/2083 cpanel主机管理系统登陆&#xff08;国外用的…...

(14)D-FINE网络,爆锤yolo系列

yolo过时了&#xff1f;传统的yolo算法在小目标检测方面总是不行&#xff0c;最新算法DEIM爆锤yolo&#xff0c;已经替yolo解决。 一、创新点 ​ 这个算法名为DEIM&#xff0c;全称是DETR with Improved Matching for Fast Convergence&#xff0c;其主要创新点在于提出了一…...

关于数据流图绘制和使用上的一些个人经验

假设我们需要开发一个项目进度管理系统&#xff0c;在这个项目进度管理系统之中&#xff0c;我们需要开发一个功能&#xff1a;项目成员的列表。我们具有这样的业务需求&#xff1a; 在项目进度管理系统中&#xff0c;我们需要知道参与项目的人员到底有哪些&#xff0c;并且项目…...

Leetcode Hot 100 【二叉树】104. 二叉树的最大深度

104. 二叉树的最大深度 已解答 简单 相关标签 相关企业 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3…...

雅思真题短语梳理(八)

126员工流动率高 high staff turnover 127(多)负担一些工作任务 cover some duties / an increased workload 128不满 feel upset and resentful 129偏向性待遇 preferential treatment 130介入帮忙 step in and help 131切实的好处 tangible benefits 132挽留 staff retention…...

Codeforces Round 993 (Div. 4)个人训练记录

Codeforces Round 993 (Div. 4) 只选择对我有价值的题目记录 E. Insane Problem 题目描述 给定五个整数 k k k&#xff0c; l 1 l_1 l1​&#xff0c; r 1 r_1 r1​&#xff0c; l 2 l_2 l2​ 和 r 2 r_2 r2​&#xff0c;Wave 希望你帮助她计算满足以下所有条件的有序对 …...

java-io流

根据流的方向&#xff1a; 输入流&#xff08;InputStream/Reader&#xff09;&#xff1a;从数据源读取数据到程序中。输出流&#xff08;OutputStream/Writer&#xff09;&#xff1a;将数据从程序写入到目的地。 根据流处理信息的大小&#xff1a; 字节流&#xff08;Byte S…...

数据可视化

数据可视化 数据可视化 数据可视化主要目的&#xff1a;借助于图形化手段&#xff0c;清晰有效地传达与沟通信息。数据可视化可以把冰冷的数字转换成图形&#xff0c;揭示蕴含在数据中的规律和道理。 常用的数据可视化库&#xff1a; D3.js 目前 Web 端评价最高的 Javascri…...

CompletableFuture使用详解

一、 CompletableFuture介绍 平时多线程开发一般就是使用Runnable&#xff0c;Callable&#xff0c;Thread&#xff0c;FutureTask&#xff0c;ThreadPoolExecutor这些内容和并发编程息息相关。相对来对来说成本都不高&#xff0c;多多使用是可以熟悉这些内容。这些内容组合在…...

【长期有效】短链接生成-短链接-短网址-短链接生成接口-短链接转换接口-短网址URL生成-短链接-短网址-短域名-短链接

短链接API接口的作用主要体现在以下几个方面&#xff1a; 一、链接缩短与分享优化 短链接API接口的主要功能是将长链接转换为短链接。这种转换使得链接更加简洁、易读和易分享&#xff0c;尤其在社交媒体、电子邮件、短信等字符受限或按字符计费的场合中&#xff0c;短链接能…...

使用Idea自带的git功能进行分支合并

文章目录 1.背景描述2.分支切换3.分支合并的具体操作4.将在local环境下&#xff0c;从dev合并到qas分支上的代码&#xff0c;推送到远端 1.背景描述 目前在开发的当前项目有四个分支&#xff0c;master(主分支)、pre(预生产分支)、qas(测试分支)、dev(开发分支)&#xff1b; …...

工业摄像机基于电荷耦合器件的相机

工业摄像机系列产品及其识别技术的详细介绍&#xff1a; 一、工业摄像机概述 工业摄像机是利用光学成像技术获取视觉信息&#xff0c;并通过图像处理算法分析这些信息的设备。它通常具有高图像稳定性、高传输能力和高抗干扰能力等特性&#xff0c;适用于各种复杂的工业环境。 …...

【期末大作业】使用Python熟练掌握面向对象

引言 在编程学习过程中&#xff0c;构建项目是一个非常有效的方式&#xff0c;不仅能巩固和应用所学的知识&#xff0c;还能通过实践来解决实际问题。本文将通过几个经典的项目示例来展示如何用面向对象的方式设计和实现一个完整的系统&#xff0c;包括学生成绩管理系统、图书…...

JAVA:代理模式(Proxy Pattern)的技术指南

1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…...

【MAC】深入浅出 Homebrew 下 Nginx 的安装与配置指南

硬件&#xff1a;Apple M4 Pro 16寸 系统&#xff1a; macos Sonoma 15.1.1 Nginx 是一款高性能的 Web 服务器和反向代理服务器&#xff0c;广泛应用于全球各地的网站和企业应用中。本文将详细介绍如何在 macOS 环境下使用 Homebrew 安装、启动、管理以及优化配置 Nginx&#x…...

【华为OD-E卷-寻找关键钥匙 100分(python、java、c++、js、c)】

【华为OD-E卷-寻找关键钥匙 100分&#xff08;python、java、c、js、c&#xff09;】 题目 小强正在参加《密室逃生》游戏&#xff0c;当前关卡要求找到符合给定 密码K&#xff08;升序的不重复小写字母组成&#xff09; 的箱子&#xff0c;并给出箱子编号&#xff0c;箱子编…...

SQL MID()

SQL中的MID()函数是一个用于从指定位置开始截取字符串中指定长度的子串的函数。这个函数在数据库查询和数据处理中经常被使用&#xff0c;特别是在需要从较长的文本字段中提取特定信息时。 MID()函数的基本语法是&#xff1a;SELECT MID(column_name, start, length) FROM tab…...

Sui 基金会任命 Christian Thompson 为新任负责人

Sui 基金会是专注于推动 Sui 蓬勃发展的生态增长与采用的机构。近日&#xff0c;基金会宣布任命 Christian Thompson 为新任负责人。在 Sui 主网发布的开创性一年里&#xff0c;Sui 凭借其无与伦比的速度、可扩展性和效率&#xff0c;迅速崛起为领先的 Layer 1 区块链之一&…...

ViEW生命周期

Vue的生命周期是指Vue实例从创建到销毁的整个过程&#xff0c;包括多个阶段和对应的钩子函数。以下是Vue生命周期的详细说明&#xff1a; 1. **创建阶段**&#xff1a; - beforeCreate&#xff1a;在实例初始化之前调用&#xff0c;此时数据观测和事件配置尚未完成&#xff0c;…...

[蓝桥杯 2019 国 B] 排列数

目录 前言 题解 思路 疑问 解答 前言 对于本篇文章是站在别人的基础之上来写的&#xff0c;对于这道题作为2019年国赛B组的最难的一题&#xff0c;他的难度肯定是不小的&#xff0c;这道题我再一开始接触的时候连思路都没有&#xff0c;也是看了两三遍别人发的题解&#x…...

python 中执行from elasticsearch import Elasticsearch,AsyncElasticsearch 报错

在 Python 中执行 from elasticsearch import Elasticsearch, AsyncElasticsearch 时,如果提示 AsyncElasticsearch 不存在,可能是因为以下几个原因: 1. 安装的 elasticsearch 库版本不匹配 AsyncElasticsearch 是在 elasticsearch 库的较新版本中引入的。如果你安装的版本…...

git 删除鉴权缓存及账号信息

在Windows系统下 清除凭证管理器中的Git凭据 按下Win R键&#xff0c;打开“运行”对话框&#xff0c;输入control&#xff0c;然后回车&#xff0c;打开控制面板。在控制面板中找到“用户账户”&#xff0c;然后点击“凭据管理器”。在凭据管理器中&#xff0c;找到“Windows…...

浏览器要求用户确认 Cookies Privacy(隐私相关内容)是基于隐私法规的要求,VUE 实现,html 代码

Cookie Notices and Cookie Consent | Cookiepedia 1. 法律法规要求 许多国家和地区的隐私法律要求网站在存储或处理用户数据&#xff08;包括 Cookies&#xff09;之前必须获得用户的明确同意&#xff1a; GDPR&#xff08;欧盟通用数据保护条例&#xff09; 要求&#xff…...

数据结构:栈和队列的实现

栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出 LIFO &#xff08; Last In First Out &#xff09;的原则。 压栈&#xff1a;栈…...

2024.12.21辩论赛感受

背景 今天辩论赛的双方论点是&#xff1a; 正方&#xff1a;寒假留在研发中心的收获大 反方&#xff1a;寒假去做其他事情的收获 辩论赛&#xff0c;为了锻炼自己&#xff0c;选择了不想选择以及相对不好辩论的反方。出现的状况有一下几点&#xff1a; 1.发现自己脑子完全跟不…...

JAVA:组合模式(Composite Pattern)的技术指南

1、简述 组合模式(Composite Pattern)是一种结构型设计模式,旨在将对象组合成树形结构以表示“部分-整体”的层次结构。它使客户端对单个对象和组合对象的使用具有一致性。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什么是组合模式 组合模式…...

圣诞快乐(h5 css js(圣诞树))

一&#xff0c;整体设计思路 圣诞树h5&#xff08;简易&#xff09; 1.页面布局与样式&#xff1a; 页面使用了全屏的黑色背景&#xff0c;中央显示圣诞树&#xff0c;树形由三层绿色的三角形组成&#xff0c;每一层的大小逐渐变小。树干是一个棕色的矩形&#xff0c;位于三角…...

移植 OLLVM 到 LLVM18,修复控制流平坦化报错

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 前言 把 OLLVM 移植到 LLVM18 后&#xff0c;发现 -fla&#xff08;控制流平坦化&#xff09;并不能正常使用。 关于移植过程可以参考这篇文章 【移植 OLLVM…...

MFC/C++学习系列之简单记录——序列化机制

MFC/C学习系列之简单记录——序列化机制 前言简述六大机制序列化机制使用反序列化总结 前言 MFC有六大机制&#xff0c;分别是程序启动机制、窗口创建机制、动态创建机制、运行时类信息机制、消息映射机制、序列化机制。 简述六大机制 程序启动机制&#xff1a;全局的应用程序…...

【网络云计算】2024第51周-每日【2024/12/17】小测-理论-解析

文章目录 1. 计算机网络有哪些分类2. 计算机网络中协议与标准的区别3. 计算机网络拓扑有哪些结构4. 常用的网络设备有哪些&#xff0c;分属于OSI的哪一层5. IEEE802局域网标准有哪些 【网络云计算】2024第51周-每日【2024/12/17】小测-理论-解析 1. 计算机网络有哪些分类 计算…...

Python中的上下文管理器:从资源管理到自定义实现

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 Python中的上下文管理器(Context Manager)为资源管理提供了强大的支持,尤其在处理文件、网络连接、数据库连接等需要精确控制生命周期的…...

STM32 高级 物联网通信之CAN通讯

目录 CAN通讯介绍 物理层 协议层 CAN的帧(报文)种类 1 数据帧(发送单元->接受单元) 2 远程帧(接受单元->发送单元) 3 错误帧(发送方发送数据错误会发送的状态帧) 4 过载帧(接收方放不下会发送到的状态帧) 5 帧间隔(状态) 数据帧介绍 远程帧介绍 C…...

如何求解小于等于x的正整数因子y的个数总和

G ( X , Y ) X 的因子 Y 个数 G(X,Y) X的因子Y个数 G(X,Y)X的因子Y个数 例如 G ( 8 , 2 ) 3 G(8,2)3 G(8,2)3 G ( 12 , 2 ) 2 G(12,2)2 G(12,2)2 F ( X , Y ) ∑ i 1 X G ( i ) F(X, Y) \sum_{i1}^{X} G(i) F(X,Y)i1∑X​G(i) 直接上结论 F ( X , Y ) X Y 1 ⋯ X…...