Spring framework day 02:Spring 整合 Mybatis

前言

在现代软件开发中,数据持久化是一个重要的环节。为了高效、可维护地管理和操作数据库,许多开发者采用了Spring框架和Mybatis持久化框架的组合。Spring提供了依赖注入和面向切面编程等特性,而Mybatis则是一个优秀的对象关系映射(ORM)框架,能够有效地管理数据库与Java对象之间的转换。

本文将介绍如何使用Spring整合Mybatis来简化数据持久化的过程。首先,我们将简单介绍Spring框架和Mybatis框架的基本概念和原理,接着详细探讨Spring和Mybatis整合的步骤以及如何配置和使用它们。

通过阅读本文,您将了解到Spring整合Mybatis的优势和核心功能,以及如何利用它们来提高开发效率和降低代码的复杂度。无论您是初学者还是有一定经验的开发者,本文都会为您提供实用的指导和最佳实践。

一、为什么要使用 Spring 整合 Mybatis 

使用Spring整合Mybatis有以下几个重要原因:

  1. 简化配置和管理:Spring框架提供了依赖注入和控制反转(IoC)的机制,将对象的创建和依赖关系的管理交给Spring容器处理。通过Spring的配置文件,我们可以轻松地配置Mybatis的数据源、事务管理器等,并将Mapper对象注入到Spring容器中。这样一来,我们不再需要手动管理对象的创建和依赖关系,大大简化了配置和管理的工作。

  2. 提供声明式事务管理:Spring框架为数据库事务管理提供了强大的支持。通过Spring整合Mybatis,我们可以使用Spring的事务管理器来管理数据库事务,实现对数据的一致性和完整性的保护。通过声明式的方式,我们可以以简洁、可维护的方式定义事务的边界,而无需手动编写繁琐的事务管理代码。

  3. 实现面向切面编程:Spring框架的另一个重要特性是面向切面编程(AOP)。通过AOP,我们可以在系统的不同层次上进行横切关注点的处理,如日志记录、异常处理、性能监控等。Spring整合Mybatis使得我们可以利用AOP机制来实现对持久层的横切关注点处理,例如对SQL语句的日志记录和缓存管理等,极大地提高了系统的灵活性和可维护性。

  4. 促进代码的模块化和可重用性:通过Spring整合Mybatis,我们可以将数据访问层的逻辑封装在Mapper接口中,并使用Spring的依赖注入将Mapper对象注入到服务层中。这样一来,我们可以更好地实现代码的模块化和组件化,进一步提高代码的可重用性和可测试性。此外,Mybatis本身也提供了很多数据库操作的常用功能,如条件查询、分页查询、动态SQL等,可以让我们更加高效地编写数据访问层的代码。

综上所述,使用Spring整合Mybatis可以简化配置和管理、提供声明式事务管理、实现面向切面编程,同时也促进了代码的模块化和可重用性。这使得开发人员可以更加专注于业务逻辑的实现,提高开发效率和软件质量。

在后面我也会通过一个 spring 整合 Mybatis 的案例来加入事务管理!

二、开始学习

1、新建项目,结构如下

2、添加依赖
  <dependencies><!-- https://mvnrepository.com/artifact/com.alibaba/druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.15</version></dependency><!-- spring 的核心依赖 --><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.23</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.23</version></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.4.5</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --><!-- Mybatis 依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.6</version></dependency></dependencies>

这些依赖主要是用于构建一个基于Spring和Mybatis的Java项目,实现与数据库的交互和管理。

  1. com.alibaba:druid:Druid是一种开源的关系型数据库连接池,提供了比传统连接池更强大的功能和性能监控。通过引入这个依赖,我们可以使用Druid来管理数据库连接。

  2. org.springframework:spring-context:Spring框架的核心依赖之一,提供了IoC(控制反转)和DI(依赖注入)等核心功能。通过引入这个依赖,我们可以使用Spring来管理应用程序的组件和依赖关系。

  3. org.springframework:spring-jdbc:Spring框架提供的数据访问层的依赖,包含了与JDBC相关的类和接口。通过引入这个依赖,我们可以使用Spring提供的JDBC支持进行数据库访问和操作。

  4. ch.qos.logback:logback-classic:Logback是一个灵活的日志框架,可以替代传统的Log4j。logback-classic是Logback的经典实现,提供了日志记录的功能。通过引入这个依赖,我们可以使用Logback来记录应用程序的日志。

  5. mysql:mysql-connector-java:MySQL数据库的Java驱动程序,通过引入这个依赖,我们可以连接和操作MySQL数据库。

  6. org.projectlombok:lombok:Lombok是一个Java库,可以通过注解来自动生成代码,减少重复的样板代码。通过引入这个依赖,我们可以简化Java类的定义和编写。

  7. junit:junit:JUnit是一个用于编写单元测试的框架。通过引入这个依赖(scope设置为test),我们可以使用JUnit来编写和运行单元测试。

  8. org.mybatis:mybatis:MyBatis框架的核心依赖,用于数据库访问和映射。详细信息请参考前面的回答。

  9. org.mybatis:mybatis-spring:MyBatis与Spring框架整合的依赖,提供了MyBatis与Spring集成的支持。详细信息请参考前面的回答。

这些依赖一起使用,可以构建一个基于Spring和MyBatis的Java项目,并实现数据库访问和管理的功能。请注意检查版本号,确保使用的版本兼容并与其他相关依赖项一致。

3、创建数据库表

 链接: 百度网盘 请输入提取码 提取码: fmq9 复制这段内容后打开百度网盘手机App,操作更方便哦

由于数据量太大了,只能上传到网盘上,大家去拷贝就可以了。

4、在 entity 包下新建一个实体类 City
@Data
public class City {private String cityId;private String cityName;private String cityCode;private String province;}
5、在 dao 包下新建一个 CityDao 接口
public interface CityDao {/*** 根据省份查询* @param province* @return*/List<City> list(String province);}

这次演示的案例是,根据条件查询城市信息。

6、在 service 包下新建一个 CityService 接口,在 impl 包下新建一个 CityServiceImpl 实现类

CtiytService 接口 

public interface CityService {List<City> listCity(String province);}

 CityServiceImpl 实现类

@Service
@Slf4j
@RequiredArgsConstructor
public class CityServiceImpl implements CityService {/*** 这里注入的是代理对象*/private final CityDao cityDao;@Overridepublic List<City> listCity(String province) {return cityDao.list(province);}}

这段代码是一个基于Spring框架的Java类,其中@Service注解表示这个类是一个服务组件,会被Spring容器管理。@Slf4j注解则表示引入了Lombok库,可以使用log对象进行日志记录。

@RequiredArgsConstructor注解是Lombok库提供的注解,它会自动生成一个构造方法,参数为类中已经声明的final成员变量,对于这段代码中的cityDao,它会在构造方法中被赋值。

CityServiceImpl类实现了CityService接口,并覆写了listCity方法。在这个方法中,调用cityDao.list(province)方法获取数据并返回。这个方法实际上是委托给另一个组件CityDao来完成的,因为cityDao是通过构造函数注入进来的。

由于cityDao是一个代理对象,而非CityDao接口原本的实现类,在运行时会动态生成一个代理实现,实现了对CityDao接口的方法调用拦截和增强等功能,以便实现事务管理、缓存等功能。

 

7、在 resources 包下新建一个db.properties文件,在mappers包下新建一个CityMapper.xml

db.properties 文件

driver = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://localhost:3306/psm
username= root
password = 123456
maxActive = 200
initialSize = 5
minIdle = 5
maxWait = 2000
minEvictableIdleTimeMillis = 300000
timeBetweenEvictionRunsMillis = 60000
testWhileIdle = true
testOnReturn = false
validationQuery = select 1
poolPreparedStatements = false

 

 这些属性是用于配置Druid连接池的相关参数,具体含义如下:

  1. driver:数据库驱动类的全限定名,这里指定使用MySQL数据库的驱动。
  2. url:数据库连接的URL地址,指向本地MySQL数据库。设置了useUnicode=true和characterEncoding=utf-8,表示使用UTF-8字符集编码。
  3. name:连接数据库所需的用户名,这里设置为"root"。注意:这里本来是 username ,为什么要改成 name 呢?因为写 username 的话会识别成本机的用户名,所以这里要改成 name.
  4. password:连接数据库所需的密码,这里设置为"123456"。
  5. maxActive:连接池中同时可从数据源获取的最大活跃连接数,这里设置为200,即同时最多容纳200个连接。
  6. initialSize:初始化时创建的连接数,这里设置为5。
  7. minIdle:连接池中保持的最小空闲连接数,这里设置为5。
  8. maxWait:当连接池没有可用连接时,等待获取连接的最大时间(单位:毫秒),这里设置为2000毫秒。
  9. minEvictableIdleTimeMillis:连接在池中最小空闲时间(单位:毫秒),这里设置为300000毫秒(即5分钟)。
  10. timeBetweenEvictionRunsMillis:间隔多久进行一次空闲连接的检测(单位:毫秒),这里设置为60000毫秒(即1分钟)。
  11. testWhileIdle:在连接空闲时,是否执行validationQuery检测连接是否有效,这里设置为true。
  12. testOnReturn:在归还连接到连接池时,是否执行validationQuery检测连接是否有效,这里设置为false。
  13. validationQuery:用于检测连接是否有效的SQL查询语句,这里设置为"select 1"。
  14. poolPreparedStatements:是否缓存PreparedStatement(预编译的SQL语句),这里设置为false。

通过配置这些属性,可以更好地管理和优化Druid连接池的使用。可以指定数据库连接的URL、用户名和密码,设置连接池的大小、最大活跃连接数、空闲连接数等参数,以及进行连接的有效性校验和空闲连接的检测等。

注意:这些属性不能写错,写错了就不会生效了,会报错。

CityMapper.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="edu.nf.ch02.dao.CityDao"><resultMap id="cityMap" type="edu.nf.ch02.entity.City"><id property="cityId" column="city_id"/><result property="cityName" column="city_name"/><result property="cityCode" column="city_code"/><result property="province" column="province"/></resultMap><select id="list" parameterType="string" resultMap="cityMap">select city_id,city_name,city_code,provincefrom city_info where province = #{province}</select></mapper>

这是一个MyBatis的映射文件(mapper),用于定义数据库操作的SQL语句和结果映射规则。

在这个映射文件中,首先声明了一个命名空间 namespaceedu.nf.ch02.dao.CityDao,这个命名空间和Java接口 CityDao 对应。这个接口定义了与数据库交互的方法。

接着定义了一个 resultMap 标签,id 为 cityMap,type 为 edu.nf.ch02.entity.City,表示将查询结果映射到 City 类。在 resultMap 中定义了四个属性映射关系,分别为 cityIdcityNamecityCodeprovince,对应数据库表中的列名。

最后是一个 select 标签,id 为 list,参数类型为 String,结果映射使用了之前定义的 cityMap。SQL语句为 select city_id, city_name, city_code, province from city_info where province = #{province},其中 #{province} 是一个占位符,表示传入的参数值。

通过这个映射文件,MyBatis 就知道如何执行查询操作,并将查询结果映射到 City 类的对象中。这样,在使用 CityDao 接口中的方法时,Mybatis会根据映射文件中的定义来执行相应的SQL语句并返回结果。

 8、在 config 包下新建一个 AppConfig 配置类

@Configuration
// 扫描 dao 接口的包,动态生成 dao 接口的代理实现
// 等效于 xml 中的 <mybatis:scan>
@MapperScan(basePackages = "edu.nf.ch02.dao")
@ComponentScan(basePackages = "edu.nf.ch02")
public class AppConfig {/*** 装配 dataSource 数据源** @return* @throws Exception*/@Bean(initMethod = "init", destroyMethod = "close")public DruidDataSource dateSource() throws Exception {// 创建 Properties 对象Properties prop = new Properties();// 获取一个输入流来读取 properties 文件InputStream input = AppConfig.class.getClassLoader().getResourceAsStream("db.properties");// 将输入流加载到 properties 对象中prop.load(input);// 通过 DruidDataSourceFactory 来创建 DruidDataSource 实例DruidDataSource ds = (DruidDataSource) DruidDataSourceFactory.createDataSource(prop);return ds;}/*** 整合 mybatis ,装配 SqlSessionFactory** @return*/@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {// 创建 SqlSessionFactoryBeanSqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();// 注入数据源sqlSessionFactoryBean.setDataSource(dataSource);// 注入 mybatis 其他属性// 设置包的别名sqlSessionFactoryBean.setTypeAliasesPackage("edu.nf.ch02.entity");// mapper 映射配置文件的路径// 先创建一个资源路径解析器来查找源文件PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource[] resources = resolver.getResources("classpath:mappers/*.xml");sqlSessionFactoryBean.setMapperLocations(resources);// 返回 SqlSessionFactoryBean 给容器return sqlSessionFactoryBean;}}

这是一个Spring的配置类 AppConfig,用于配置整合 MyBatis 和数据源。

首先使用注解 @MapperScan 扫描包 edu.nf.ch02.dao 下的接口,动态生成接口的代理实现类。相当于在XML中使用 <mybatis:scan> 配置。

然后使用注解 @ComponentScan 扫描包 edu.nf.ch02,将标有 @Component@Service@Repository@Controller 等注解的类纳入Spring容器管理。

下面定义了一个名为 dataSource 的Bean方法,返回一个 DruidDataSource 实例,该方法通过读取 db.properties 文件中的配置来创建数据源。使用了 @Bean 注解,同时指定了初始化方法 init 和销毁方法 close

接着定义了一个名为 sqlSessionFactory 的Bean方法,返回一个 SqlSessionFactoryBean 实例。该方法需要传入数据源 dataSource。在方法中,创建了 SqlSessionFactoryBean 对象,并设置了数据源和其他一些属性,比如设置了实体类的别名包路径和映射文件的位置。使用了 @Bean 注解。

这样,在Spring容器启动时,会根据配置生成数据源和SqlSessionFactory,并注册到容器中供其他组件使用。

9、测试

@Slf4j
public class Main {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 从容器中获取动态创建的 CityDao 的代理对象CityService cityDao = context.getBean(CityService.class);List<City> list = cityDao.listCity("广东");list.forEach(city -> log.info(city.getCityName()));}}

 运行结果

 在 main 方法中,创建了一个 ApplicationContext 对象,并指定使用 AnnotationConfigApplicationContext 类来加载应用程序配置类 AppConfig。这样就会根据 AppConfig 中的配置信息创建并配置Spring容器。

接下来,通过容器对象 contextgetBean 方法,传入 CityService.class 参数来获取动态生成的 CityDao 的代理对象。这里假设 CityServiceCityDao 接口的实现类。

然后,调用 cityDao 的方法 listCity("广东") 查询城市列表,并将结果保存到 list 集合中。

最后,使用 forEach 方法遍历 list 集合中的每个城市对象,并使用日志记录器 log 打印城市名称。

这样,运行程序时,就会通过Spring容器获取CityDao的代理对象,并使用它查询并打印城市列表的名称。

 

三、总结

以前我们操作数据库是不是没有这么方便,以前我们要写大量的 dao 实现类的代码去操作(CRUD)数据库,现在使用 spring 整合 Mybatis 是不是不用写 dao 实现类了,是不是很方便。大大节省了开发时间和开发效率,使用框架的好处就体现出来了。

这个案例还没有完全讲完,我将在下一篇博客中继续讲解 spring 整合 Mybatis,下一章讲的就是 spring 整合 Mybatis 分页,使用 pagehelper 实现分页功能。

注意:完成这个案例之前建议先去看看我上一篇博客,spring 整合数据源。

 

四、gitee 案例

完整代码地址:qiuqiu/conformity-study (gitee.com)

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

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

相关文章

力扣每日一题49:字母异位词分组

题目描述&#xff1a; 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate&quo…

改造xxl-job适配nacos注册中心

xxl-job并没有对nacos、zookeeper这一类注册中心进行适配&#xff0c;所以需要进行改造。 改造目标 1.对调度器&#xff0c;需要能注册到nacos上&#xff0c;并且执行器管理里的 机器地址 能使用 lb://serviceName 这种地址 2.对执行器&#xff0c;需要能注册到nacos上&…

用python写一个贪吃蛇的程序能运行能用键盘控制

用python写一个贪吃蛇的程序能运行能用键盘控制 1.源码2.运行效果 1.源码 开发库使用&#xff1a;pygame random 直接在终端运行&#xff1a;pip install pygame pycharm安装库&#xff1a;文件-设置-项目-Python 解释器 import pygame import random# 初始化pygame pygame…

MATLAB中 tf2zpk函数用法

目录 语法 说明 示例 IIR滤波器的极点、零点和增益 tf2zpk函数的功能是将传递函数滤波器参数转换为零极点增益形式。 语法 [z,p,k] tf2zpk(b,a) 说明 [z, p, k] tf2zpk(b, a) 从传递函数参数 b 和 a 中找到零点矩阵 z&#xff0c;极点向量 p&#xff0c;以及相关的增益…

蓝桥杯(砝码称重,C++)

思路&#xff1a; 1、用到动态规划思想。 2、用ans[i][j]记录用前i个砝码&#xff0c;能不能称出重量j。 3、详细思路见代码注释&#xff0c;易懂。 #include<iostream> #include<cmath> using namespace std; int main() {int n;int a[110];//记录每个砝码重量int…

2022年亚太杯APMCM数学建模大赛C题全球变暖与否全过程文档及程序

2022年亚太杯APMCM数学建模大赛 C题 全球变暖与否 原题再现&#xff1a; 加拿大的49.6C创造了地球北纬50以上地区的气温新纪录&#xff0c;一周内数百人死于高温&#xff1b;美国加利福尼亚州死亡谷是54.4C&#xff0c;这是有史以来地球上记录的最高温度&#xff1b;科威特53…

nodejs+vue 校园通勤车-计算机毕业设计

在此情况下开发一款校园通勤车可视化系统小程序&#xff0c;于是乎变得非常合乎时宜。 经过网上调查和搜集数据,我们可以发现校园通勤车可视化管理方面的小程序在并不是相当普及,同时在校园通勤车可视化管理方面的可以有许多改进。目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪…

C++:无法查找或打开 PDB 文件?? 如何解决呢?以及产生原因是什么?

C:无法查找或打开 PDB 文件?? 如何解决呢&#xff1f;以及产生原因是什么&#xff1f; 前言解决办法原因 前言 最近博主在写C时&#xff0c;明明代码都正确&#xff0c;但编译失败。查看原因后发现显示&#xff1a;无法查找或打开 PDB 文件。&#xff08;先介绍解决办法&…

GRASP 、SOLID 与 GoF 设计模式

一、GRASP GRASP&#xff1a;通用职责分配软件设计模式(General Responsibility Assignment Software Patterns)&#xff0c;其主要思想是基于单一职责设计软件对象。 思考软件对象设计以及大型构件的流行方式是&#xff0c;考虑其职责、角色和协作。这是被称为职责驱动设计&a…

【Shell】环境变量 自定义变量 特殊变量

Shell变量&#xff1a;环境变量 目标 1、理解什么是系统环境变量&#xff1f; 2、掌握常用的系统环境变量都有哪些&#xff1f; Shell变量的介绍 变量用于存储管理临时的数据, 这些数据都是在运行内存中的. 变量类型 系统环境变量 自定义变量 特殊符号变量 系统环境变…

表示本机IP地址的方式(三种方式)

1、本机和网络上的其他主机都可以通过IP地址访问到服务器 2、通过 127.0.0.1 或者 localhost 访问 127.0.0.1 和 localhost 它们完全等价 只能 本机 通过 127.0.0.1 或者 localhost 访问&#xff0c;网络上的其他主机无法访问 3、 通过 0.0.0.0 访问服务器 表示所有可…

Leetcode——字符

520. 检测大写字母 class Solution { public:bool detectCapitalUse(string word) {int big 0, small 0, len word.length();for (int i 0; i < len; i) {if (word[i] > 65 && word[i] < 90) {big;}else {small;}}if (big len || small len) {return tr…

2023年中国一次性医用内窥镜市场发展现状分析:相关产品进入上市高峰期[图]

基于对减少交叉感染风险和维护成本的需求等因素&#xff0c;一种新兴的、耗材化的一次性内窥镜可以避免因重复使用产品而导致的感染问题和高额的清洗消毒费用&#xff0c;从而提高患者的安全性并帮助医疗机构节省运营成本。 一次性和可重复使用医用内窥镜特点对比 资料来源&am…

CNN——卷积神经网络

文章目录 多层感知机&#xff08;MLP&#xff0c;Multilayer Perceptron&#xff09;神经网络定义MLP与神经网络的异同相同之处&#xff1a;不同之处&#xff1a;总结 为什么要使用神经网络CNN卷积层&#xff1a;池化层&#xff1a;全连接层&#xff1a; 卷积神经网络的优势pad…

c语言练习94:分割链表

分割链表 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x…

TikTok Shop美国本土店VS跨境店,浅析与选择

TikTok不仅仅是一个用于分享有趣短视频的平台&#xff0c;它也逐渐成为了商家们极力推广自己品牌和产品的场所。 在TikTok的商业生态系统中&#xff0c;存在几种不同的商店类型&#xff0c;各有其独特性和适用场景。今天&#xff0c;我们就来深入探讨这些店的差异与特点。 一、…

vuecli2关于下载本地取环境变量没问题部署后路径取不到环境变量问题解决

功能 下载功能,用a标签实现下载 代码错误思路分析 解决办法可以忽略直接看下面 解决思路 在每个config文件中都定义了file_url,本地运行没有问题,但是部署到服务器开发环境, 拿到的是生产环境的FILE_URL地址 首先看了流水线-构建配置-编译配置-编译脚本里的打包命令: ** 本…

数据挖掘原理与算法

一、什么是闭合项集? Close算法对Apriori算法的改进在什么地方? 闭合项集&#xff1a;就是指一个项集x&#xff0c;它的直接超集的支持度计数都不等于它本身的支持度计数。 改进的地方&#xff1a; 改进方向&#xff1a; 加速频繁项目集合的生成&#xff0c;减少数据库库的扫…

微信小程序数据交互------WXS的使用

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 1.数据库连接 数据表结构&#xff1a; 数据测式&#xff1a; 2.后台配置 pom.xml <?xml version&quo…

重磅发布!RflySim Cloud 智能算法云仿真平台亮相,助力大规模集群算法高效训练

RflySim Cloud智能算法云仿真平台&#xff08;以下简称RflySim Cloud平台&#xff09;是由卓翼智能及飞思实验室为无人平台集群算法验证、大规模博弈对抗仿真、人工智能模型训练等前沿研究领域研发的平台。主要由环境仿真模块、物理效应计算模块、多智能体仿真模块、分布式网络…