文章目录

  • 一. 应用场景
  • 二. 使用示例
    • 示例1
    • 示例2
    • 示例3
  • 三. 实现
    • 1. 动态表查询构建器,模仿MyBatis-Plus
    • 2. mapper
    • 3. mapper.xml
      • 功能概述
      • 参数说明
  • 四. 动态 SQL 的优化与风险防控


在企业级应用开发中,数据查询场景往往呈现出复杂多变的特点 —— 从简单的单表筛选到包含嵌套条件的多维度检索,从固定格式的报表查询到用户自定义的灵活搜索。动态 SQL 查询以其 “参数化配置 + 逻辑动态拼接” 的特性,成为构建通用数据访问层的核心技术。以下从应用场景、技术优势及工程实践三个维度,深度解析这一技术的实用价值与优化方向。


一. 应用场景

这种动态 SQL 查询在通用数据访问层中非常实用,例如:

  • 通用的数据查询服务。
  • 支持复杂筛选条件的报表系统。
  • 数据管理后台的高级搜索功能。

二. 使用示例

示例1

在这里插入图片描述

示例2

在这里插入图片描述

示例3

在这里插入图片描述


三. 实现

1. 动态表查询构建器,模仿MyBatis-Plus

/*** 动态表查询构建器,模仿MyBatis-Plus** @author 鲁子狄* @since 2025/07/11 10:43*/
@Data
public class DynamicQueryWrapper {private final Map<String, Object> param = new HashMap<>();private final List<QueryCondition> conditions = new ArrayList<>();private final List<String> notNullColumns = new ArrayList<>();private final List<String> nullColumns = new ArrayList<>();private String tableName;private String selectColumns;private Object year;private Object versionId;private String groupByField;private String orderByField;private String sort = "asc";/*** 设置表名*/public DynamicQueryWrapper table(String tableName) {this.tableName = tableName;param.put("tableName", tableName);return this;}/*** 设置要查询的字段*/public DynamicQueryWrapper select(String columns) {selectColumns = columns;param.put("columns", columns);return this;}/*** 等于条件*/public DynamicQueryWrapper eq(boolean condition, String column, Object val) {if (condition && column != null && val != null) {conditions.add(new QueryCondition(column, "=", val));}return this;}/*** 等于条件*/public DynamicQueryWrapper eq(String column, Object val) {return eq(true, column, val);}/*** 不等于条件*/public DynamicQueryWrapper ne(boolean condition, String column, Object val) {if (condition && column != null && val != null) {conditions.add(new QueryCondition(column, "<>", val));}return this;}/*** 不等于条件*/public DynamicQueryWrapper ne(String column, Object val) {return ne(true, column, val);}/*** 大于条件*/public DynamicQueryWrapper gt(boolean condition, String column, Object val) {if (condition && column != null && val != null) {conditions.add(new QueryCondition(column, ">", val));}return this;}/*** 大于条件*/public DynamicQueryWrapper gt(String column, Object val) {return gt(true, column, val);}/*** 小于条件*/public DynamicQueryWrapper lt(boolean condition, String column, Object val) {if (condition && column != null && val != null) {conditions.add(new QueryCondition(column, "<", val));}return this;}/*** 小于条件*/public DynamicQueryWrapper lt(String column, Object val) {return lt(true, column, val);}/*** 大于等于条件*/public DynamicQueryWrapper ge(boolean condition, String column, Object val) {if (condition && column != null && val != null) {conditions.add(new QueryCondition(column, ">=", val));}return this;}/*** 大于等于条件*/public DynamicQueryWrapper ge(String column, Object val) {return ge(true, column, val);}/*** 小于等于条件*/public DynamicQueryWrapper le(boolean condition, String column, Object val) {if (condition && column != null && val != null) {conditions.add(new QueryCondition(column, "<=", val));}return this;}/*** 小于等于条件*/public DynamicQueryWrapper le(String column, Object val) {return le(true, column, val);}/*** 模糊查询*/public DynamicQueryWrapper like(boolean condition, String column, Object val) {if (condition && column != null && val != null) {conditions.add(new QueryCondition(column, "LIKE", val, true));}return this;}/*** 模糊查询*/public DynamicQueryWrapper like(String column, Object val) {return like(true, column, val);}/*** 左模糊查询*/public DynamicQueryWrapper likeLeft(boolean condition, String column, Object val) {if (condition && column != null && val != null) {conditions.add(new QueryCondition(column, "LIKE_LEFT", val, true));}return this;}/*** 左模糊查询*/public DynamicQueryWrapper likeLeft(String column, Object val) {return likeLeft(true, column, val);}/*** 右模糊查询*/public DynamicQueryWrapper likeRight(boolean condition, String column, Object val) {if (condition && column != null && val != null) {conditions.add(new QueryCondition(column, "LIKE_RIGHT", val, true));}return this;}/*** 右模糊查询*/public DynamicQueryWrapper likeRight(String column, Object val) {return likeRight(true, column, val);}/*** 不包含查询*/public DynamicQueryWrapper notLike(boolean condition, String column, Object val) {if (condition && column != null && val != null) {conditions.add(new QueryCondition(column, "NOT LIKE", val, true));}return this;}/*** 不包含查询*/public DynamicQueryWrapper notLike(String column, Object val) {return notLike(true, column, val);}/*** IN查询*/public DynamicQueryWrapper in(boolean condition, String column, Collection<?> values) {if (condition && column != null && values != null && !values.isEmpty()) {conditions.add(new QueryCondition(column, "IN", new ArrayList<>(values)));}return this;}/*** IN查询*/public DynamicQueryWrapper in(String column, Collection<?> values) {return in(true, column, values);}/*** NOT IN查询*/public DynamicQueryWrapper notIn(boolean condition, String column, Collection<?> values) {if (condition && column != null && values != null && !values.isEmpty()) {conditions.add(new QueryCondition(column, "NOT IN", new ArrayList<>(values)));}return this;}/*** NOT IN查询*/public DynamicQueryWrapper notIn(String column, Collection<?> values) {return notIn(true, column, values);}/*** BETWEEN查询*/public DynamicQueryWrapper between(boolean condition, String column, Object val1, Object val2) {if (condition && column != null && val1 != null && val2 != null) {List<Object> values = new ArrayList<>();values.add(val1);values.add(val2);conditions.add(new QueryCondition(column, "BETWEEN", values));}return this;}/*** BETWEEN查询*/public DynamicQueryWrapper between(String column, Object val1, Object val2) {return between(true, column, val1, val2);}/*** NOT BETWEEN查询*/public DynamicQueryWrapper notBetween(boolean condition, String column, Object val1, Object val2) {if (condition && column != null && val1 != null && val2 != null) {List<Object> values = new ArrayList<>();values.add(val1);values.add(val2);conditions.add(new QueryCondition(column, "NOT BETWEEN", values));}return this;}/*** NOT BETWEEN查询*/public DynamicQueryWrapper notBetween(String column, Object val1, Object val2) {return notBetween(true, column, val1, val2);}/*** 字段为NULL*/public DynamicQueryWrapper isNull(boolean condition, String column) {if (condition && column != null) {nullColumns.add(column);}return this;}/*** 字段为NULL*/public DynamicQueryWrapper isNull(String column) {return isNull(true, column);}/*** 字段不为NULL*/public DynamicQueryWrapper isNotNull(boolean condition, String column) {if (condition && column != null) {notNullColumns.add(column);}return this;}/*** 字段不为NULL*/public DynamicQueryWrapper isNotNull(String column) {return isNotNull(true, column);}/*** 分组*/public DynamicQueryWrapper groupBy(String field) {groupByField = field;return this;}/*** 排序*/public DynamicQueryWrapper orderBy(String field, boolean isAsc) {orderByField = field;sort = isAsc ? "asc" : "desc";return this;}/*** 正序排列*/public DynamicQueryWrapper orderByAsc(String field) {return orderBy(field, true);}/*** 倒序排列*/public DynamicQueryWrapper orderByDesc(String field) {return orderBy(field, false);}/*** OR条件*/public DynamicQueryWrapper or(boolean condition, Consumer<DynamicQueryWrapper> consumer) {if (condition) {DynamicQueryWrapper nestedWrapper = new DynamicQueryWrapper();consumer.accept(nestedWrapper);// 创建OR组ConditionGroup orGroup = new ConditionGroup();orGroup.getConditions().addAll(nestedWrapper.conditions);orGroup.setLogic("OR");conditions.add(orGroup);}return this;}/*** OR条件*/public DynamicQueryWrapper or(Consumer<DynamicQueryWrapper> consumer) {return or(true, consumer);}/*** AND条件*/public DynamicQueryWrapper and(boolean condition, Consumer<DynamicQueryWrapper> consumer) {if (condition) {DynamicQueryWrapper nestedWrapper = new DynamicQueryWrapper();consumer.accept(nestedWrapper);// 创建AND组ConditionGroup andGroup = new ConditionGroup();andGroup.getConditions().addAll(nestedWrapper.conditions);andGroup.setLogic("AND");conditions.add(andGroup);}return this;}/*** AND条件*/public DynamicQueryWrapper and(Consumer<DynamicQueryWrapper> consumer) {return and(true, consumer);}/*** 查询条件*/@Datapublic static class QueryCondition {private final String column;private final String operator;private final Object value;private final List<QueryCondition> children = new ArrayList<>();private boolean isLike = false;QueryCondition(String column, String operator, Object value) {this.column = column;this.operator = operator;this.value = value;}QueryCondition(String column, String operator, Object value, boolean isLike) {this.column = column;this.operator = operator;this.value = value;this.isLike = isLike;}// 辅助方法,避免在XML中直接比较字符串public boolean isEqualOperator() {return "=".equals(operator);}public boolean isNotEqualOperator() {return "<>".equals(operator);}public boolean isGreaterThanOperator() {return ">".equals(operator);}public boolean isLessThanOperator() {return "<".equals(operator);}public boolean isGreaterEqualOperator() {return ">=".equals(operator);}public boolean isLessEqualOperator() {return "<=".equals(operator);}public boolean isLikeOperator() {return "LIKE".equals(operator);}public boolean isLeftLikeOperator() {return "LIKE_LEFT".equals(operator);}public boolean isRightLikeOperator() {return "LIKE_RIGHT".equals(operator);}public boolean isNotLikeOperator() {return "NOT LIKE".equals(operator);}public boolean isInOperator() {return "IN".equals(operator);}public boolean isNotInOperator() {return "NOT IN".equals(operator);}public boolean isBetweenOperator() {return "BETWEEN".equals(operator);}public boolean isNotBetweenOperator() {return "NOT BETWEEN".equals(operator);}public boolean isComparisonOperator() {return isEqualOperator() || isNotEqualOperator() || isGreaterThanOperator() || isLessThanOperator()|| isGreaterEqualOperator() || isLessEqualOperator();}public boolean isGroup() {return false;}}/*** 条件组(用于处理括号内的AND/OR组合)*/@Getter@Setterpublic static class ConditionGroup extends QueryCondition {private final List<QueryCondition> conditions = new ArrayList<>();private String logic = "AND";ConditionGroup() {super(null, null, null);}// 添加辅助方法,判断逻辑类型public boolean isAndLogic() {return "AND".equals(logic);}public boolean isOrLogic() {return "OR".equals(logic);}@Overridepublic boolean isGroup() {return true;}}
}

2. mapper

	/*** selectList 使用QueryWrapper进行查询** @param wrapper 自定义查询条件* @return java.util.List<java.util.Map < java.lang.String, java.lang.String>>*/List<Map<String, String>> selectDataList(@Param("wrapper") DynamicQueryWrapper wrapper);

3. mapper.xml

<select id="selectDataList" resultType="java.util.Map">SELECT${wrapper.param.columns}FROM${wrapper.param.tableName}WHERE 1=1<!-- 处理所有条件 --><if test="wrapper.conditions != null and wrapper.conditions.size() > 0"><foreach collection="wrapper.conditions" item="condition" index="index"><choose><!-- 处理条件组(带括号的AND/OR条件) --><when test="condition.isGroup()">AND (<trim prefixOverrides="AND|OR"><foreach collection="condition.conditions" item="groupItem">${condition.logic}<choose><when test="groupItem.comparisonOperator">${groupItem.column} ${groupItem.operator} #{groupItem.value}</when><when test="groupItem.likeOperator and groupItem.isLike">${groupItem.column} LIKE CONCAT('%', #{groupItem.value}, '%')</when><when test="groupItem.leftLikeOperator and groupItem.isLike">${groupItem.column} LIKE CONCAT('%', #{groupItem.value})</when><when test="groupItem.rightLikeOperator and groupItem.isLike">${groupItem.column} LIKE CONCAT(#{groupItem.value}, '%')</when><when test="groupItem.notLikeOperator and groupItem.isLike">${groupItem.column} NOT LIKE CONCAT('%', #{groupItem.value}, '%')</when><when test="groupItem.inOperator">${groupItem.column} IN<foreach collection="groupItem.value" item="val" open="(" separator=","close=")">#{val}</foreach></when><when test="groupItem.notInOperator">${groupItem.column} NOT IN<foreach collection="groupItem.value" item="val" open="(" separator=","close=")">#{val}</foreach></when><when test="groupItem.betweenOperator">${groupItem.column} BETWEEN #{groupItem.value[0]} AND #{groupItem.value[1]}</when><when test="groupItem.notBetweenOperator">${groupItem.column} NOT BETWEEN #{groupItem.value[0]} AND #{groupItem.value[1]}</when></choose></foreach></trim>)</when><!-- 处理普通条件 --><otherwise><choose><when test="condition.comparisonOperator">AND ${condition.column} ${condition.operator} #{condition.value}</when><when test="condition.likeOperator and condition.isLike">AND ${condition.column} LIKE CONCAT('%', #{condition.value}, '%')</when><when test="condition.leftLikeOperator and condition.isLike">AND ${condition.column} LIKE CONCAT('%', #{condition.value})</when><when test="condition.rightLikeOperator and condition.isLike">AND ${condition.column} LIKE CONCAT(#{condition.value}, '%')</when><when test="condition.notLikeOperator and condition.isLike">AND ${condition.column} NOT LIKE CONCAT('%', #{condition.value}, '%')</when><when test="condition.inOperator">AND ${condition.column} IN<foreach collection="condition.value" item="val" open="(" separator="," close=")">#{val}</foreach></when><when test="condition.notInOperator">AND ${condition.column} NOT IN<foreach collection="condition.value" item="val" open="(" separator="," close=")">#{val}</foreach></when><when test="condition.betweenOperator">AND ${condition.column} BETWEEN #{condition.value[0]} AND #{condition.value[1]}</when><when test="condition.notBetweenOperator">AND ${condition.column} NOT BETWEEN #{condition.value[0]} AND #{condition.value[1]}</when></choose></otherwise></choose></foreach></if><!-- 处理NULL条件 --><if test="wrapper.nullColumns != null and wrapper.nullColumns.size() > 0"><foreach collection="wrapper.nullColumns" item="column">AND ${column} IS NULL</foreach></if><!-- 处理非空条件 --><if test="wrapper.notNullColumns != null and wrapper.notNullColumns.size() > 0"><foreach collection="wrapper.notNullColumns" item="column">AND ${column} IS NOT NULL AND ${column} != ''</foreach></if><!-- 处理分组 --><if test="wrapper.groupByField != null and wrapper.groupByField != ''">GROUP BY ${wrapper.groupByField}</if><!-- 处理排序 --><if test="wrapper.orderByField != null and wrapper.orderByField != ''">ORDER BY ${wrapper.orderByField} ${wrapper.sort}</if>
</select>

功能概述

  1. 基础查询:从指定表(${wrapper.param.bmc})中选取数据,并返回一个 Map 结果集。
  2. 动态条件过滤:能根据不同的条件动态生成 WHERE 子句,支持多种比较操作,像等值比较、LIKE 模糊查询、IN/NOT IN 集合查询以及 BETWEEN 范围查询等。
  3. 条件分组:支持用括号将条件分组,以此来实现复杂的逻辑组合,例如 (A AND B) OR C
  4. 空值判断:可以筛选出 NULL 或非 NULL 的字段。
  5. 分组和排序:支持 GROUP BYORDER BY 子句,能对查询结果进行分组和排序。

参数说明

查询使用了一个名为wrapper的参数对象,该对象包含以下属性:

  • param.bzd:要查询的字段列表。
  • param.bmc:要查询的表名。
  • param.year:年份参数。
  • param.versionId:版本 ID,用于筛选特定版本。
  • conditions:条件列表,包含简单条件和条件组。
  • nullColumns:需要判断为 NULL 的字段列表。
  • notNullColumns:需要判断为非 NULL 的字段列表。
  • groupByField:用于分组的字段。
  • orderByFieldsort:用于排序的字段和排序方向。

四. 动态 SQL 的优化与风险防控

现系统不用

对表名(${wrapper.param.bmc})、字段名(${wrapper.param.bzd})等拼接参数进行白名单校验,避免恶意用户注入非法表名(如user; DROP TABLE data)。

// 表名白名单校验
private static final Set<String> TABLE_WHITELIST = new HashSet<>(Arrays.asList("user", "order", "product"));
if (!TABLE_WHITELIST.contains(wrapper.getParam().getBmc())) {throw new SecurityException("非法表名查询");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91160.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91160.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/91160.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net天擎分钟降水数据统计

1.需求&#xff1a;计算滑动时间下的1小时、3小时、6小时、12小时、24小时降水数据&#xff0c;统计这个时间下的分钟级降水数据2.分析第一版本&#xff1a;降水分钟级数据保存时间不长&#xff0c;保存太多意义不大&#xff0c;以更新的形式来保存这些统计数据效果会比较好&am…

图片合并pdf

文章目录 背景目标实现下载 背景 整合&#xff1a; 将零散的图片集合成一个单一文件。有序化&#xff1a; 固定图片的排列顺序。标准化&#xff1a; 转换为通用、兼容性强的PDF格式。高效管理&#xff1a; 便于存储、查找、分享和传输。正式化/文档化&#xff1a; 满足提交、报…

【vue3+js】文件下载方法整理

前端文件下载方式 引言 在前端开发中,文件下载是一个常见的需求。后端可能以不同的方式返回文件数据,前端需要根据不同的返回类型采用相应的处理方式。本文将总结几种常见的后端返回类型及对应的前端处理方案,主要基于Vue3和JavaScript环境。 一、后端返回文件URL 场景描…

MicrobiomeStatPlots | 森林图教程Forest plot tutorial

视频讲解https://www.bilibili.com/video/BV1mA3yzEEnc/森林图简介什么是森林图&#xff1f;参考&#xff1a;https://mp.weixin.qq.com/s/vwNf_sFlmhp7DeSYaQ3NxQ森林图是以统计指标和统计分析方法为基础&#xff0c;用数值运算结果绘制出的图形。它在平面直角坐标系中&#x…

vscode 打开项目时候,有部分外部依赖包找不到定义或者声明,但是能使用cmake正常编译并且运行

解决&#xff1a;是依赖路径的问题&#xff0c;先看includePath对不对&#xff0c;但是有时候会依赖外部文件&#xff0c;这时候入股cmake编译能够听过&#xff0c; 说明编译器能够找到依赖路径&#xff0c; 但是vscode的 IntelliSense 找不到依赖路径 → 导致编辑器提示错误、…

nginx:SSL_CTX_use_PrivateKey failed

SSL_CTX_use_PrivateKey("/home/nginx-vue/cret/*.com.key") failed (SSL: error:0B080074:x509 certificate routines:x509_check_private_key:key values mismatch) Nginx 尝试加载私钥文件时失败&#xff0c;原因是&#xff1a;证书与私钥不匹配 问题本质 SSL 证…

Docker 基于 Cgroups 实现资源限制详解【实战+源码】

本文将带你深入理解 Docker 如何借助 Linux Cgroups 实现对内存、CPU 等系统资源的精细化控制&#xff0c;并提供完整演示与图解、Compose 配置模板和资源包下载&#xff0c;适合初学者与工程师深入学习与实战。 文章目录 一、什么是 Cgroups&#xff1f;为什么对容器如此关键…

Linux中的系统日志(Rsyslog)

一、实验环境主机名系统网络适配器IP地址serverarhel9NAT模式172.25.254.11/24serverbrhel9NAT模式172.25.254.22/24二、Rsyslog的基本参数&#xff08;1&#xff09;安装rsyslog&#xff08;2&#xff09;rsyslog的服务名称&#xff08;3&#xff09;rsyslog的主配置文件rsysl…

Spring Boot + Thymeleaf + RESTful API 前后端整合完整示例

关键词&#xff1a;Spring Boot、Thymeleaf、RESTful API、前后端整合、用户管理 ✅ 功能概述 本文将为你提供一个完整的 Spring Boot Thymeleaf RESTful API 的前后端整合项目&#xff0c;实现以下功能&#xff1a; 模块功能用户管理查看用户列表、新增用户、删除用户后端…

从零开始的MySQL学习

MySQL 从零开始的MySQL学习 第一节 数据库 重点&#xff1a;数据库通过SQL等标准语言进行动作&#xff0c;数据库的概念、分类&#xff0c;数据管理系统&#xff08;操纵和管理数据库的大型软件&#xff09; 数据库&#xff08;Database&#xff09; 是按照数据结构来组织、存储…

Docker 高级管理--Dockerfile镜像制作

二:Dockerfile 语法基础 1:基础指令 (1)FROM 指定基础镜像&#xff0c;所有的 Dockerfile 都必须以 FROM 指令开头&#xff0c;它定义了新镜像基于哪个基础镜像构建。 FRoM ubuntu:20.04 (2)MAINTAINER(已奔用&#xff0c;推荐使用LABEL) 用于指定镜像的维护者信息。不过在较…

LeetCode 692题解 | 前K个高频单词

前K个高频单词一、题目链接二、题目三、分析四、代码一、题目链接 692.前K个高频单词 二、题目 三、分析 本题目我们利用map统计出次数以后&#xff0c;返回的答案应该按单词出现频率由高到低排序&#xff0c;有一个特殊要求&#xff0c;如果不同的单词有相同出现频率&#…

C++ 中的 std::bind 用法

在现代 C++ 编程中,std::bind 是一个非常强大但常常被误解的工具。它允许我们将函数(包括成员函数)、参数进行绑定,并生成一个新的可调用对象。这在编写异步回调、事件处理、适配器模式等场景中非常有用。 🔧 一、std::bind 是什么? std::bind 是定义在 <functiona…

Spring Boot秒级冷启动方案:阿里云FC落地实战(含成本对比)

Spring Boot秒级冷启动方案&#xff1a;阿里云FC落地实战&#xff08;含成本对比&#xff09;一、冷启动痛点与FC核心优势1. 传统Spring Boot冷启动瓶颈2. 阿里云FC核心能力二、秒级冷启动架构设计1. 整体架构2. 关键组件选型三、5大核心优化策略1. 应用瘦身&#xff08;JAR包精…

搜索引擎vs向量数据库:LangChain混合检索架构实战解析

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。一、LangChain搜索工具实战&#xff1a;集成DuckDuckGo实现实时信息查询 核心场景&#xff1a;解决大模型知识滞后问题&#xff0c;通过搜索引擎获取实…

【算法】贪心算法:将数组和减半的最少操作次数C++

文章目录前言题目解析算法原理代码示例策略证明前言 题目的链接&#xff0c;大家可以先试着去做一下再来看一下思路。2208. 将数组和减半的最少操作次数 - 力扣&#xff08;LeetCode&#xff09; 题目解析 要认真去把题目看一遍&#xff0c;画出题目中的有用信息。 示例一定是…

git异常退出,应该是内存不足

这次下载代码&#xff1a; 公司虚拟机到了一定步骤&#xff0c;肯定退出。而家里的虚拟机则完全正常。我把家里的虚拟机复制到公司&#xff0c;还是崩溃。 差异在哪里&#xff1f;公司电脑虚拟机内存设置为10G&#xff0c;家里的16。因为家里电脑64G内存。 后来确认&#xff…

机器学习13——支持向量机下

支持向量机下 非线性支持向量机&#xff08;Non-linear SVMs&#xff09;详解 核心思想 当数据在原始空间线性不可分时&#xff0c;通过**核技巧&#xff08;Kernel Trick&#xff09;**将数据映射到高维特征空间&#xff0c;使其在该空间中线性可分。 比如以下的样本在一维空间…

GPT-4和Claude哪个好

选择GPT-4还是Claude?这就像在问“苹果还是橙子哪个更好”——‌答案完全取决于你的具体需求‌。两者都是顶尖大语言模型,但各有特色。 我为你做了详细对比,帮你快速定位哪个更适合你: 🧠 核心能力对比 特性GPT-4 (OpenAI)Claude (Anthropic)‌语言理解/推理‌顶尖水平,…

RHCE考试 ——笔记

RHCE模拟测试exam_start ehcerht-vmctl start all考前说明• 请勿更改 IP 地址。DNS 解析完整主机名&#xff0c;同时也解析短名称。• 所有系统的 root 密码都是 redhat• Ansible 控制节点上已创建用户账户 devops。可以使用 ssh 访问• 所需的所有镜像保存在镜像仓库 utilit…