Springboot项目集成Mybatis-Plus,多数据源配置,写主读从

Mybatis-Plus简介

官网:Mybatis-Plus官网传送门

简介

MyBatis-Plus(简称MP),一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了诸如自动生成SQL、通用CRUD操作、分页插件、性能分析插件等功能,使得开发人员可以减少对于繁琐SQL编写的工作,提高代码的简洁性和可维护性。

常见用法
  • CRUD操作

    • 插入数据:使用insert方法。
    • 删除数据:根据主键ID删除使用deleteById方法,根据条件删除使用delete方法,批量删除使用deleteBatchIds方法。
    • 更新数据:根据主键ID更新使用updateById方法,根据条件更新使用update方法。
    • 查询数据:根据主键ID查询使用selectById方法,批量查询使用selectBatchIds方法,根据条件查询使用selectListselectPage方法。
  • 分页查询

    MyBatis-Plus提供了强大的分页插件,可以轻松实现分页查询。首先需要在配置类中启用分页插件,然后在查询方法中使用Page对象进行分页查询。

  • 性能分析

    MyBatis-Plus内置了性能分析插件,可以输出SQL语句及其执行时间,帮助开发人员快速定位慢查询。

  • 自定义全局通用操作

    MyBatis-Plus支持全局通用方法注入,可以在配置类中定义全局通用的方法,并在Mapper接口中直接使用。

常用注解

MyBatis-Plus中常用的注解主要包括以下几个:

  • @TableName
    • 用于指定实体类对应的数据库表名。
    • 当实体类名称与数据库表名不一致时,可以使用此注解进行映射。
  • @TableId
    • 用于标识实体类的主键字段。
    • 支持多种主键生成策略,如自增(IdType.AUTO)、手动输入(IdType.INPUT)、分布式全局唯一ID(IdType.ID_WORKER、IdType.ASSIGN_ID)等。
  • @TableField
    • 用于标识实体类中的字段与数据库表中的字段的映射关系。
    • 可以指定字段名、是否为数据库字段、自定义字段填充策略等。
    • 例如,可以使用@TableField(exist = false)表示该属性不为数据库表字段,但又是必须使用的;使用@TableField(condition = SqlCondition.LIKE)表示该属性可以模糊搜索。
  • @Version
    • 用于实现乐观锁功能。
    • 乐观锁是一种多用户并发控制的策略,通过版本号字段来实现数据的同步控制。
  • @TableLogic
    • 用于实现逻辑删除功能。
    • 逻辑删除是一种在数据库中标记数据为删除状态而不是物理删除的方式。
    • 使用此注解后,执行删除操作时会将逻辑删除字段修改为指定的值(默认为1),执行查询操作时会自动过滤掉逻辑删除的数据(默认为0)。
  • @EnumValue
    • 用于处理枚举字段。
    • 可以将枚举类的值映射到数据库表中的字段上。
  • @MapperScan
    • 用于扫描需要被MyBatis-Plus加载的Mapper接口。
    • 常用于在Spring Boot启动类上指定Mapper接口所在的包路径。
  • @Mapper
    • 作用于数据库中的实体类对应的Mapper接口上。
    • @MapperScan相比,@Mapper只能映射一个实体类对应的Mapper接口,而@MapperScan可以映射整个包下的Mapper接口。

这些注解极大地简化了MyBatis-Plus的使用,使得开发人员可以更加专注于业务逻辑的实现,而不需要花费大量时间在繁琐的SQL编写和数据库表结构映射上。同时,这些注解也提供了丰富的配置选项,以满足不同场景下的需求。

常见问题及优化方案
  • 查询性能问题

    • 当数据库中记录数量较大时,查询性能可能会受到影响。可以通过优化SQL语句、添加索引、使用分页查询等方式来提升查询性能。
    • 避免全表扫描和未加索引的查询条件。
  • 大数据量操作性能下降

    • 在大数据量插入、更新或删除操作时,SQL执行时间较长。可以通过批量操作、关闭自动填充功能等方式来提升性能。
    • 使用MyBatis-Plus提供的批量插入、批量更新方法。
  • 分页查询问题

    • 确保分页查询中传入了正确的分页参数,否则可能会导致返回全量数据。
    • 合理使用MyBatis-Plus提供的分页插件和Page对象进行分页查询。
  • 过度依赖通用方法

    • MyBatis-Plus提供了大量的通用CRUD方法,但开发者容易过度依赖这些方法,导致在某些复杂场景下生成的SQL不够优化。
    • 在复杂查询场景下,可以使用XML文件或注解方式编写定制SQL语句。

Springboot项目集成Mybatis-Plus

场景

Spring Boot项目中集成MyBatis-Plus,并实现多数据源配置 ,读写分离。

jdk及主要依赖版本说明

jdk:1.8

springboot:2.6.4

mybatis-plus:3.5.7

mysql-connector:6.0.6

项目依赖

首先,在pom.xml文件中添加必要的依赖,包括Spring Boot的启动器、MyBatis-Plus的启动器、数据库连接池(如Druid)以及MySQL的驱动等

<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis-Plus Starter --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mp.version}</version></dependency><!-- Druid DataSource Starter --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><!-- MySQL Connector --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-connector.version}</version></dependency><!-- MyBatis-Plus Dynamic DataSource Spring Boot Starter (可选,用于简化多数据源配置) --><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${dynamic-datasource.version}</version></dependency>
</dependencies>
配置文件

application.ymlapplication.properties文件中配置多数据源的信息,包括主数据源(写)和从数据源(读)。

spring:datasource:dynamic:primary: master # 设置默认的数据源为主数据源datasource:master: # 主数据源配置url: jdbc:mysql://localhost:3306/master_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourceslave_1: # 从数据源配置(可以有多个从数据源)url: jdbc:mysql://localhost:3306/slave_db_1?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource
数据源配置类

如果没有使用dynamic-datasource-spring-boot-starter,则需要手动配置数据源。以下是一个示例配置类:

@Configuration
public class DataSourceConfig {@Primary@Bean(name = "masterDataSource")@ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.master")public DataSource masterDataSource() {return DataSourceBuilder.create().build();}@Bean(name = "slaveDataSource")@ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.slave_1")public DataSource slaveDataSource() {return DataSourceBuilder.create().build();}// 配置数据源路由等逻辑(如果使用动态数据源则不需要手动配置)
}

但如果你使用了dynamic-datasource-spring-boot-starter,则上述配置类可以省略,因为它会自动根据配置文件加载数据源。

使用@DS注解指定数据源

在Service层的方法或类上使用@DS注解来指定使用哪个数据源。默认情况下,会使用主数据源;如果需要读取操作使用从数据源,可以在方法上指定@DS("slave_1")

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;// 默认使用主数据源(写操作)public void addUser(User user) {userMapper.insert(user);}// 指定使用从数据源(读操作)@DS("slave_1")public List<User> getUsers() {return userMapper.selectList(null);}
}
Mapper接口与实体类

创建Mapper接口和对应的实体类,这些类通常与MyBatis-Plus的单数据源配置相同。

// User实体类
public class User {private Long id;private String name;// 其他字段...// getters and setters...
}// UserMapper接口
public interface UserMapper extends BaseMapper<User> {// 可以添加自定义的Mapper方法(如果需要)
}
启动类

在Spring Boot的启动类上添加@MapperScan注解来扫描Mapper接口。

@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
测试与验证

启动Spring Boot应用程序,并通过Controller层调用Service层的方法,验证写主读从的数据源切换是否生效。

生产环境配置样例

在生产环境中配置多数据源信息时,需要特别注意配置的准确性、安全性以及可维护性。以下是一个相对合理的application.yml配置样例,以及配置时需要注意的关键点:(或许有坑,仅供参考)

spring:datasource:dynamic:primary: master # 设置默认的数据源为主数据源strict: true # 严格匹配数据源,未匹配到指定数据源时抛异常datasource:master: # 主数据源配置url: jdbc:mysql://db-master.example.com:3306/master_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=falseusername: master_userpassword: ENC(encrypted_master_password) # 使用加密后的密码(如使用Jasypt等加密工具)driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcedruid:initial-size: 5min-idle: 5max-active: 20max-wait: 60000time-between-eviction-runs-millis: 60000min-evictable-idle-time-millis: 300000validation-query: SELECT 1 FROM DUALtest-while-idle: truetest-on-borrow: falsetest-on-return: falsepool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20stat-view-servlet:enabled: truefilter:stat:log-slow-sql: trueslow-sql-millis: 2000slave_1: # 从数据源配置(可以有多个从数据源)url: jdbc:mysql://db-slave1.example.com:3306/slave_db_1?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=falseusername: slave_user_1password: ENC(encrypted_slave_password_1) # 使用加密后的密码driver-class-name: com.mysql.cj.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource# 可以根据需要从druid配置中复制相关配置项
配置时需要注意的关键点
  • 数据源URL
    • 确保数据库URL正确无误,包括IP地址、端口号、数据库名以及必要的连接参数。
    • 在生产环境中,通常不会使用localhost,而是使用实际的数据库服务器地址。
  • 数据库用户名和密码
    • 使用具有适当权限的数据库用户。
    • 密码应使用加密工具进行加密存储,避免明文密码泄露。
  • 驱动类名称
    • 确保使用与数据库版本相匹配的JDBC驱动类。
  • 连接池配置
    • 根据实际业务需求配置连接池的大小,包括初始大小、最小空闲连接数、最大活跃连接数等。
    • 配置连接池的其他相关参数,如连接验证查询、空闲连接测试、连接泄漏检测等。
  • 安全性
    • 避免在配置文件中存储敏感信息,如明文密码。
    • 使用加密工具对敏感信息进行加密存储。
    • 确保配置文件具有适当的访问权限,防止未经授权的访问。
  • 可维护性
    • 使用易于理解和维护的配置格式,如YAML或Properties。
    • 对配置项进行注释,说明其用途和取值范围。
    • 将配置文件与代码库分离,以便进行版本控制和审计。
  • 数据源切换
    • 确保在代码中正确使用数据源切换注解或逻辑,以实现读写分离。
    • 对数据源切换进行充分的测试,以确保其正确性和可靠性。
  • 监控和日志
    • 配置数据源监控和日志记录,以便及时发现和解决数据库连接问题。
    • 监控数据库连接池的使用情况,包括连接数、活动连接数、空闲连接数等。

通过以上配置和注意事项,可以在生产环境中实现多数据源的安全、可靠和高效配置。

如何在Mybatis-Plus中执行自定义sql

在MyBatis-Plus中执行自定义SQL主要有两种方式:使用XML映射文件和注解方式。

使用XML映射文件
步骤:
  1. 创建Mapper接口:定义一个Mapper接口,这个接口可以继承BaseMapper(如果你还需要使用MyBatis-Plus提供的通用方法),也可以不继承。

  2. 编写XML映射文件:在resources/mapper目录下创建一个与Mapper接口同名的XML文件。在这个XML文件中,你可以编写自定义的SQL语句。

  3. 在Mapper接口中定义方法:这些方法的名字和参数需要与XML文件中的SQL语句相匹配。

  4. 配置MyBatis-Plus:确保你的MyBatis-Plus配置正确,能够扫描到你的Mapper接口和XML文件。

示例:

Mapper接口:

public interface UserMapper {// 自定义查询方法List<User> selectUsersByCondition(@Param("condition") String condition);
}

XML映射文件(UserMapper.xml):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"><select id="selectUsersByCondition" resultType="com.example.entity.User">SELECT * FROM tb_user WHERE some_column LIKE CONCAT('%', #{condition}, '%')</select></mapper>
使用注解方式
步骤:
  1. 创建Mapper接口:直接在Mapper接口的方法上使用MyBatis提供的注解(如@Select@Update@Insert@Delete等)来编写SQL语句。

  2. 配置MyBatis-Plus:确保你的MyBatis-Plus配置正确,能够扫描到你的Mapper接口。

示例:

Mapper接口:

public interface UserMapper extends BaseMapper<User> {// 自定义查询方法,使用注解方式@Select("SELECT * FROM tb_user WHERE some_column LIKE CONCAT('%', #{condition}, '%')")List<User> selectUsersByCondition(@Param("condition") String condition);
}
注意事项
  • 当使用XML映射文件时,确保XML文件的命名和位置正确,并且与Mapper接口在同一命名空间中。
  • 当使用注解方式时,确保注解中的SQL语句正确,并且参数占位符与方法参数相匹配。
  • 在Spring Boot项目中,通常不需要手动配置MyBatis-Plus的Mapper扫描路径,因为可以通过@MapperScan注解在启动类上指定扫描路径。
  • 如果你的Mapper接口继承了BaseMapper,那么你仍然可以在接口中定义自定义方法,这些方法不会与BaseMapper中的方法冲突。

通过以上两种方式,你可以在MyBatis-Plus中灵活地执行自定义SQL语句,以满足不同业务场景的需求。

SqlRunner

在MyBatis-Plus中,如果不使用XML和注解来执行自定义SQL语句,实际上是比较受限的,因为MyBatis-Plus的设计初衷就是为了简化CRUD操作,并提供了一套强大的条件构造器来生成动态SQL。然而,仍然有一些方法可以间接地实现自定义SQL的执行,但通常这些方法并不是MyBatis-Plus推荐的主流做法。

一种可能的方法是使用MyBatis-Plus提供的SqlRunner类(如果版本支持的话),这个类允许你直接执行原生SQL语句。但请注意,这种方法可能并不是所有版本的MyBatis-Plus都支持,而且它通常用于执行一些较为简单的SQL操作,比如查询、插入、更新和删除等。

以下是一个使用SqlRunner执行自定义SQL的示例(假设MyBatis-Plus支持此功能):

// 假设你要执行一个查询操作
String sql = "SELECT * FROM user WHERE name = ?";
List<User> users = SqlRunner.db().selectList(sql, "特定用户名");// 假设你要执行一个插入操作
String insertSql = "INSERT INTO user (name, age) VALUES (?, ?)";
SqlRunner.db().insert(insertSql, "新用户", 25);

配置文件中需要启用sql-runner

mybatis-plus:global-config:enable-sql-runner: true

然而,需要注意的是,SqlRunner类的使用可能并不是所有MyBatis-Plus项目中的标准做法,因为它绕过了MyBatis-Plus的Mapper接口和XML映射文件,直接执行了原生SQL。这可能会导致一些与MyBatis-Plus的ORM框架特性不兼容的问题,比如事务管理、缓存机制等

另外,如果你确实需要在MyBatis-Plus中执行复杂的自定义SQL,而且又不希望使用XML或注解,那么你可能需要考虑以下替代方案:

  1. 使用MyBatis的原生API:虽然这会增加一些复杂性,但你可以通过MyBatis的SqlSession来执行原生SQL语句。这通常需要你手动管理SQL会话和事务。

  2. 使用存储过程或函数:将复杂的SQL逻辑封装在数据库端的存储过程或函数中,并通过MyBatis-Plus(或MyBatis)调用这些存储过程或函数。这可以简化应用程序中的代码,但可能会增加数据库的复杂性。

  3. 考虑使用其他ORM框架:如果MyBatis-Plus的限制无法满足你的需求,你可以考虑使用其他更灵活的ORM框架,比如Hibernate或JPA等。这些框架可能提供了更多的自定义SQL执行方式。

综上所述,虽然MyBatis-Plus提供了强大的条件构造器和通用Mapper来简化CRUD操作,但在某些情况下你可能需要执行自定义SQL语句。在不使用XML和注解的情况下,你可以考虑使用SqlRunner(如果可用)、MyBatis的原生API、存储过程或函数,或者考虑使用其他ORM框架来满足你的需求。然而,请务必权衡这些方法的优缺点,并根据你的具体项目需求做出选择。

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

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

相关文章

深度学习3:数据预处理使用Pandas与PyTorch的实践

文章目录 导读一、主题与提纲1.1. 读取数据集1.2. 处理缺失值1.3. 转换为张量格式 二、结论 本文是经过严格查阅相关权威文献和资料&#xff0c;形成的专业的可靠的内容。全文数据都有据可依&#xff0c;可回溯。特别申明&#xff1a;数据和资料已获得授权。本文内容&#xff0…

Tülu 3:重新定义开源大模型的后训练范式

一、引言 在大型语言模型&#xff08;LLM&#xff09;的发展历程中&#xff0c;预训练阶段往往受到最多关注&#xff0c;动辄需要数百万美元算力投入和数万亿token的训练数据。然而&#xff0c;一个鲜为人知但同样关键的事实是&#xff1a;预训练完成的模型实际上并不能直接投…

【机器学习】机器学习的基本分类-监督学习-逻辑回归(Logistic Regression)

逻辑回归是一种分类算法&#xff0c;尽管名字中包含“回归”&#xff0c;但其主要用于解决二分类和多分类问题。它通过学习一个逻辑函数&#xff0c;预测输入属于某个类别的概率。 1. 逻辑回归的基本概念 目标 逻辑回归的目标是找到一个函数 h(x)&#xff0c;输出一个概率值 …

PyMOL操作手册

PyMOL 操作手册 The man will be silent, the woman will be tears. – itwangyang ​ 翻译整理&#xff1a;itwangyanng 2024 年 11月 29 日 目录 初识 PyMOL… 5 0.1 安装 PyMOL… 5 0.1.1 Windows 系统开源版 PyMOL 的安装… 5 0.1.2 教育版 PyMOL 的下载安装……

麒麟系统x86安装达梦数据库

一、安装准备前工作 操作系统&#xff1a;银河麒麟V10&#xff0c;CPU&#xff1a; x86_64 架构 下载地址&#xff0c;麒麟官网&#xff1a;https://www.kylinos.cn/ 数据库&#xff1a;dm8_20220915_x86_kylin10_64 下载地址&#xff0c;达梦数据库官网&#xff1a;https://…

Hot100 - 搜索二维矩阵II

Hot100 - 搜索二维矩阵II 最佳思路&#xff1a; 利用矩阵的特性&#xff0c;针对搜索操作可以从右上角或者左下角开始。通过判断当前位置的元素与目标值的关系&#xff0c;逐步缩小搜索范围&#xff0c;从而达到较高的效率。 从右上角开始&#xff1a;假设矩阵是升序排列的&a…

docker服务容器化

docker服务容器化 1 引言2 多个容器间网络联通2.1 单独创建关联2.2 创建时关联 3 服务搭建3.1 镜像清单3.2 容器创建 4 联合实战4.2 flink_sql之kafka到starrocks4.2 flink_sql之mysql到starrocks 5 文献借鉴 1 引言 ​ 利用docker可以很效率地搭建服务&#xff0c;本文在win1…

011变长子网掩码

变长子网掩码&#xff1a; 使用变长子网掩码&#xff08;VLSM&#xff09;优化地址分配 目标&#xff1a; 根据需求使用VLSM分配IP地址&#xff0c;减少浪费&#xff0c;并配置静态路由。 网络拓扑 创建一个包含三台路由器&#xff08;R1、R2、R3&#xff09;和五台PC&#x…

SpringBoot小知识(2):日志

日志是开发项目中非常重要的一个环节&#xff0c;它是程序员在检查程序运行的手段之一。 1.日志的基础操作 1.1 日志的作用 编程期调试代码运营期记录信息&#xff1a; * 记录日常运营重要信息(峰值流量、平均响应时长……) * 记录应用报错信息(错误堆栈) * 记录运维过程数据(…

大数据新视界 -- 大数据大厂之 Hive 数据安全:权限管理体系的深度解读(上)(15/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

智能探针技术:实现可视、可知、可诊的主动网络运维策略

网络维护的重要性 网络运维是确保网络系统稳定、高效、安全运行的关键活动。在当今这个高度依赖信息技术的时代&#xff0c;网络运维的重要性不仅体现在技术层面&#xff0c;更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等…

RT-DETR融合Inner-IoU及相关改进思路

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《Inner-IoU: More Effective Intersection over Union Loss with Auxiliary Bounding Box》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/2311.02877 代码链接&a…

在Springboot项目中实现将文件上传至阿里云 OSS

oss介绍 阿里云对象存储服务&#xff08;OSS&#xff09;是一种高效、安全和成本低廉的数据存储服务&#xff0c;可以用来存储和管理海量的数据文件。本文将教你如何使用 Java 将文件上传到阿里云 OSS&#xff0c;并实现访问文件。 1. 准备工作 1.1 开通 OSS 服务 登录阿里云…

Java项目中加缓存

Java项目中加缓存 1.更新频率低&#xff1b;但读写频率高的数据很适合加缓存&#xff1b; 2.可以加缓存的地方很多&#xff1a;浏览器的缓存&#xff1b;CDN的缓存&#xff1b;服务器的缓存&#xff1b; 本地内存&#xff1b;分布式远端缓存&#xff1b; 加缓存的时候不要…

Vuex —— Day1

vuex概述 vuex是vue的状态管理工具&#xff0c;可以帮我们管理vue通用的数据&#xff08;多组件共享的数据&#xff09; vuex的应用场景&#xff1a; 某个状态在很多个组件中都会使用&#xff08;eg.个人信息&#xff09;多个组件共同维护一份数据&#xff08;eg.购物车&…

【前端】Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的最佳实践

关于Next.js 服务器端渲染&#xff08;SSR&#xff09;与客户端渲染&#xff08;CSR&#xff09;的实践内容方面&#xff0c;我们按下面几点进行阐述。 1. 原理 服务器端渲染 (SSR): 在服务器上生成完整的HTML页面&#xff0c;然后发送给客户端。这使得用户在首次访问时能够…

基于FPGA的FM调制(载波频率、频偏、峰值、DAC输出)-带仿真文件-上板验证正确

基于FPGA的FM调制-带仿真文件-上板验证正确 前言一、FM调制储备知识载波频率频偏峰值个人理解 二、代码分析1.模块分析2.波形分析 总结 前言 FM、AM等调制是学习FPGA信号处理一个比较好的小项目&#xff0c;通过学习FM调制过程熟悉信号处理的一个简单流程&#xff0c;进而熟悉…

Scala学习记录,统计成绩

统计成绩练习 1.计算每个同学的总分和平均分 2.统计每个科目的平均分 3.列出总分前三名和单科前三名&#xff0c;并保存结果到文件中 解题思路如下&#xff1a; 1.读入txt文件&#xff0c;按行读入 2.处理数据 &#xff08;1&#xff09;计算每个同学的总分平均分 import s…

路由策略与路由控制实验

AR1、AR2、AR3在互联接口、Loopback0接口上激活OSPF。AR3、AR4属于IS-IS Area 49.0001&#xff0c;这两者都是Level-1路由器&#xff0c;AR3、AR4的系统ID采用0000.0000.000x格式&#xff0c;其中x为设备编号 AR1上存在三个业务网段A、B、C&#xff08;分别用Loopback1、2、3接…

第J7周:对于RenseNeXt-50算法的思考

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前言1、导入包2、分组卷积模块3、残差单元4、堆叠残差单元5、搭建ResNeXt-50网络 二、问题思考 电脑环境&#xff1a; 语言环境&#xff1a;Pyth…