【Java开发】 Springboot集成Mybatis-Flex

1 Mybatis-Flex 介绍


1.1简介

        Mybatis-Flex 是一个优雅的 Mybatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper 亮点帮助我们极大的减少了 SQL 编写的工作的同时,减少出错的可能性。

1.2特征

        1.轻量:除了 MyBatis,没有任何第三方依赖、没有任何拦截器,在执行的过程中,没有任何的 Sql 解析(Parse)。 这带来了几个好处:极高的性能、极易对代码进行跟踪和调试、把控性更高。
        2.灵活:支持 Entity 的增删改查、以及分页查询的同时,MyBatis-Flex 提供了 Db + Row 工具,可以无需实体类对数据库进行增删改查以及分页查询。 与此同时,MyBatis-Flex 内置的 QueryWrapper 可以轻易的帮助我们实现 多表查询、链接查询、子查询 等等常见的 SQL 场景。
        3.强大:支持任意关系型数据库,还可以通过方言持续扩展,同时支持 多(复合)主键、逻辑删除、乐观锁配置、数据脱敏、数据审计、 数据填充 等等功能。


简单来说,Mybatis-Flex 相比 Mybatis-Plus 等框架 速度更快、功能更多、代码更简洁~

1.3Mybatis-Flex和同类框架对比

1)功能对比:

2)性能对比:
这里直接贴测试结果:

MyBatis-Flex 的查询单条数据的速度,大概是 MyBatis-Plus 的 5 ~ 10+ 倍。
MyBatis-Flex 的查询 10 条数据的速度,大概是 MyBatis-Plus 的 5~10 倍左右。
Mybatis-Flex 的分页查询速度,大概是 Mybatis-Plus 的 5~10 倍左右。
Mybatis-Flex 的数据更新速度,大概是 Mybatis-Plus 的 5~10+ 倍。

 

2 准备工作

官方文档:快速开始 - MyBatis-Flex

以 Spring Boot + Maven + Mysql 项目做演示

2.1 数据库中创建表及插入数据

此处省略~

2.2 Spring Boot 项目初始化

此时需要创建 Spring Boot 项目,并添加 Maven 依赖;此处我通过 IDEA 使用 Spring Initializer 快速初始化一个 Spring Boot 工程。

项目创建省略~

2.3 添加 Maven 主要依赖

往 pom.xml 文件中添加以下依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-spring-boot-starter</artifactId><version>1.7.3</version></dependency><dependency><groupId>com.mybatis-flex</groupId><artifactId>mybatis-flex-processor</artifactId><version>1.7.3</version><scope>provided</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--++++++++++++++++++++++++++++++++++++++++++++++++++++--><!-- MyBatis分页插件 --><!--++++++++++++++++++++++++++++++++++++++++++++++++++++--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.0</version><optional>true</optional></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency>

2.4 配置数据源

在 application.properties 或 application.yml 中配置数据源:


server.port=8999spring.application.name=mybatisPlusspring.datasource.username=root
spring.datasource.password=root3306
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3 Mybatis-Flex 实践

3.1 编写实体类和 Mapper 接口

📌 User 实体类

  • 使用 @Table("flex_user") 设置实体类与表名的映射关系
  • 使用 @Id(keyType = KeyType.Auto) 标识主键为自增
package com.mybatisflex.flex.domain;import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.util.Date;/** */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
//使用 @Table("tb_account") 设置实体类与表名的映射关系
@Table("user")
public class User implements Serializable {private Integer id;@Column(value = "name")private String name;@Column(value = "age")private Integer age;@Column(value = "email")private String email;@Column(value = "create_time", onInsertValue = "now()")private Date createTime;@Column(value = "update_time", onUpdateValue = "now()")private Date updateTime;@Column(value = "del_flag")private int delFlag;@Column(value = "dept_code")private String deptCode;
}

📌 Mapper 接口继承 BaseMapper 接口

package com.mybatisflex.flex.mapper;import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.flex.domain.User;/*** */
public interface UserMapper extends BaseMapper<User> {
}

3.2 在主启动类添加 @MapperScan 注解

用于扫描 Mapper 文件夹:

package com.mybatisflex.flex;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.mybatisflex.flex.mapper")
public class FlexApplication {public static void main(String[] args) {SpringApplication.run(FlexApplication.class, args);}}

3.3 创建service

package com.mybatisflex.flex.service;import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.update.UpdateChain;
import com.mybatisflex.flex.domain.User;
import com.mybatisflex.flex.domain.UserDto;
import com.mybatisflex.flex.domain.table.SysDeptTableDef;
import com.mybatisflex.flex.domain.table.UserTableDef;
import com.mybatisflex.flex.mapper.UserMapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;import java.util.List;/*** @Description:* @Date Create in 10:39 2023/11/22* @Modified By:*/@Service
public class UserService extends ServiceImpl<UserMapper, User> {/*** 查询全部* @return*/public List<User> selectAll(){return this.getMapper().selectAll();}public List<User> selectList(){QueryWrapper wrapper = QueryWrapper.create()// 这里可以指定查询字段.select()// sql from表名.from(User.class).where(User::getName).like("徐").or(UserTableDef.USER.ID.in(2,3).and(UserTableDef.USER.NAME.like("o")));return this.getMapper().selectListByQuery(wrapper);}/*** 根据userId获取User数据* @param userId* @return*/public User listById(Integer userId){QueryWrapper wrapper = QueryWrapper.create()// 这里可以指定查询字段.select()// sql from表名.from(User.class).where(User::getId).eq(userId).and(User::getName).like("徐");return this.getMapper().selectOneByQuery(wrapper);}/*** 关联查询--链式查询*/public List<UserDto> getInfo(Integer userId){QueryWrapper query = QueryWrapper.create().select(UserTableDef.USER.ALL_COLUMNS).select(SysDeptTableDef.SYS_DEPT.DEPT_NAME).from(UserTableDef.USER).as("u").leftJoin(SysDeptTableDef.SYS_DEPT).as("d").on(UserTableDef.USER.DEPT_CODE.eq(SysDeptTableDef.SYS_DEPT.DEPT_CODE)).where(UserTableDef.USER.ID.eq(userId));return this.getMapper().selectListByQueryAs(query,UserDto.class);}/*** 新增* @param user*/public void insert(User user){this.getMapper().insert(user);}/*** 更新User* @param user*/public void updateEntity(User user){this.getMapper().update(user);}/*** 局部更新* @param userId* @param userName*/public void updateRow(Integer userId, String userName){UpdateChain.of(User.class).set(User::getName, userName).where(User::getId).eq(userId).update();}/*** 删除* @param userName*/public void deleteByWrapper(String userName){QueryWrapper queryWrapper = QueryWrapper.create().where(User::getName).eq(userName);this.getMapper().deleteByQuery(queryWrapper);}}

3.4创建Controller接口测试

package com.mybatisflex.flex.controller;import com.mybatisflex.flex.domain.User;
import com.mybatisflex.flex.domain.UserDto;
import com.mybatisflex.flex.page.TableDataInfo;
import com.mybatisflex.flex.service.UserService;
import com.mybatisflex.flex.utils.ResponseUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;/*** @Author: best_liu* @Description:* @Date Create in 10:33 2023/11/22* @Modified By:*/
@RestController
@RequestMapping("/user")
public class SysUserController {@Resourceprivate UserService userService;/*** 查询全部* @return*/@GetMapping("listall")public List<User> listall(){return userService.selectAll();}/*** 分页查询* @return**/@GetMapping("/page")public TableDataInfo findPage() {ResponseUtils.startPage();return ResponseUtils.getDataTable(userService.selectAll());}/*** 按条件查询* @return*/@GetMapping("getList")public List<User> selectList(){return userService.selectList();}/*** 按userId查询* @return*/@GetMapping("listById")public User listById(){return userService.listById(0);}/*** 按userId关联查询部门* @return*/@GetMapping("getInfo")public List<UserDto> getInfo(){return userService.getInfo(0);}/*** 新增* @return*/@GetMapping("insert")public Boolean insert(){User user = User.builder().id(10).name("张三").age(100).email("zhangsan@163.com").build();userService.insert(user);return Boolean.TRUE;}/*** 更新* @return*/@GetMapping("update")public Boolean update(){userService.updateRow(10, "张三三");return Boolean.TRUE;}/*** 删除* @return*/@GetMapping("delete")public Boolean delete(){userService.deleteByWrapper("张三三");return Boolean.TRUE;}
}

4 链式查询

若想使用链式查询还得需要 APT 配置,MyBatis-Flex 使用了 APT(Annotation Processing Tool)技术,在项目编译的时候,会自动根据 Entity/pojo 类定义的字段帮你生成 "USER" 类(可用于链式查询)

通过开发工具构建项目(如下图),或者执行 maven 编译命令: mvn clean package 都可以自动生成。

正常情况下,会在 target 包下生成如下资源

若生成该资源并导入成功,那么此时,可使用链式查询

/*** 关联查询*/public List<UserDto> getInfo(Integer userId){QueryWrapper query = QueryWrapper.create().select(UserTableDef.USER.ALL_COLUMNS).select(SysDeptTableDef.SYS_DEPT.DEPT_NAME).from(UserTableDef.USER).as("u").leftJoin(SysDeptTableDef.SYS_DEPT).as("d").on(UserTableDef.USER.DEPT_CODE.eq(SysDeptTableDef.SYS_DEPT.DEPT_CODE)).where(UserTableDef.USER.ID.eq(userId));return this.getMapper().selectListByQueryAs(query,UserDto.class);}

总的来说,MyBatis-Flex 的链式查询相比 MyBatis-Plus 多了一步配置环节,目前来看其他步骤类似。

MyBatis-Flex/Plus 代码对比

接下来看一下MyBatis-Flex  MyBatis-Plus 各部分功能代码的差别,Employee、Account、Article 都是实体类。

5.1 基础查询

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create().where(EMPLOYEE.LAST_NAME.like(searchWord)) //条件为null时自动忽略.and(EMPLOYEE.GENDER.eq(1)).and(EMPLOYEE.AGE.gt(24));
List<Employee> employees = employeeMapper.selectListByQuery(query);

MyBatis-Plus:

QueryWrapper<Employee> queryWrapper = Wrappers.query().like(searchWord != null, "last_name", searchWord).eq("gender", 1).gt("age", 24);
List<Employee> employees = employeeMapper.selectList(queryWrapper);//lambda 写法:
LambdaQueryWrapper<Employee> queryWrapper = Wrappers.<Employee>lambdaQuery().like(StringUtils.isNotEmpty(searchWord), Employee::getUserName,"B").eq(Employee::getGender, 1).gt(Employee::getAge, 24);
List<Employee> employees = employeeMapper.selectList(queryWrapper);

5.2 集合查询

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create().select(ACCOUNT.ID,ACCOUNT.USER_NAME,max(ACCOUNT.BIRTHDAY),avg(ACCOUNT.SEX).as("sex_avg"));
List<Employee> employees = employeeMapper.selectListByQuery(query);

MyBatis-Plus:

QueryWrapper<Employee> queryWrapper = Wrappers.query().select("id","user_name","max(birthday)","avg(birthday) as sex_avg");
List<Employee> employees = employeeMapper.selectList(queryWrapper);

缺点:字段硬编码,容易拼错。无法使用 IDE 的字段进行重构,无法使用 IDE 自动提示,发生错误不能及时发现,不过MyBatis-Plus的 lambdawrapper 也是能解决这个问题。

5.3 and(...) 和 or(...)

假设我们要构建如下的 SQL 进行查询(需要在 SQL 中添加括号)。

SELECT * FROM tb_account
WHERE id >= 100
AND (sex = 1 OR sex = 2)
OR (age IN (18,19,20) AND user_name LIKE "%michael%" )

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create().where(ACCOUNT.ID.ge(100)).and(ACCOUNT.SEX.eq(1).or(ACCOUNT.SEX.eq(2))).or(ACCOUNT.AGE.in(18, 19, 20).and(ACCOUNT.USER_NAME.like("michael")));

MyBatis-Plus:

QueryWrapper<Employee> query = Wrappers.query().ge("id", 100).and(i -> i.eq("sex", 1).or(x -> x.eq("sex", 2))).or(i -> i.in("age", 18, 19, 20).like("user_name", "michael"));
// or lambda
LambdaQueryWrapper<Employee> query = Wrappers.<Employee>lambdaQuery().ge(Employee::getId, 100).and(i -> i.eq(Employee::getSex, 1).or(x -> x.eq(Employee::getSex, 2))).or(i -> i.in(Employee::getAge, 18, 19, 20).like(Employee::getUserName, "michael"));

5.4 多表查询

MyBatis-Flex:

QueryWrapper query = QueryWrapper.create().select().from(ACCOUNT).leftJoin(ARTICLE).on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID)).where(ACCOUNT.AGE.ge(10));List<Account> accounts = mapper.selectListByQuery(query);
QueryWrapper query = new QueryWrapper()
.select(ACCOUNT.ID, ACCOUNT.USER_NAME, ARTICLE.ID.as("articleId"), ARTICLE.TITLE)
.from(ACCOUNT.as("a"), ARTICLE.as("b"))
.where(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID));

MyBatis-Plus:不支持

5.5 部分字段更新

假设一个实体类 Account 中,我们要更新其内容如下:

  • userName 为 "michael"
  • age 为 "18"
  • birthday 为 null

其他字段保持数据库原有内容不变,要求执行的 SQL 如下:

update tb_account
set user_name = "michael", age = 18, birthday = null
where id = 100

MyBatis-Flex 代码如下:

Account account = UpdateEntity.of(Account.class);
account.setId(100); //设置主键
account.setUserName("michael");
account.setAge(18);
account.setBirthday(null);accountMapper.update(account);

MyBatis-Plus 代码如下(或可使用 MyBatis-Plus 的 LambdaUpdateWrapper,但性能没有 UpdateWrapper 好):

UpdateWrapper<Account> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", 100);
updateWrapper.set("user_name", "michael");
updateWrapper.set("age", 18);
updateWrapper.set("birthday", null);accountMapper.update(null, updateWrapper);

如上,MyBatis-Flex 在代码编写来说更加灵活,编写方式更多一些,还是有些优势。

源码地址:https://download.csdn.net/download/askuld/88561026 

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

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

相关文章

cocos2dx ​​Animate3D(二)

Twirl 扭曲旋转特效 // 持续时间(时间过后不会回到原来的样子) // 整个屏幕被分成几行几列 // 扭曲中心位置 // 扭曲的数量 // 振幅 static Twirl* create(float duration, const Size& gridSize, const Vec2& position, unsigned int twirls, float amplitude)…

基于springboot实现摄影跟拍预定管理系统【项目源码+论文说明】计算机毕业设计

基于springboot实现摄影跟拍预定管理系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要…

【2018年数据结构真题】

方法一 给定一个含n(n>1)个整数的数组&#xff0c;请设计一个在时间上尽可能高效的算法&#xff0c;找出数组中未出现的最小正整数。例如&#xff0c;数组{-5&#xff0c;3&#xff0c;2&#xff0c;3}中未出现的最小正整数是1&#xff1b;数组{1&#xff0c;2&#xff0c;…

AIGC变革BI行业,永洪发布vividime全球化品牌

大数据产业创新服务媒体 ——聚焦数据 改变商业 国内BI商业智能市场&#xff0c;一直有着“内永洪&#xff0c;外Tableau”的说法。成立于2012年的永洪科技经过十多年的发展&#xff0c;早已崛起为国内大数据行业的一支劲旅。 ChatGPT火爆出圈之后&#xff0c;AIGC快速渗透&am…

【C++】vector的介绍与使用

&#x1f9d1;‍&#x1f393;个人主页&#xff1a;简 料 &#x1f3c6;所属专栏&#xff1a;C &#x1f3c6;个人社区&#xff1a;越努力越幸运社区 &#x1f3c6;简 介&#xff1a;简料简料&#xff0c;简单有料~在校大学生一枚&#xff0c;专注C/C/GO的干货分…

【Java 进阶篇】Redis 数据结构:轻松驾驭多样性

引言 Redis是一款强大的键值对存储系统&#xff0c;其数据结构的多样性是其引以为傲的特点之一。在这篇博客中&#xff0c;我们将深入探讨Redis的主要数据结构&#xff0c;包括字符串、哈希表、列表、集合和有序集合&#xff0c;并通过实例代码演示它们的用法。 1. 字符串&am…

在中国企业出海的大浪潮下,亚马逊云科技提供遍及全球的基础设施和技术支持

中国技术出海是中国企业更高层次更高质量的全球化。在人类文明发展史上&#xff0c;凝聚中国古人智慧结晶的造纸术、印刷术、火药、指南针等&#xff0c;曾为中国技术出海写下过浓墨重彩的一笔。在今天&#xff0c;如金山办公、店匠科技、ADVANCE.AI等公司又以技术立业&#xf…

msvcp140.dll是什么?msvcp140.dll丢失的有哪些解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复丢失的msvcp140.dll文件。本文将详细介绍5个解决msvcp140.dl…

Day27|Leetcode 39. 组合总和 Leetcode 40. 组合总和 II Leetcode131. 分割回文串

Leetcode 39. 组合总和 题目链接 39 组合总和 本题目和前面的组合问题差不多&#xff0c;只不过这里能重复选取数字&#xff0c;还是要注意组合的定义&#xff0c;交换数字顺序还是算一个组合&#xff0c;所以这里还是用我们的startIndex来记录取的数字到哪里了&#xff0c;下…

阿里云发送短信

官方代码如下&#xff1a; // This file is auto-generated, dont edit it. Thanks. package com.aliyun.sample;import com.aliyun.tea.*;public class Sample {/*** 使用AK&SK初始化账号Client* param accessKeyId* param accessKeySecret* return Client* throws Excep…

【电子通识】USB3.0和USB2.0有什么区别?

版本 USB2.0是2000年4月27日由USB-IF组织提出了USB2.0总线协议规范。 USB3.0是2008年11月17日由USB-IF组织提出了超高速USB3.0规范。 图标对比 USB2.0的标志就是和USB1.1的标志基本上没啥区别&#xff0c;还是以前的那个样子&#xff0c;使用黑色颜色用标识 USB3.0它有一个S…

计算机毕业设计 基于微信小程序的“共享书角”图书借还管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

pycurl>=7.43.0.5机器学习环境配置问题

去官网下载对应版本.whl文件&#xff0c;注意使用python --version提前查看 python版本信息和64bit还是32bit,下载对应版本。 cd 到该路径下&#xff0c;并pip。6

opengl制作天空盒

首先创建顶点数组 unsigned int m_uiVaoBufferID; glGenVertexArrays(1, &m_uiVaoBufferID); 然后创建顶点缓冲区 float skyboxVertices[] {// positions-1.0f, 1.0f, -1.0f,-1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f,1.0f, 1.0f, -1.0f,-1.0f, 1.…

使用gin 代理 web网页

问web项目的代理&#xff0c;业界常用的方案是nginx做代理&#xff0c;这个是网上最多资料的。 因为我需要做自己的流量转发&#xff0c;也就是所有访问都要经过我的一个流量分发微服务&#xff0c;这和nginx作用冲突了。如果再加个nginx来做第一层方向代理和网页的静态资源代…

【C++干货铺】list的使用 | 模拟实现

个人主页点击直达&#xff1a;小白不是程序媛 C专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 list的介绍及使用 list的介绍 list的使用 list的构造 list迭代器的使用 list的增删查改 list的模拟实现 结点的封装 迭代器的封装 list成员变量 构造函数 …

【大数据Hive】hive 优化策略之job任务优化

目录 一、前言 二、hive执行计划 2.1 hive explain简介 2.1.1 语法格式 2.1.2 查询计划阶段说明 2.2 操作演示 2.2.1 不加条件的查询计划分析 2.2.2 带条件的查询计划分析 三、MapReduce属性优化 3.1 本地模式 3.1.1 本地模式参数设置 3.1.2 本地模式操作演示 3.2 …

每日一题:LeetCode-589.N叉树的前序遍历

每日一题系列&#xff08;day 01&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

7种SQL的进阶用法

1.自定义排序&#xff08;ORDER BY FIELD&#xff09; 在MySQL中ORDER BY排序除了可以用ASC和DESC之外&#xff0c;还可以使用自定义排序方式来实现。 CREATE TABLE movies ( id INT PRIMARY KEY AUTO_INCREMENT, movie_name VARCHAR(255), actors VARCHAR(255), price DEC…

基于鹈鹕算法优化概率神经网络PNN的分类预测 - 附代码

基于鹈鹕算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于鹈鹕算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于鹈鹕优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…