装饰器模式与模板方法模式实现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.mzph.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;企业可…