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

【MyBatis-Plus 核心接口】BaseMapper 和 IService 深度解析

在使用 MyBatis-Plus(简称 MP)进行开发时,BaseMapper 和 IService 接口是我们老朋友了,不知道你会不会跟我一样好奇:为什么实现了 BaseMapperIService 接口,我们就能轻松操作数据库?这背后有哪些工作机制?本文将带你一步步探究,并结合 CRUD 操作分类讲解两者的常用方法。希望这篇博客讲解能给你带来一些收获😘


一、BaseMapper 核心功能

BaseMapper 是 MyBatis-Plus 提供的一个基础接口,用于封装最常见的 CRUD 操作。只要你的实体类对应了这个 Mapper 接口,就能使用其提供的方法与数据库交互

核心原理

  • MP 内置 SQL 解析器BaseMapper 的方法背后是 MP 内置的动态 SQL 解析器,它根据泛型参数(实体类)自动生成 SQL 语句。

  • 无需重复编写:常见的增删改查方法已经内置,实现了开发效率的提升。

常用方法分类

BaseMapper 提供的方法可以分为以下几类:

新增操作
  • 插入一条记录,忽略非空字段。
    int insert(T entity)
    
删除操作
  • 根据主键删除
    int deleteById(Serializable id)
    
  • 根据主键批量删除
    int deleteBatchIds(Collection<? extends Serializable> idList)
    
  • 根据字段条件删除
    int deleteByMap(Map<String, Object> columnMap)
    
更新操作
  • 根据主键更新
    int updateById(@Param("et") T entity)
    
  • 根据条件更新
    int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper)
    
查询操作
  • 根据主键查询
    T selectById(Serializable id)
    
  • 根据主键批量查询
    List<T> selectBatchIds(Collection<? extends Serializable> idList)
    
  • 根据 Map 条件查询
    List<T> selectByMap(Map<String, Object> columnMap)
    
  • 根据条件查询列表
    List<T> selectList(@Param("ew") Wrapper<T> queryWrapper)
    
  • 分页查询
    IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper)
    

【说明】

  • T 是实体类泛型,代表数据库表的映射对象。
  • Serializable id 是实体类的主键类型。
  • Wrapper 是条件构造器,用于动态生成 SQL 条件。
  • IPage 是分页参数接口,结合分页插件实现分页查询。

代码示例

@Mapper
public interface UserMapper extends BaseMapper<User> {// 无需手写基本CRUD方法
}
​
// 使用示例
User user = new User();
user.setName("Tom");
user.setAge(25);
userMapper.insert(user);

二、IService 核心功能

IService 是 MyBatis-Plus 提供的业务层接口,主要封装了对 BaseMapper 的进一步抽象,提供一些常用的业务逻辑方法。

核心原理

  • 依赖 Service 层IService 内部调用 BaseMapper 的方法,通过组合的方式封装业务逻辑。

  • 增强业务扩展性:通过继承 IService,可以更容易添加自定义业务逻辑,同时不影响基础 CRUD 功能。


常用 CRUD 方法一览

IService 方法大部分是对 BaseMapper 方法的封装,并增加了一些便利操作:

新增操作
  • 保存一条记录,忽略非空字段。
    boolean save(T entity)
    
  • 批量插入记录,提高插入效率。
    boolean saveBatch(Collection<T> entityList)
    
删除操作
  • 根据主键删除
    boolean removeById(Serializable id)
    
  • 根据 Map 条件删除
    boolean removeByMap(Map<String, Object> columnMap)
    
  • 根据主键批量删除
    boolean removeBatchIds(Collection<? extends Serializable> idList)
    
更新操作
  • 根据主键更新
    boolean updateById(T entity)
    
  • 根据条件更新
    boolean update(T entity, Wrapper<T> updateWrapper)
    
  • 批量更新记录,支持根据主键更新多个实体。
    boolean updateBatchById(Collection<T> entityList)
    
查询操作
  • 根据主键查询单条记录。
    T getById(Serializable id)
    
  • 根据主键批量查询多个主键对应的记录。
    List<T> listByIds(Collection<? extends Serializable> idList)
    
  • 根据 Map 条件查询符合 Map 条件的记录。
    List<T> listByMap(Map<String, Object> columnMap)
    
  • 根据条件查询符合条件构造器的所有记录。
    List<T> list(Wrapper<T> queryWrapper)
    
  • 分页查询,配合分页插件,返回分页结果。
    IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper)
    

使用示例

保存操作示例
User user = new User();
user.setName("Alice");
user.setAge(30);
userService.save(user);
查询操作示例
List<User> users = userService.listByIds(Arrays.asList(1, 2, 3));
users.forEach(System.out::println);
分页查询示例
IPage<User> page = new Page<>(1, 5); // 第1页,每页5条记录
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 18); // 年龄大于18
IPage<User> result = userService.page(page, queryWrapper);
result.getRecords().forEach(System.out::println);

三、操作数据库的工作机制

接下来我们深入讲解一下 MyBatis-Plus 是如何通过代码生成和动态代理机制实现数据库操作的

  1. 代码生成:MP 基于实体类生成 SQL 映射文件,通过 BaseMapperIService 动态生成常用方法的实现。

  2. 动态代理:MP 使用了 MyBatis 提供的 MapperProxy 动态代理机制,当调用 BaseMapper 的方法时,会动态解析 SQL 并执行。


1. 代码生成机制

MyBatis-Plus 的代码生成器并不是简单的“生成代码文件”,它更像一个“动态 SQL 工厂”。通过结合实体类和数据库表的映射关系,它在运行时动态生成 SQL 并执行,具体如下:

核心实现逻辑
  • 实体类与表映射: 实体类通过 @TableName 和字段注解(如 @TableField)指定表和字段的对应关系。没有显式注解时,MP 会根据约定(如类名与表名的驼峰转下划线规则)推导映射。

  • 自动注入 SQL 操作方法: MP 根据 BaseMapper 的泛型实体类,结合数据库元信息(表名、字段名等),生成对应的 CRUD 方法所需的 SQL 模板。例如:

    • selectById 会生成类似如下的 SQL。

      SELECT * FROM user WHERE id = #{id} 
    • insert 会根据实体类的字段生成

       INSERT INTO user (name, age) VALUES (#{name}, #{age})
  • 动态生成的好处

    • 开发者无需手写基础 SQL。

    • 避免手写 SQL 错误,提升效率。

    • 结合条件构造器Wrapper),还能动态生成复杂 SQL。


2. 动态代理机制

MyBatis-Plus 使用 MyBatis 的 MapperProxy 动态代理机制,拦截 Mapper 接口的调用,将方法转化为 SQL 并执行。这是其实现核心数据库操作的基础。

MapperProxy 的核心逻辑

代理对象生成: 每一个 BaseMapper 实现类,实际上是由 MyBatis 动态代理生成的代理对象。在程序运行时,调用 BaseMapper 的方法并不会直接执行,而是由代理类的 invoke 方法处理。

方法调用的拦截与解析

  1. 方法匹配:当调用 BaseMapper 方法时,MapperProxy 会根据方法签名(方法名、参数类型等)找到对应的 MappedStatement

  2. SQL 解析:MP 扩展了 MyBatis 的 MappedStatement,可以根据方法名(如 selectById)和注解信息动态解析成 SQL。

  3. 执行查询:SQL 解析完成后,通过 MyBatis 的 Executor 层(如 SimpleExecutor 或 BatchExecutor)将 SQL 提交到数据库并返回结果。

与 MyBatis 的区别
  • MyBatis:开发者需要手动在 XML 或注解中定义每个 SQL 语句,方法名和 SQL 没有直接关系。

  • MyBatis-Plus:通过方法名和泛型实体类自动生成 SQL,例如 selectByIdinsert 等方法会根据命名约定生成标准的 CRUD SQL,无需额外配置。


3. 从调用到执行的全过程

以下是一个 BaseMapper.selectById 方法的调用到执行的完整流程,帮助更好理解动态代理和代码生成的协同作用:

  1. 调用阶段: 开发者调用 userMapper.selectById(1),此时 userMapper 是 MyBatis 的代理对象。

  2. 方法拦截: 代理对象的 invoke 方法被触发。它根据方法签名找到对应的 MappedStatementselectById 对应的 SQL 模板为:

    SELECT * FROM {tableName} WHERE id = ?
  3. SQL 生成

    • MP 通过 条件构造器Wrapper元数据(实体类中的元信息(字段名、类型、注解等)),将泛型 User 解析为表名 user

    • 将实体类字段(idname 等)解析为表字段(idname 等)。

    • 动态拼接 SQL:

      SELECT * FROM user WHERE id = 1
  4. 执行阶段

    • MyBatis 的 Executor 层负责将拼接好的 SQL 提交给数据库。

    • 数据库返回结果集,MyBatis 的 ResultHandler 负责将结果集映射为实体对象User 实例)。

  5. 返回结果: 最终,selectById 返回的是一个封装了查询结果的 User 对象。


4. 设计优势

MyBatis-Plus 的动态代理和代码生成机制在设计上有以下优势:

  1. 开发效率:通过自动生成 SQL 和动态代理调用,开发者不需要关心基础 SQL 的编写,大幅减少重复工作。

  2. 安全性:动态生成 SQL 时,会自动处理 SQL 注入风险(如参数使用 PreparedStatement 的形式绑定)。

  3. 扩展性:通过 Wrapper 构造器,支持复杂 SQL 动态生成;同时允许开发者自定义方法扩展。

  4. 统一性:提供了一套一致的 CRUD 方法名和调用规范,降低了团队协作成本

四、总结

BaseMapper

  • 封装了最基础的 CRUD 操作,例如 insertselectByIdupdateByIddeleteById 等,直接操作数据库,适合处理简单的增删改查逻辑。

  • 提供了一种零配置的开发体验,让开发者无需编写重复的 SQL 语句。

IService

  • BaseMapper 进行了进一步封装,包含了一些常用的业务逻辑扩展方法,例如批量插入、分页查询等。

  • 通过继承 IService,开发者可以更方便地在 Service 层添加自定义的业务逻辑,同时利用已有的 CRUD 功能。

相关文章:

【MyBatis-Plus 核心接口】BaseMapper 和 IService 深度解析

在使用 MyBatis-Plus&#xff08;简称 MP&#xff09;进行开发时&#xff0c;BaseMapper 和 IService 接口是我们老朋友了&#xff0c;不知道你会不会跟我一样好奇&#xff1a;为什么实现了 BaseMapper 或 IService 接口&#xff0c;我们就能轻松操作数据库&#xff1f;这背后有…...

SQL 建表语句详解

SQL 建表语句详解 在 SQL 中&#xff0c;创建表&#xff08;Table&#xff09;是数据库设计的基础。表是存储数据的基本单位&#xff0c;每个表由行和列组成。创建表的过程涉及到定义表的结构&#xff0c;包括列名、数据类型、约束等。本文将详细介绍 SQL 中的建表语句&#x…...

数据可视化-16. 日历图

目录 1. 日历图的概念 2. 日历图的适用场景 2.1 事件或活动的频率分析 2.2 数据的时间周期性分析 2.3 异常值检测 2.4 绩效监控 3. 日历图的缺陷 3.1 粒度受限于天数 3.2 数据密度过高时候难以解读 3.3 难以比较多个数据集 3.4 周期性较长的数据不易展示 4. 日历图…...

Docker 安装与常用命令

Docker 安装与常用命令 安装 Docker 如果您的系统尚未安装 Docker&#xff0c;可以使用以下命令安装 docker.io&#xff1a; 1. 安装命令&#xff1a; sudo apt install -y docker.io2、安装完成后&#xff0c;使用以下命令检查 Docker 是否成功安装&#xff1a; docker -…...

logback之自定义pattern使用的转换器

目录 &#xff08;1&#xff09;场景介绍 &#xff08;2&#xff09;定义转换器BizCallerConverter &#xff08;3&#xff09;logback配置conversionRule &#xff08;4&#xff09;测试效果 前文《logback之pattern详解以及源码分析》已经介绍了pattern&#xff0c;以及…...

Spring Cloud Alibaba2022之Sentinel总结

Spring Cloud Alibaba2022之Sentinel学习 Sentinel介绍 Sentinel是一个面向云原生微服务的流量控制、熔断降级组件。 Sentinel 分为两个部分&#xff1a; 核心库&#xff1a;&#xff08;Java 客户端&#xff09;不依赖任何框架/库&#xff0c;能够运行于所有 Java运行时环 …...

期末速成C++【知识点汇总完】

目录 第一章 C特点 命名空间-命名冲突 引用 new和delete 堆和栈 缺省参数 重载/隐藏/覆盖 初始化方式 第二章 面向对象的三大特征 成员变量 成员函数&#xff1a;构造函数和析构函数 访问权限和继承方式 空类 常const 静态static 友元friend 第三章 重…...

从 ELK Stack 到简单 — Elastic Cloud Serverless 上的 Elastic 可观察性

作者&#xff1a;来自 Elastic Bahubali Shetti, Chris DiStasio 宣布 Elastic Cloud Serverless 上的 Elastic Observability 正式发布 — 一款完全托管的可观察性解决方案。 随着组织规模的扩大&#xff0c;一个能够处理分布式云环境的复杂性并提供实时洞察的可观察性解决方…...

手机h5加桌面图标

手机h5应用1&#xff0c;网址浏览器添加到桌面&#xff0c;修改图标 关键代码 <!-- 手机h5加桌面图标 --> <!-- 安卓平台 chrome --> <link relapple-touch-icon-precomposed href<% BASE_URL %>logonew.png> <meta name"mobile-web-app-capab…...

Vue3,什么情况下数据会丢失响应式呢?

一、使用 reactive 定义的数据重新赋值 <template><h1>{{ foo.a }}</h1><h1>{{ bar.a }}</h1><button click"handleClick">点我</button> </template> <script setup> import { ref, reactive } from vuele…...

【Vim Masterclass 笔记03】S03L10 + S03L11:Vim 中的文本删除操作以及 Vim 思维习惯的培养(含 DIY 拓展知识点)

文章目录 Section 3&#xff1a;Vim Essentials&#xff08;Vim 核心知识&#xff09;S03L10 Vim 核心浏览命令同步练习点评课S03L11 Deleting Text and "Thinking in Vim" 文本的删除及 Vim 思维习惯的培养1 删除单个字符2 删除一个单词2.1 推广1&#xff1a;D HJK…...

《Java核心技术II》流中的filter、map和flatMap方法

filter、map和flatMap方法 filter filter通过转换产生过滤后的新流,将字符串流转化为只包含长单词的另一个流。 List words ...; Stream longWords words.stream().filter(w->w.length()>12) filter类型是Predicate(谓词&#xff0c;表示动作)类型对象&#xff0c…...

logback之自定义过滤器

logback有两种过滤器&#xff0c;一种是context中的过滤器叫TurboFilter&#xff0c;是一个全局的过滤器&#xff0c;会影响所有的日志记录。另一种是Appender中的过滤器&#xff0c;只对所在的append有效。两者大同小异&#xff0c;这里我们以Appender的过滤器为例。 &#x…...

【论文阅读笔记】IceNet算法与代码 | 低照度图像增强 | IEEE | 2021.12.25

目录 1 导言 2 相关工作 A 传统方法 B 基于CNN的方法 C 交互方式 3 算法 A 交互对比度增强 1)Gamma estimation 2)颜色恢复 3)个性化初始η B 损失函数 1)交互式亮度控制损失 2)熵损失 3)平滑损失 4)总损失 C 实现细节 4 实验 5 IceNet环境配置和运行 1 下载…...

查看 GitHub 仓库的创建时间

查看 GitHub 仓库的创建时间 1. https://api.github.com/repos/{owner}/{repository}2. curl -s https://api.github.com/repos/{owner}/{repository} | jq .created_atReferences 1. https://api.github.com/repos/{owner}/{repository} REST API endpoints for repositories…...

五种被低估的非常规统计检验方法:数学原理剖析与多领域应用价值研究

在当前的数据分析实践中&#xff0c;研究人员往往过度依赖t检验和方差分析&#xff08;ANOVA&#xff09;等传统统计方法。但是还存在多种具有重要应用价值但未受到足够重视的统计检验方法&#xff0c;这些方法在处理复杂的实际数据时具有独特优势。本文将详细介绍五种具有重要…...

mysql重置root密码(适用于5.7和8.0)

今天出一期重置mysql root密码的教程&#xff0c;适用于5.7和8.0&#xff0c;在网上搜索了很多的教程发现都没有效果&#xff0c;浪费了很多时间&#xff0c;尝试了多次之后发现这种方式是最稳妥的&#xff0c;那么废话不多说&#xff0c;往下看&#xff1a; 目录 第一步&…...

【AIGC-ChatGPT职业提示词指令】职业发展的航海指南:在人生的十字路口做出明智抉择

引言 在职业发展的海洋中&#xff0c;每个人都会遇到需要重要抉择的时刻。这些关键节点就像航海中的分岔路口&#xff0c;选择不同的航线可能驶向截然不同的目的地。如何在这些关键时刻做出明智的选择&#xff0c;需要我们既要着眼当下的风向&#xff0c;也要洞察远方的航程。…...

【从零开始入门unity游戏开发之——C#篇39】C#反射使用——Type 类、Assembly 类、Activator 类操作程序集

文章目录 前言一、前置知识1、编译器2、程序集&#xff08;Assembly&#xff09;3、元数据&#xff08;Metadata&#xff09; 二、反射1、反射的概念2、反射的作用3、反射的核心Type 类3.1 Type 类介绍3.2 不同方法获取 Type3.3 获取type类型所在的程序集的相关信息 4、反射的常…...

如何启动CentOS6远程服务器和进行ssh远程登录?

如何启动CentOS 6远程服务器&#xff1f; 在CentOS 6中&#xff0c;启动远程服务器通常涉及到配置SSH服务和VNC服务&#xff0c;以下是详细的步骤&#xff1a; 配置SSH服务 确认是否安装SSH 首先需要检查系统中是否已经安装了SSH服务&#xff0c;打开终端并输入以下命令&am…...

面向机器学习的Java库与平台

学习Java语言中与机器学习相关的各种库与平台&#xff0c;了解每个库的功能&#xff0c;以及可以用它 们解决的问题。  实现机器学习应用时需要具备的Java环境  Weka&#xff1a;一个通用的机器学习平台  Java机器学习库&#xff1a;一系列机器学习算法  Apache Mah…...

AI大模型语音识别转文字

提取音频 本项目作用在于将常见的会议录音文件、各种语种音频文件进行转录成相应的文字&#xff0c;也可从特定视频中提取对应音频进行转录成文字保存在本地。最原始的从所给网址下载对应视频和音频进行处理。下载ffmpeg(https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-…...

GAN对抗生成网络(一)——基本原理及数学推导

1 背景 GAN(Generative Adversarial Networks)对抗生成网络是一个很巧妙的模型&#xff0c;它可以用于文字、图像或视频的生成。 例如&#xff0c;以下就是GAN所生成的人脸图像。 2 算法思想 假如你是《古董局中局》的文物造假者&#xff08;Generator,生成器&#xff09;&a…...

LeetCode - 初级算法 数组(旋转数组)

旋转数组 这篇文章讨论如何通过编程实现数组元素的旋转操作。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例: 输入: nums = [1,2,3,...

目标检测入门指南:从原理到实践

目录 1. 数据准备与预处理 2. 模型架构设计 2.1 特征提取网络原理 2.2 区域提议网络(RPN)原理 2.3 特征金字塔网络(FPN)原理 2.4 边界框回归原理 2.5 非极大值抑制(NMS)原理 2.6 多尺度训练与测试原理 2.7 损失函数设计原理 3. 损失函数设计 4. 训练策略优化 5. 后…...

连接github和ai的桥梁:GitIngest

Git ingest GitIngest - 将任何 Github 仓库转变为适合 LLM 的友好型提示文本 (https://github.com/cyclotruc/gitingest) 输入 Github 地址或者名称&#xff0c;GitIngest 就会提供该仓库的总结、目录结构、仓库内容的文本内容 你可以复制这些文本与 AI 大模型更好地对话...

百度贴吧的ip属地什么意思?怎么看ip属地

在数字化时代&#xff0c;IP地址不仅是网络设备的唯一标识符&#xff0c;更承载着用户的网络身份与位置信息。百度贴吧作为广受欢迎的社交平台&#xff0c;也遵循相关规定&#xff0c;在用户个人主页等位置展示账号IP属地信息。那么&#xff0c;百度贴吧的IP属地究竟意味着什么…...

5.系统学习-PyTorch与多层感知机

PyTorch与多层感知机 前言PyTroch 简介张量&#xff08;Tensor&#xff09;张量创建张量的类型数据类型和 dtype 对应表张量的维度变换&#xff1a;张量的常用操作矩阵或张量计算 Dataset and DataLoaderPyTorch下逻辑回归与反向传播数据表格 DNN&#xff08;全连结网络&#x…...

wpf 基于Behavior库 的行为模块

Microsoft.Xaml.Behaviors 是一个用于WPF&#xff08;Windows Presentation Foundation&#xff09;的行为库&#xff0c;它的主要作用是允许开发者在不修改控件源代码的情况下&#xff0c;为控件添加自定义的行为和交互逻辑。行为库的核心思想是通过定义可重用的行为组件&…...

【一文解析】新能源汽车VCU电控开发——能量回收模块

一、概述 VCU&#xff08;Vehicle Control Unit&#xff0c;整车控制器&#xff09;能量回收功能是新能源汽车&#xff08;如纯电动汽车和混合动力汽车&#xff09;中非常重要的一个环节。它主要是在车辆减速或制动过程中&#xff0c;将车辆的部分动能转化为电能&#xff0c;并…...

鸿蒙TCPSocket通信模拟智能家居模拟案例

效果图 一、智能家居热潮下的鸿蒙契机 在当下科技飞速发展的时代&#xff0c;智能家居已如浪潮般席卷而来&#xff0c;深刻地改变着我们的生活方式。从能依据环境光线自动调节亮度的智能灯具&#xff0c;到可远程操控、精准控温的智能空调&#xff0c;再到实时监测健康数据的智…...

【Spring Boot 实现 PDF 导出】

Spring Boot 实现 PDF 导出 在Spring Boot应用程序中实现PDF导出功能&#xff0c;可以选择多种库和技术栈。每种方法都有其优缺点&#xff0c;适用于不同的场景。以下是四种常见的方式&#xff1a;iText、Apache PDFBox、JasperReports 和 Thymeleaf Flying Saucer。我将详细…...

【Python】selenium结合js模拟鼠标点击、拦截弹窗、鼠标悬停方法汇总(使用 execute_script 执行点击的方法)

我们在写selenium获取网络信息的时候&#xff0c;有时候我们会受到对方浏览器的监控&#xff0c;对方通过分析用户行为模式&#xff0c;如点击、滚动、停留时间等&#xff0c;网站可以识别出异常行为&#xff0c;进而对Selenium爬虫进行限制。 这里我们可以加入JavaScript的使…...

leetcode hot 100 前k个高平元素

347. 前 K 个高频元素 已解答 中等 相关标签 相关企业 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 class Solution(object):def topKFrequent(self, nums, k):""":type nums: Lis…...

数据结构漫游记:静态双向链表

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…...

Object.defineProperty() 完整指南

Object.defineProperty() 完整指南 1. 基本概念 Object.defineProperty() 方法允许精确地添加或修改对象的属性。默认情况下&#xff0c;使用此方法添加的属性是不可修改的。 1.1 基本语法 Object.defineProperty(obj, prop, descriptor)参数说明&#xff1a; obj: 要定义…...

1Panel自建RustDesk服务器方案实现Windows远程macOS

文章目录 缘起RustDesk 基本信息实现原理中继服务器的配置建议 中继服务器自建指南准备服务器安装1Panel安装和配置 RustDesk 中继服务防火墙配置和安全组配置查看key下载&安装&配置客户端设置永久密码测试连接 macOS安装客户端提示finder写入失败hbbs和hbbr说明**hbbs…...

nginx学习之路-windows系统安装nginx

文章目录 1. 下载2. 启动3. 验证参考文档 1. 下载 官方下载地址&#xff1a;https://nginx.org/en/download.html 可以下载windows版本&#xff0c;如nginx-1.26.2.zip。解压后&#xff0c;加入系统变量。 2. 启动 可以使用命令行启动&#xff08;windows系统自带的cmd可能…...

Paimon_01_241020

1. 概述 1.1. 核心特点 统一批处理和流处理&#xff08;流和批同一套代码&#xff09;数据湖能力多种引擎平权变更日志生成丰富的表类型&#xff08;主键表、append-only&#xff0c;有序的流式读取来代替消息队列&#xff09;模式演化&#xff08;schema变更&#xff09; 1…...

人工智能:变革时代的核心驱动力

求各位观众老爷看一看 先声明一下&#xff0c;该内容由于篇幅过长&#xff0c;可能会有一些地方存在一些小问题请大家谅解 观众老爷们&#xff0c;点个免费的赞和关注呗&#xff0c;您们的支持就是我最大的动力~ 人工智能&#xff1a;变革时代的核心驱动力 一、引言 在当今…...

【机器学习】工业 4.0 下机器学习如何驱动智能制造升级

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 随着科技的飞速发展&#xff0c;工业 4.0 浪潮正席卷全球制造业&#xff0c;而机器学习作为这一变革中的关键技术&#xff0c;正以前…...

数据分析-Excel

数据类型和函数初步 Excel中有文本类型和数值类型–但是无法用肉眼分辨出来isnumber来区分是否是数值类型text和value函数可以完成数值类型以及文本类型的转换单元格第一位输入’方式明确输入的是文本sum函数必须是数值类型 文本连接-and-or-not-if-mod-max函数 字符串的连接…...

Kubernetes第二天

1.pod运行一个容器 1.创建目录 mkdir -p /manifests/pod 2.编写pod资源清单文件 vim 01-myweb.yaml 说明&#xff1a; apiVersion:指的是Api的版本 metadata&#xff1a;资源的元数据 spec:用户期望的资源的运行状态 status&#xff1a;资源实际的运行状态 由于拉取远…...

【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活

&#x1f4ac; 欢迎讨论&#xff1a;如对文章内容有疑问或见解&#xff0c;欢迎在评论区留言&#xff0c;我需要您的帮助&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;如果这篇文章对您有所帮助&#xff0c;请不吝点赞、收藏或分享&#xff0c;谢谢您的支持&#x…...

Kerberos用户认证-数据安全-简单了解-230403

hadoop安全模式官方文档&#xff1a;https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/SecureMode.html kerberos是什么 kerberos是计算机网络认证协议&#xff0c;用来在非安全网络中&#xff0c;对个人通信以安全的手段进行身份认证。 概念&#…...

大中厂面试经验分享:如何使用消息队列(MQ)解决系统问题

在大中型互联网公司中&#xff0c;消息队列&#xff08;MQ&#xff09;作为一种关键的分布式系统组件&#xff0c;广泛应用于解决系统中的高并发、异步处理、解耦等问题。 在面试中&#xff0c;尤其是针对后端工程师或系统架构师的职位&#xff0c;面试官常常会通过询问消息队列…...

c#String和StringBuilder

目录 一&#xff0c;String 1&#xff0c;string的特点&#xff1a; 2&#xff0c;string常用方法 &#xff08;1&#xff09;Length &#xff08;2&#xff09;Substring() &#xff08;3&#xff09;ToUpper() &#xff08;4&#xff09;ToLower() &#xff08;5&…...

【人工智能机器学习基础篇】——深入详解强化学习之常用算法Q-Learning与策略梯度,掌握智能体与环境的交互机制

深入详解强化学习之常用算法&#xff1a;Q-Learning与策略梯度 强化学习&#xff08;Reinforcement Learning, RL&#xff09;作为机器学习的一个重要分支&#xff0c;近年来在多个领域取得了显著成果。从棋类游戏的人机对战到自主驾驶汽车&#xff0c;强化学习技术展示了其强大…...

jQuery学习笔记2

jQuery 属性操作 <body><a href"http://www.itcast.cn" title"都挺好">都挺好</a><input type"checkbox" name"" id"" checked /><div index"1" data-index"2">我是div&…...

发现API安全风险,F5随时随地保障应用和API安全

分析数据显示&#xff0c;目前超过90%的基于Web的网络攻击都以API端点为目标&#xff0c;试图利用更新且较少为人所知的漏洞&#xff0c;而这些漏洞通常是由安全团队未主动监控的API所暴露。现代企业需要一种动态防御策略&#xff0c;在风险升级成代价高昂、令人警惕且往往无法…...