裝飾器模式與模板方法模式實現MyBatis-Plus QueryWrapper 擴展

pom

<dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId> <!-- MyBatis 聯表查詢 -->
</dependency>

MPJLambdaWrapperX

/*** 拓展 MyBatis Plus Join QueryWrapper 類,主要增加如下功能:* <p>* 1. 拼接條件的方法,增加 xxxIfPresent 方法,用于判斷值不存在的時候,不要拼接到條件中。** @param <T> 數據類型*/
public class MPJLambdaWrapperX<T> extends MPJLambdaWrapper<T> {public MPJLambdaWrapperX<T> likeIfPresent(SFunction<T, ?> column, String val) {MPJWrappers.lambdaJoin().like(column, val);if (StringUtils.hasText(val)) {return (MPJLambdaWrapperX<T>) super.like(column, val);}return this;}public MPJLambdaWrapperX<T> inIfPresent(SFunction<T, ?> column, Collection<?> values) {if (ObjectUtil.isAllNotEmpty(values) && !ArrayUtil.isEmpty(values)) {return (MPJLambdaWrapperX<T>) super.in(column, values);}return this;}public MPJLambdaWrapperX<T> inIfPresent(SFunction<T, ?> column, Object... values) {if (ObjectUtil.isAllNotEmpty(values) && !ArrayUtil.isEmpty(values)) {return (MPJLambdaWrapperX<T>) super.in(column, values);}return this;}public MPJLambdaWrapperX<T> eqIfPresent(SFunction<T, ?> column, Object val) {if (ObjectUtil.isNotEmpty(val)) {return (MPJLambdaWrapperX<T>) super.eq(column, val);}return this;}public MPJLambdaWrapperX<T> neIfPresent(SFunction<T, ?> column, Object val) {if (ObjectUtil.isNotEmpty(val)) {return (MPJLambdaWrapperX<T>) super.ne(column, val);}return this;}public MPJLambdaWrapperX<T> gtIfPresent(SFunction<T, ?> column, Object val) {if (val != null) {return (MPJLambdaWrapperX<T>) super.gt(column, val);}return this;}public MPJLambdaWrapperX<T> geIfPresent(SFunction<T, ?> column, Object val) {if (val != null) {return (MPJLambdaWrapperX<T>) super.ge(column, val);}return this;}public MPJLambdaWrapperX<T> ltIfPresent(SFunction<T, ?> column, Object val) {if (val != null) {return (MPJLambdaWrapperX<T>) super.lt(column, val);}return this;}public MPJLambdaWrapperX<T> leIfPresent(SFunction<T, ?> column, Object val) {if (val != null) {return (MPJLambdaWrapperX<T>) super.le(column, val);}return this;}public MPJLambdaWrapperX<T> betweenIfPresent(SFunction<T, ?> column, Object val1, Object val2) {if (val1 != null && val2 != null) {return (MPJLambdaWrapperX<T>) super.between(column, val1, val2);}if (val1 != null) {return (MPJLambdaWrapperX<T>) ge(column, val1);}if (val2 != null) {return (MPJLambdaWrapperX<T>) le(column, val2);}return this;}public MPJLambdaWrapperX<T> betweenIfPresent(SFunction<T, ?> column, Object[] values) {Object val1 = ArrayUtils.get(values, 0);Object val2 = ArrayUtils.get(values, 1);return betweenIfPresent(column, val1, val2);}// ========== 重寫父類方法,方便鏈式調用 ==========@Overridepublic <X> MPJLambdaWrapperX<T> eq(boolean condition, SFunction<X, ?> column, Object val) {super.eq(condition, column, val);return this;}@Overridepublic <X> MPJLambdaWrapperX<T> eq(SFunction<X, ?> column, Object val) {super.eq(column, val);return this;}@Overridepublic <X> MPJLambdaWrapperX<T> orderByDesc(SFunction<X, ?> column) {//noinspection uncheckedsuper.orderByDesc(true, column);return this;}@Overridepublic MPJLambdaWrapperX<T> last(String lastSql) {super.last(lastSql);return this;}@Overridepublic <X> MPJLambdaWrapperX<T> in(SFunction<X, ?> column, Collection<?> coll) {super.in(column, coll);return this;}@Overridepublic MPJLambdaWrapperX<T> selectAll(Class<?> clazz) {super.selectAll(clazz);return this;}@Overridepublic MPJLambdaWrapperX<T> selectAll(Class<?> clazz, String prefix) {super.selectAll(clazz, prefix);return this;}@Overridepublic <S> MPJLambdaWrapperX<T> selectAs(SFunction<S, ?> column, String alias) {super.selectAs(column, alias);return this;}@Overridepublic <E> MPJLambdaWrapperX<T> selectAs(String column, SFunction<E, ?> alias) {super.selectAs(column, alias);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectAs(SFunction<S, ?> column, SFunction<X, ?> alias) {super.selectAs(column, alias);return this;}@Overridepublic <E, X> MPJLambdaWrapperX<T> selectAs(String index, SFunction<E, ?> column, SFunction<X, ?> alias) {super.selectAs(index, column, alias);return this;}@Overridepublic <E> MPJLambdaWrapperX<T> selectAsClass(Class<E> source, Class<?> tag) {super.selectAsClass(source, tag);return this;}@Overridepublic <E, F> MPJLambdaWrapperX<T> selectSub(Class<E> clazz, Consumer<MPJLambdaWrapper<E>> consumer, SFunction<F, ?> alias) {super.selectSub(clazz, consumer, alias);return this;}@Overridepublic <E, F> MPJLambdaWrapperX<T> selectSub(Class<E> clazz, String st, Consumer<MPJLambdaWrapper<E>> consumer, SFunction<F, ?> alias) {super.selectSub(clazz, st, consumer, alias);return this;}@Overridepublic <S> MPJLambdaWrapperX<T> selectCount(SFunction<S, ?> column) {super.selectCount(column);return this;}@Overridepublic MPJLambdaWrapperX<T> selectCount(Object column, String alias) {super.selectCount(column, alias);return this;}@Overridepublic <X> MPJLambdaWrapperX<T> selectCount(Object column, SFunction<X, ?> alias) {super.selectCount(column, alias);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectCount(SFunction<S, ?> column, String alias) {super.selectCount(column, alias);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectCount(SFunction<S, ?> column, SFunction<X, ?> alias) {super.selectCount(column, alias);return this;}@Overridepublic <S> MPJLambdaWrapperX<T> selectSum(SFunction<S, ?> column) {super.selectSum(column);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectSum(SFunction<S, ?> column, String alias) {super.selectSum(column, alias);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectSum(SFunction<S, ?> column, SFunction<X, ?> alias) {super.selectSum(column, alias);return this;}@Overridepublic <S> MPJLambdaWrapperX<T> selectMax(SFunction<S, ?> column) {super.selectMax(column);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectMax(SFunction<S, ?> column, String alias) {super.selectMax(column, alias);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectMax(SFunction<S, ?> column, SFunction<X, ?> alias) {super.selectMax(column, alias);return this;}@Overridepublic <S> MPJLambdaWrapperX<T> selectMin(SFunction<S, ?> column) {super.selectMin(column);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectMin(SFunction<S, ?> column, String alias) {super.selectMin(column, alias);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectMin(SFunction<S, ?> column, SFunction<X, ?> alias) {super.selectMin(column, alias);return this;}@Overridepublic <S> MPJLambdaWrapperX<T> selectAvg(SFunction<S, ?> column) {super.selectAvg(column);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectAvg(SFunction<S, ?> column, String alias) {super.selectAvg(column, alias);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectAvg(SFunction<S, ?> column, SFunction<X, ?> alias) {super.selectAvg(column, alias);return this;}@Overridepublic <S> MPJLambdaWrapperX<T> selectLen(SFunction<S, ?> column) {super.selectLen(column);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectLen(SFunction<S, ?> column, String alias) {super.selectLen(column, alias);return this;}@Overridepublic <S, X> MPJLambdaWrapperX<T> selectLen(SFunction<S, ?> column, SFunction<X, ?> alias) {super.selectLen(column, alias);return this;}}

LambdaQueryWrapperX


/*** 拓展 MyBatis Plus QueryWrapper 類,主要增加如下功能:* <p>* 1. 拼接條件的方法,增加 xxxIfPresent 方法,用于判斷值不存在的時候,不要拼接到條件中。** @param <T> 數據類型*/
public class LambdaQueryWrapperX<T> extends LambdaQueryWrapper<T> {public LambdaQueryWrapperX<T> likeIfPresent(SFunction<T, ?> column, String val) {if (StringUtils.hasText(val)) {return (LambdaQueryWrapperX<T>) super.like(column, val);}return this;}public LambdaQueryWrapperX<T> inIfPresent(SFunction<T, ?> column, Collection<?> values) {if (ObjectUtil.isAllNotEmpty(values) && !ArrayUtil.isEmpty(values)) {return (LambdaQueryWrapperX<T>) super.in(column, values);}return this;}public LambdaQueryWrapperX<T> inIfPresent(SFunction<T, ?> column, Object... values) {if (ObjectUtil.isAllNotEmpty(values) && !ArrayUtil.isEmpty(values)) {return (LambdaQueryWrapperX<T>) super.in(column, values);}return this;}public LambdaQueryWrapperX<T> eqIfPresent(SFunction<T, ?> column, Object val) {if (ObjectUtil.isNotEmpty(val)) {return (LambdaQueryWrapperX<T>) super.eq(column, val);}return this;}public LambdaQueryWrapperX<T> neIfPresent(SFunction<T, ?> column, Object val) {if (ObjectUtil.isNotEmpty(val)) {return (LambdaQueryWrapperX<T>) super.ne(column, val);}return this;}public LambdaQueryWrapperX<T> gtIfPresent(SFunction<T, ?> column, Object val) {if (val != null) {return (LambdaQueryWrapperX<T>) super.gt(column, val);}return this;}public LambdaQueryWrapperX<T> geIfPresent(SFunction<T, ?> column, Object val) {if (val != null) {return (LambdaQueryWrapperX<T>) super.ge(column, val);}return this;}public LambdaQueryWrapperX<T> ltIfPresent(SFunction<T, ?> column, Object val) {if (val != null) {return (LambdaQueryWrapperX<T>) super.lt(column, val);}return this;}public LambdaQueryWrapperX<T> leIfPresent(SFunction<T, ?> column, Object val) {if (val != null) {return (LambdaQueryWrapperX<T>) super.le(column, val);}return this;}public LambdaQueryWrapperX<T> betweenIfPresent(SFunction<T, ?> column, Object val1, Object val2) {if (val1 != null && val2 != null) {return (LambdaQueryWrapperX<T>) super.between(column, val1, val2);}if (val1 != null) {return (LambdaQueryWrapperX<T>) ge(column, val1);}if (val2 != null) {return (LambdaQueryWrapperX<T>) le(column, val2);}return this;}public LambdaQueryWrapperX<T> betweenIfPresent(SFunction<T, ?> column, Object[] values) {Object val1 = ArrayUtils.get(values, 0);Object val2 = ArrayUtils.get(values, 1);return betweenIfPresent(column, val1, val2);}// ========== 重寫父類方法,方便鏈式調用 ==========@Overridepublic LambdaQueryWrapperX<T> eq(boolean condition, SFunction<T, ?> column, Object val) {super.eq(condition, column, val);return this;}@Overridepublic LambdaQueryWrapperX<T> eq(SFunction<T, ?> column, Object val) {super.eq(column, val);return this;}@Overridepublic LambdaQueryWrapperX<T> orderByDesc(SFunction<T, ?> column) {super.orderByDesc(true, column);return this;}@Overridepublic LambdaQueryWrapperX<T> last(String lastSql) {super.last(lastSql);return this;}@Overridepublic LambdaQueryWrapperX<T> in(SFunction<T, ?> column, Collection<?> coll) {super.in(column, coll);return this;}
}

QueryWrapperX


/*** 拓展 MyBatis Plus QueryWrapper 類,主要增加如下功能:** 1. 拼接條件的方法,增加 xxxIfPresent 方法,用于判斷值不存在的時候,不要拼接到條件中。** @param <T> 數據類型*/
public class QueryWrapperX<T> extends QueryWrapper<T> {public QueryWrapperX<T> likeIfPresent(String column, String val) {if (StringUtils.hasText(val)) {return (QueryWrapperX<T>) super.like(column, val);}return this;}public QueryWrapperX<T> inIfPresent(String column, Collection<?> values) {if (!CollectionUtils.isEmpty(values)) {return (QueryWrapperX<T>) super.in(column, values);}return this;}public QueryWrapperX<T> inIfPresent(String column, Object... values) {if (!ArrayUtils.isEmpty(values)) {return (QueryWrapperX<T>) super.in(column, values);}return this;}public QueryWrapperX<T> eqIfPresent(String column, Object val) {if (val != null) {return (QueryWrapperX<T>) super.eq(column, val);}return this;}public QueryWrapperX<T> neIfPresent(String column, Object val) {if (val != null) {return (QueryWrapperX<T>) super.ne(column, val);}return this;}public QueryWrapperX<T> gtIfPresent(String column, Object val) {if (val != null) {return (QueryWrapperX<T>) super.gt(column, val);}return this;}public QueryWrapperX<T> geIfPresent(String column, Object val) {if (val != null) {return (QueryWrapperX<T>) super.ge(column, val);}return this;}public QueryWrapperX<T> ltIfPresent(String column, Object val) {if (val != null) {return (QueryWrapperX<T>) super.lt(column, val);}return this;}public QueryWrapperX<T> leIfPresent(String column, Object val) {if (val != null) {return (QueryWrapperX<T>) super.le(column, val);}return this;}public QueryWrapperX<T> betweenIfPresent(String column, Object val1, Object val2) {if (val1 != null && val2 != null) {return (QueryWrapperX<T>) super.between(column, val1, val2);}if (val1 != null) {return (QueryWrapperX<T>) ge(column, val1);}if (val2 != null) {return (QueryWrapperX<T>) le(column, val2);}return this;}public QueryWrapperX<T> betweenIfPresent(String column, Object[] values) {if (values!= null && values.length != 0 && values[0] != null && values[1] != null) {return (QueryWrapperX<T>) super.between(column, values[0], values[1]);}if (values!= null && values.length != 0 && values[0] != null) {return (QueryWrapperX<T>) ge(column, values[0]);}if (values!= null && values.length != 0 && values[1] != null) {return (QueryWrapperX<T>) le(column, values[1]);}return this;}// ========== 重寫父類方法,方便鏈式調用 ==========@Overridepublic QueryWrapperX<T> eq(boolean condition, String column, Object val) {super.eq(condition, column, val);return this;}@Overridepublic QueryWrapperX<T> eq(String column, Object val) {super.eq(column, val);return this;}@Overridepublic QueryWrapperX<T> orderByDesc(String column) {super.orderByDesc(true, column);return this;}@Overridepublic QueryWrapperX<T> last(String lastSql) {super.last(lastSql);return this;}@Overridepublic QueryWrapperX<T> in(String column, Collection<?> coll) {super.in(column, coll);return this;}
}

一、核心作用

1. 聯表查詢支持

  • 避免空值條件拼接:自動跳過值為空的查詢條件,防止生成 WHERE column = null 的低效 SQL
  • MyBatis-Plus Join 擴展:提供基于 Lambda 的聯表查詢能力,彌補 MyBatis Plus 原生不支持聯表的缺陷。
  • 類型安全:通過 SFunction<T, ?> 泛型 Lambda 表達式引用實體字段,避免硬編碼字段名。

2. 鏈式 API 設計

// 示例:聯表查詢用戶和部門信息
new MPJLambdaWrapper<UserDO>().selectAll(UserDO.class).select(DepartmentDO::getName, "deptName").leftJoin(DepartmentDO.class, DepartmentDO::getId, UserDO::getDeptId).eq(UserDO::getStatus, 0);

二、擴展點

1. 條件空值安全(核心增強)

通過 xxxIfPresent 方法實現 空值自動跳過,避免無效條件拼接。

方法作用示例代碼
eqIfPresent值非空時添加 eq 條件wrapper.eqIfPresent(UserDO::getName, name)
inIfPresent集合非空時添加 in 條件wrapper.inIfPresent(UserDO::getRoleIds, roleIds)
betweenIfPresent區間值有效時添加 between 條件wrapper.betweenIfPresent(UserDO::getCreateTime, start, end)

2. 鏈式調用增強

重寫父類方法(如 eq, select)返回子類類型,保持鏈式調用連貫性:

public MPJLambdaWrapperX<T> eq(SFunction<X, ?> column, Object val) {super.eq(column, val);return this; // 返回 MPJLambdaWrapperX 類型而非父類
}
@Override
public LambdaQueryWrapperX<T> eq(SFunction<T, ?> column, Object val) {super.eq(column, val);return this;
}

3. 智能區間處理

betweenIfPresent 方法支持 單邊區間 自動轉換:

// 當 val2 為空時,轉換為 ge 條件
wrapper.betweenIfPresent(UserDO::getCreateTime, startTime, null);
// 生成 SQL:WHERE create_time >= startTime

三、設計模式分析

1. 裝飾器模式(Decorator Pattern)

  • 表現:MPJLambdaWrapperX 在 MPJLambdaWrapper 基礎上增強功能(如空值安全),而非直接修改父類。
  • 優勢:符合開閉原則,MyBatis-Plus Join 升級時只需調整父類引用。

2. 模板方法模式(Template Method Pattern)

  • 表現:xxxIfPresent 方法封裝了空值判斷邏輯,子類只需調用父類條件方法。
public MPJLambdaWrapperX<T> eqIfPresent(SFunction<T, ?> column, Object val) {if (ObjectUtil.isNotEmpty(val)) {return (MPJLambdaWrapperX<T>) super.eq(column, val); // 調用父類方法}return this;
}public LambdaQueryWrapperX<T> eqIfPresent(SFunction<T, ?> column, Object val) {if (ObjectUtil.isNotEmpty(val)) {return (LambdaQueryWrapperX<T>) super.eq(column, val); // 調用父類方法}return this;
}

四、典型使用場景

1. 動態查詢條件構建

public List<UserDO> getUsers(String name, Integer status, LocalDateTime startTime) {return joinMapper.selectJoinList(new MPJLambdaWrapperX<UserDO>().eqIfPresent(UserDO::getName, name)       // name 為空時不拼接.eqIfPresent(UserDO::getStatus, status)   // status 為空時不拼接.geIfPresent(UserDO::getCreateTime, startTime).leftJoin(DepartmentDO.class, ...));
}

2. 復雜聯表查詢

wrapper.selectAll(UserDO.class).selectAs(DepartmentDO::getName, UserRespVO::getDeptName).leftJoin(DepartmentDO.class, DepartmentDO::getId, UserDO::getDeptId).inIfPresent(UserDO::getRoleIds, roleIds);

3. 區間查詢優化

// 處理可能不完整的區間參數
wrapper.betweenIfPresent(UserDO::getCreateTime, params.getStartTime(), params.getEndTime());

五、與原生 MyBatis Plus 對比

特性MyBatis Plus QueryWrapperQueryWrapperXMPJLambdaWrapperXMyBatis Plus LambdaQueryWrapperLambdaQueryWrapperX
聯表支持不支持不支持支持 LEFT/INNER JOIN不支持不支持
字段引用字符串字段名(如 “name”)字符串字段名(如 “name”)Lambda 表達式(如 UserDO::getName)Lambda 表達式(如 UserDO::getName)Lambda 表達式(如 UserDO::getName)
空值處理需手動判空內置 xxxIfPresent 方法內置 xxxIfPresent 方法自動處理內置 xxxIfPresent 方法自動處理內置 xxxIfPresent 方法自動處理
類型安全容易拼寫錯誤容易拼寫錯誤編譯期檢查字段是否存在編譯期檢查字段是否存在編譯期檢查字段是否存在

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899697.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899697.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899697.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

05-031-自考數據結構(20331)- 哈希表 - 例題分析

哈希表考題主要涵蓋四大類型:1)函數設計類(如除留余數法計算地址,需掌握質數p的選擇技巧);2)沖突處理類(線性探測法要解決堆積現象,鏈地址法需繪制鏈表結構);3)性能分析類(重點計算ASL,理解裝填因子α的影響規律);4)綜合應用類(如設計ISBN查詢系統,需結合實際問…

rustdesk 自建服務器 key不匹配

請確保id_ed25519文件的權限為&#xff1a; -rw------- 1 root root 88 Apr 31 10:02 id_ed25519在rustdesk安裝目錄執行命令&#xff1a; chmod 700 id_ed25519

Dify 深度集成 MCP實現災害應急響應

一、架構設計 1.1 分層架構 #mermaid-svg-5dVNjmixTX17cCfg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5dVNjmixTX17cCfg .error-icon{fill:#552222;}#mermaid-svg-5dVNjmixTX17cCfg .error-text{fill:#552222…

AI與.NET技術實操系列(三):在 .NET 中使用大語言模型(LLMs)

1. 引言 在技術迅猛發展的今天&#xff0c;大語言模型&#xff08;Large Language Models, LLMs&#xff09;已成為人工智能領域的核心驅動力之一。從智能對話系統到自動化內容生成&#xff0c;LLMs的應用正在深刻改變我們的工作與生活方式。對于.NET開發者而言&#xff0c;掌…

一個極簡的詞法分析器實現

文章目錄 推薦&#xff1a;Tiny Lexer - 一個極簡的C語言詞法分析器特點核心代碼實現學習價值擴展建議 用Java實現一個簡單的詞法分析器完整實現代碼代碼解析示例輸出擴展建議 用Go實現極簡詞法分析器完整實現代碼代碼解析示例輸出擴展建議 最近兩天搞一個DSL&#xff0c;不得不…

強制用戶裸奔,微軟封鎖唯一后門操作

周末剛結束&#xff0c;那個常年將「用戶為中心」掛嘴邊的微軟又雙叒叕開始作妖&#xff01; 不錯&#xff0c;大伙兒今后可能再沒法通過「OOBE\BYPASSNRO」命令繞過微軟強制聯網要求了。 熟悉 Windows 11 操作系統的都知道&#xff0c;除硬件上諸多限制外&#xff1b; 軟件層…

大模型備案:攔截關鍵詞列表與敏感詞庫深度解析

隨著《生成式人工智能服務管理暫行辦法》正式實施&#xff0c;大模型上線備案成為企業合規運營的核心環節。其中&#xff0c;敏感詞庫建設與攔截關鍵詞列表管理直接關系內容安全紅線&#xff0c;今天我們就來詳細解析一下大模型備案的這一部分&#xff0c;希望對想要做備案的朋…

快速上手Linux系統輸入輸出

一、管理系統中的輸入輸出 1.什么是重定向&#xff1f; 將原本要輸出到屏幕上的內容&#xff0c;重新輸入到其他設備中或文件中 重定向類型包括 輸入重定向輸出重定向 2.輸入重定向 指定設備&#xff08;通常是文件或命令的執行結果&#xff09;來代替鍵盤作為新的輸入設…

文小言全新升級!多模型協作與智能語音功能帶來更流暢的AI體驗

文小言全新升級&#xff01;多模型協作與智能語音功能帶來更流暢的AI體驗 在3月31日的百度AI DAY上&#xff0c;文小言正式宣布了一系列令人興奮的品牌煥新與功能升級。此次更新不僅帶來了全新的品牌視覺形象&#xff0c;更讓文小言在智能助手的技術和用戶體驗方面邁上了一個新…

C++基礎算法(插入排序)

1.插入排序 插入排序&#xff08;Insertion Sort&#xff09;介紹&#xff1a; 插入排序是一種簡單直觀的排序算法&#xff0c;它的工作原理類似于我們整理撲克牌的方式。 1.基本思想 插入排序的基本思想是&#xff1a; 1.將數組分為已排序和未排序兩部分 2.每次從未排序部分…

k近鄰算法K-Nearest Neighbors(KNN)

算法核心 KNN算法的核心思想是“近朱者赤&#xff0c;近墨者黑”。對于一個待分類或預測的樣本點&#xff0c;它會查找訓練集中與其距離最近的K個樣本點&#xff08;即“最近鄰”&#xff09;。然后根據這K個最近鄰的標簽信息來對當前樣本進行分類或回歸。 在分類任務中&#…

【Feign】??使用 openFeign 時傳遞 MultipartFile 類型的參數參考

&#x1f4a5;&#x1f4a5;????歡迎閱讀本文章????&#x1f4a5;&#x1f4a5; &#x1f3c6;本篇文章閱讀大約耗時三分鐘。 ??motto&#xff1a;不積跬步、無以千里 &#x1f4cb;&#x1f4cb;&#x1f4cb;本文目錄如下&#xff1a;&#x1f381;&#x1f381;&a…

zk基礎—1.一致性原理和算法二

大綱 1.分布式系統特點 2.分布式系統的理論 3.兩階段提交Two-Phase Commit(2PC) 4.三階段提交Three-Phase Commit(3PC) 5.Paxos島的故事來對應ZooKeeper 6.Paxos算法推導過程 7.Paxos協議的核心思想 8.ZAB算法簡述 6.Paxos算法推導過程 (1)Paxos的概念 (2)問題描述 …

216. 組合總和 III 回溯

目錄 問題描述 解決思路 關鍵點 代碼實現 代碼解析 1. 初始化結果和路徑 2. 深度優先搜索&#xff08;DFS&#xff09; 3. 遍歷候選數字 4. 遞歸與回溯 示例分析 復雜度與優化 回溯算法三部曲 1. 路徑選擇&#xff1a;記錄當前路徑 2. 遞歸探索&#xff1a;進入下…

從AI大模型到MCP中臺:構建下一代智能服務的核心架構

從AI大模型到MCP中臺&#xff1a;構建下一代智能服務的核心架構 引言&#xff1a;AI大模型帶來的服務重構革命 在ChatGPT掀起全球AI熱潮的今天&#xff0c;大模型展現出的驚人能力正在重塑整個軟件服務架構。但鮮為人知的是&#xff0c;真正決定AI服務成敗的不僅是模型本身&a…

美團小程序 mtgsig1.2 拼好飯案例 分析 mtgsig

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向分析 美團網頁、小程序、app全是指…

【大模型基礎_毛玉仁】5.5 模型編輯應用

目錄 5.5 模型編輯應用5.5.1 精準模型更新5.5.2 保護被遺忘權5.5.3 提升模型安全 5.5 模型編輯應用 大語言模型面臨更新成本高、隱私保護難、安全風險大等問題。模型編輯技術&#xff1a; 通過細粒度修改預訓練模型&#xff0c;避免從頭訓練&#xff0c;降低更新成本&#xff…

揭秘:父子組件之間的傳遞

基礎知識 組件與組件之間有三大方面的知識點&#xff1a; 子組件通過props defineProps&#xff08;{}&#xff09;接收父組件傳遞到參數和方法&#xff1b;子組件可以通過定義 emit 事件&#xff0c;向父組件發送事件&#xff1b;父組件調用子組件通過defineExpose 導出的方法…

微前端實現方案對比Qiankun VS npm組件

架構層面&#xff1a; 1、Qiankun是典型的微前端架構&#xff0c;側重構建多個獨立前端應用協同工作的架構&#xff0c;主應用負責自用用的加載、卸載和通信&#xff1b;子應用不限制&#xff0c;可以是VUE、React等&#xff1b; 2、Qiankun松耦合&#xff0c;各個自應用獨立…

可編輯160頁PPT | 營銷流程和管理數字化轉型規劃

薦言分享&#xff1a;隨著技術的發展和消費者行為的變化&#xff0c;傳統營銷方式已難以滿足現代企業的需求。企業需要借助數字化手段&#xff0c;對營銷流程進行全面梳理和優化&#xff0c;提升營銷活動的精準度和效率。同時&#xff0c;通過數字化營銷管理&#xff0c;企業可…