[筆記] 動態 SQL 查詢技術解析:構建靈活高效的企業級數據訪問層

文章目錄

  • 一. 應用場景
  • 二. 使用示例
    • 示例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…