Mybatis 到 MyBatisPlus

Mybatis 到 MyBatisPlus

Mybatis

MyBatis(官网:https://mybatis.org/mybatis-3/zh/index.html )是一款优秀的 持久层 (ORM)框架,用于简化JDBC的开发。是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    持久层:指的是就是数据访问层(dao),是用来操作数据库的。

1. 依赖和配置

引入 mybatis 依赖和数据库连接依赖
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>
 
<dependency>
     <groupId>com.mysql</groupId>
     <artifactId>mysql-connector-j</artifactId>
     <scope>runtime</scope>
 </dependency>

数据源信息和mapper映射扫描配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cloud_user?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  mybatis:
    mapper-locations: classpath:mapper/*.xml

Spring MapperScan自动扫描配置
一般在启动类上新增 MapperScan 注解即可

@MapperScan("com.pjh.apigf.mapper")

本案例使用 mybatis-spring-boot-starter 自动装配依赖,因此 mybatis 会自动读取spring.datasource 下面的数据源配置信息;并会自动扫描 @mapper 注解的类加入Ioc容器中进行管理。

注意:如果使用 spring + mybatis 依赖,则需要在 mybatis-config.xml 中指定 数据源信息,mapperScan 目录等,否则会报错。

2. 基本使用

使用时需要创建对应的实体类,对应的 mapper.java 持久层;

2.1 Mapper映射实现

要求 Mapper.xml 与Mapper.java 在相同目录结构下:
在这里插入图片描述
在 Mapper.java 中创建需要的数据操作方法

User getUserById(@Param("userId") String userId) ;

相同的 Mapper.xml 中需要有对应的方法
在这里插入图片描述
常用的标签:

select: 用于查询操作,从数据库中检索数据。
id: 唯一标识符,用于匹配接口方法。
resultType: 查询结果的Java类型,可以是具体类名或别名。
resultMap: 当查询结果需要复杂的映射关系时使用,引用之前定义的<resultMap>。
parameterType: 传入参数的类型,通常是Java Bean类型或基本类型。

insert: 用于插入操作,向数据库插入数据。
id, parameterType, useGeneratedKeys, keyProperty: 类似于<select>,其中useGeneratedKeys和keyProperty用于处理自动生成的主键。

update: 用于更新操作,更新数据库中的数据。
id, parameterType: 同上。

delete: 用于删除操作,从数据库中删除数据。
id, parameterType: 同上。

动态SQL标签:
<if>: 根据条件判断是否包含某段SQL<choose>, <when>, <otherwise>: 类似于Javaswitch-case语句。
<where>: 动态生成WHERE子句,自动处理第一个条件前的ANDOR<set>: 用于动态生成UPDATE语句的SET子句。
<foreach>: 遍历集合,常用于IN语句中。

sql: 定义可重用的SQL片段,提高代码复用性。
id: 片段的唯一标识。

resultMap: 复杂结果集的映射,定义列名到JavaBean属性的映射关系。
id: resultMap的唯一标识。
type: 映射的目标Java类型。
<id><result>: 分别定义主键映射和普通属性映射
2.2 注解方式实现
  • @Select用于标记查询语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Select注解时,需要在注解中指定SQL语句
  • @Insert用于标记插入语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Insert注解时,需要在注解中指定SQL语句。
  • @Update用于标记更新语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Update注解时,需要在注解中指定SQL语句。
  • @Delete用于标记删除语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Delete注解时,需要在注解中指定SQL语句。
  • @Results用于标记结果集映射,该注解可以用于接口方法或XML文件中,通常与@Select注解一起使用。使用@Results注解时,需要指定Result映射规则。
@Select("SELECT * FROM users WHERE id = #{id}")
@Results(id = "userResultMap", value = {
	@Result(property = "id", column = "id"),
	@Result(property = "name", column = "name"),
	@Result(property = "age", column = "age")
})
User getUserById(@Param("id") Long id);
  • @Result用于标记单个属性与结果集中的列之间的映射关系。该注解可以用于接口方法或XML文件中,通常与@Results注解一起使用。使用@Result注解时,需要指定映射规则。
  • @ResultMap用于标记结果集映射规则。该注解可以用于接口方法或XML文件中,通常与@Select注解一起使用。使用@ResultMap注解时,需要指定映射规则。
@Select("SELECT * FROM users WHERE id = #{id}")
@ResultMap("userResultMap")
User getUserById(@Param("id") Long id);
  • @Options用于指定一些可选的配置项。该注解可以用于接口方法或XML文件中,通常与@Insert、@Update、@Delete等注解一起使用。使用@Options注解时,可以指定一些可选的配置项。
    useGeneratedKeys :自增主键并返回,keyProperty 实体对应的元素
@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user);
  • @SelectKey用于在执行INSERT语句后获取自动生成的主键值。该注解可以用于接口方法或XML文件中,通常与@Insert注解一起使用。使用@SelectKey注解时,需要指定生成主键的SQL语句和将主键值赋给Java对象的哪个属性。
@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
@SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", before = false, resultType = Long.class)
int insertUser(User user);
  • @Param用于为SQL语句中的参数指定参数名称。该注解可以用于接口方法或XML文件中,通常与@Select、@Insert、@Update、@Delete等注解一起使用。使用@Param注解时,需要指定参数名称。
@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
List<User> getUsersByNameAndAge(@Param("name") String name, @Param("age") Integer age);
  • @One用于在一对一关联查询中指定查询结果的映射方式。该注解可以用于XML文件中,通常与和标签一起使用。使用@One注解时,需要指定查询结果映射的Java对象类型和查询结果映射的属性。
<resultMap id="userResultMap" type="User">
	<id column="id" property="id"/>
	<result column="name" property="name"/>
	<result column="age" property="age"/>
	<association property="department" resultMap="departmentResultMap"/>
</resultMap>

<resultMap id="departmentResultMap" type="Department">
	<id column="id" property="id"/>
	<result column="name" property="name"/>
	<result column="description" property="description"/>
	<one property="manager" resultMap="userResultMap"/>
</resultMap>

上述代码中,@One注解用于指定查询结果的映射方式,这里使用了嵌套的标签实现了一对一关联查询。在departmentResultMap中,使用@One注解指定了查询结果映射的Java对象类型为User,查询结果映射的属性为manager,resultMap参数指定了查询结果映射的结果集映射规则为userResultMap。

  • @Many用于在一对多关联查询中指定查询结果的映射方式。该注解可以用于XML文件中,通常与和标签一起使用。使用@Many注解时,需要指定查询结果映射的Java对象类型和查询结果映射的属性。
<resultMap id="departmentResultMap" type="Department">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="description" property="description"/>
<collection property="members" ofType="User" resultMap="userResultMap"/>
</resultMap>

<resultMap id="userResultMap" type="User">
	<id column="id" property="id"/>
	<result column="name" property="name"/>
	<result column="age" property="age"/>
</resultMap>
  • @ResultType用于指定查询结果的类型。该注解可以用于接口方法或XML文件中,通常与@Select、@Insert、@Update、@Delete等注解一起使用。使用@ResultType注解时,需要指定查询结果的类型。
@Select("SELECT name, age FROM users WHERE id = #{id}")
@ResultType(User.class)
User getUserById(Long id);
  • @TypeDiscriminator用于在自动映射时指定不同子类型的映射方式。该注解可以用于XML文件中,通常与和标签一起使用。使用@TypeDiscriminator注解时,需要指定类型列的名称和不同子类型的映射方式。
<resultMap id="vehicleResultMap" type="Vehicle">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="type" property="type"/>
	<discriminator javaType="String" column="type">
		<case value="car" resultMap="carResultMap"/>
		<case value="truck" resultMap="truckResultMap"/>
		<case value="bus" resultMap="busResultMap"/>
	</discriminator>
</resultMap>
<resultMap id="carResultMap" type="Car">
	<result column="engine" property="engine"/>
	<result column="seats" property="seats"/>
</resultMap>
<resultMap id="truckResultMap" type="Truck">
	<result column="load" property="load"/>
</resultMap>
<resultMap id="busResultMap" type="Bus">
	<result column="capacity" property="capacity"/>
</resultMap>

上述代码中,@TypeDiscriminator注解用于指定不同子类型的映射方式。在vehicleResultMap中,使用@TypeDiscriminator注解指定了类型列的名称为type,javaType参数指定了类型列的Java类型为String,标签中的value属性分别对应不同的子类型(car、truck、bus),resultMap属性用于指定不同子类型的结果集映射规则。

MyBatisPlus

性能优化:比如自动填充(如创建时间、更新时间)、乐观锁等功能,MBP 提供了开箱即用的解决方案,减少了开发者在这些常规需求上的重复工作。
注解驱动:MBP 强化了注解的使用,很多功能可以通过简单的注解配置实现,降低了 XML 配置文件的依赖,使得项目结构更加清晰。
代码生成器(AutoGenerator):
MP提供了一个强大的代码生成器,能自动生成Entity、Mapper、Mapper XML、Service、Controller等各层代码,大幅减轻了基础代码的编写工作。
CRUD操作简化:
提供了丰富的BaseMapper接口,内含基本的增删改查方法,如insert, deleteById, updateById, selectById, selectList等,无需编写Mapper XML文件即可完成基础的数据库操作。
条件构造器(Wrapper):
包括QueryWrapper和UpdateWrapper,用于构建复杂的查询和更新条件,支持链式调用,使得SQL条件表达更加灵活和直观。

  1. Wrapper 类结构
    Wrapper: 这是最顶端的抽象类,代表条件构造器的基类。
    AbstractWrapper: 实现了Wrapper的大部分方法,负责生成SQL的WHERE部分。
    QueryWrapper: 专门用于构建查询条件,继承自AbstractWrapper。
    UpdateWrapper: 用于构建更新条件,同样继承自AbstractWrapper,侧重于更新操作。
  2. 链式调用
    Wrapper设计支持链式调用,意味着你可以一行接一行地添加条件,使得代码简洁且易于理解。
  3. 常用方法
    查询相关(QueryWrapper示例)
    eq: 等于条件,如.eq(“age”, 25)。
    ne: 不等于条件,如.ne(“status”, “inactive”)。
    like: 模糊匹配,如.like(“username”, “John%”)。
    gt, ge, lt, le: 分别代表大于、大于等于、小于、小于等于。
    in: 列表中的任意一个值匹配,如.in(“id”, Arrays.asList(1, 2, 3))。
    notIn: 列表中的值都不匹配。
    isNull, isNotNull: 判断字段是否为NULL或非NULL。
    between: 范围匹配,如.between(“age”, 18, 30)。
    更新相关(UpdateWrapper示例)
    上述所有查询条件方法在UpdateWrapper中同样适用,用于更新时的条件过滤。
    set: 设置更新的字段值,如.set(“age”, 30)。
  4. Lambda表达式
    MyBatisPlus也支持Lambda表达式,使代码更安全,避免硬编码字段名。例如:
    queryWrapper.lambda()
    .eq(User::getAge, 25)
    .like(User::getName, “John”);
  5. 排序
    orderByAsc, orderByDesc: 用于排序,如.orderByDesc(“create_time”)。
  6. 组合查询
    可以通过嵌套or, and方法来组合条件,实现更复杂的逻辑查询。

结果映射与动态SQL:
支持结果映射到Java对象,并提供了丰富的动态SQL支持,如if、choose、when、otherwise、where等标签,使得在不直接编写SQL的情况下也能实现复杂的查询逻辑。
分页插件:
内置了分页插件,只需简单配置即可实现自动分页查询,无需手动编写分页逻辑。
主键策略:
支持多种主键生成策略,如自增、UUID、雪花算法等,简化主键生成的配置。
乐观锁插件:
通过插件的方式支持乐观锁,帮助处理并发场景下的数据一致性问题。
服务层接口与实现:
提供了通用的服务层接口和默认实现,进一步简化业务逻辑层的开发,如自动填充、基本的增删改查等。
插件机制:
强大的插件体系,允许开发者自定义拦截器,对SQL执行过程进行干预,如性能监控、日志打印、数据脱敏等。
类型转换与枚举支持:
自动处理Java类型与数据库类型间的转换,包括枚举类型的映射。

踩坑

分清 spring 依赖,和 boot 自动装配依赖。使用原生的 mybatis 依赖需要配置mybatis-config.xml 配置文件,大致如下,关键内容为 dataSource、SqlSessionFactoryBean、MapperScannerConfigurer;而使用 boot 自动装配依赖时会将以上配置和bean进行自动装配。

<?xml version="1.0" encoding="UTF-8" ?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd"
>

    <context:component-scan base-package="com.pjh.apigf.mapper"></context:component-scan>

    <!-- 加载jdbc.properties配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 配置 MyBatis 数据源 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${database.driver}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.username}" />
        <property name="password" value="${database.password}" />
    </bean>

    <!-- 配置 mybatis Session -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!--<property name="configLocation" value="classpath:mybatis-config.xml"></property>-->
        <property name="mapperLocations" value="classpath:com/pjh/apigf/mapper/*.xml" />
    </bean>

    <!-- 扫描Mapper接口(Spring会使用AOP为其实现具体方法) -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="top.yiqifu.study.p061_mybatis" />
    </bean>


</beans>

mybatis-spring-boot-starter 和普通的 mybatis 依赖有以下几个主要区别:

集成便利性:
mybatis-spring-boot-starter 是专为 Spring Boot 应用设计的 Starter,它提供了自动配置的功能,使得在 Spring Boot 应用中集成 MyBatis 变得更加简便。你只需要在 pom.xml 中添加这个 Starter 依赖,无需手动编写大量的配置代码,Spring Boot 会自动配置好 MyBatis 的关键组件,比如 SqlSessionFactory 和 SqlSessionTemplate。
普通的 mybatis 依赖则是 MyBatis 的核心库,不包含任何 Spring 特定的集成代码。在非 Spring Boot 项目或者传统的 Spring 项目中使用时,你需要手动配置数据源、SqlSessionFactory、事务管理器等组件,并且可能需要额外的 mybatis-spring 依赖来桥接 MyBatis 和 Spring。

自动配置:
mybatis-spring-boot-starter 内部集成了自动配置逻辑,可以根据应用的环境和配置文件(如 application.properties 或 application.yml)自动设置 MyBatis 的配置项,比如映射文件的位置、类型别名、数据源等。
使用普通的 mybatis 依赖时,这些配置都需要手动在 Spring 配置类中完成。

依赖管理:
mybatis-spring-boot-starter 作为 Spring Boot 的 Starter,它内部已经管理了必要的依赖关系,例如它会自动引入 mybatis, mybatis-spring 以及可能的其他相关依赖,确保版本兼容性。这减少了 Maven 或 Gradle 依赖冲突的可能性。
使用普通 mybatis 依赖时,你需要自己管理所有相关依赖及其版本兼容性。

约定优于配置:
Spring Boot 的理念是“约定优于配置”,mybatis-spring-boot-starter 遵循这一原则,很多配置都有默认值,开发者只需关注需要改变的部分。而传统方式使用 MyBatis 则需要显式地配置每一部分。

综上所述,mybatis-spring-boot-starter 提供了一种快速、简化的方式来在 Spring Boot 应用中集成 MyBatis,减少了手动配置的工作量,并且通过自动配置和依赖管理提高了开发效率。而普通的 MyBatis 依赖则提供了更多的灵活性,但需要开发者自行处理更多的配置细节。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DC/AC电源模块一种效率与可靠性兼备的能源转换解决方案

DC/AC电源模块都是一种效率与可靠性兼备的能源转换解决方案 DC/AC电源模块是一种能够将直流电源&#xff08;DC&#xff09;转换为交流电源&#xff08;AC&#xff09;的设备。它在现代电子设备中扮演着非常重要的角色&#xff0c;因为许多设备需要交流电源才能正常运行。无论…

VS Code修改菜单栏字体大小

修改方法 打开VS Code&#xff0c;快捷键 CtrlShiftP&#xff0c;在弹出的输入框中输入 setting&#xff0c;找到带有JSON的一项&#xff0c;如图所示&#xff1a; 原文链接 window.zoomLevel 前后变化 终端字体大小 File -> Preferences -> Settings -> Features…

云计算运维工程师的突发状况处理

云计算运维工程师在应对突发的故障和紧急情况时,需要采取一系列迅速而有效的措施来最小化服务中断的时间并恢复系统的稳定性。 以下是一些关键步骤和策略: 快速响应: 立即识别并确认故障的性质和范围。通知团队成员和相关的利益相关者,确保所有人了解当前情况。故障诊断:…

迅为iTOP-2K1000开发板龙芯中科国产64位Loognix主板

硬件配置 国产龙芯处理器&#xff0c;双核64位系统&#xff0c;板载2G DDR3内存&#xff0c;流畅运行Busybox、Buildroot、Loognix、QT5.12 系统! 接口全板载4路USB HOST、2路千兆以太网、2路UART、2路CAN总线、Mini PCIE、SATA固态盘接口、4G接口、GPS接口WIF1、蓝牙、Mini H…

环路滤波器

块效应产生的原因 块效应指视频边界不连续的变化,我们在观看视频的时候,在运动剧烈的场景常能观察到图像出现小方块,小方块在边界处呈现不连续的效果(如下图),这种现象被称为块效应(blocking artifact)。 造成这种现象的主要原因有两点: DCT量化误差导致运动补偿导致…

工业网关的功能与作用解析-天拓四方

在工业4.0和智能制造的时代背景下&#xff0c;工业网关作为连接现场设备与云端平台的桥梁&#xff0c;正发挥着日益重要的作用。它不仅为工业设备的远程监控和管理提供了可能&#xff0c;还为企业实现数字化转型和智能化升级提供了有力支持。本文将对工业网关的功能与作用进行解…

深入理解PHP命名空间

在PHP项目中&#xff0c;命名空间&#xff08;namespace&#xff09;是一个非常重要的特性。它不仅帮助开发者组织代码&#xff0c;还能避免类、函数、常量等命名冲突问题。本文将详细介绍PHP命名空间的概念、使用方法和最佳实践。 一、什么是命名空间&#xff1f; 命名空间…

【PyQt5】一文向您详细介绍 setContentsMargins() 的作用

【PyQt5】一文向您详细介绍 setContentsMargins() 的作用 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通…

EWM学习之旅-1-EWM100

系统学习一个业务模块已经变得越来越重要&#xff0c;开始吧&#xff0c;EWM&#xff01; EWM的Learning Journey中包括7本 ebook,100/110/115/120/125/130/140&#xff0c;一本一本的啃吧&#xff0c;相信很多内容是重复的。 EWM100很适合初学者&#xff0c;了解概念术语&…

charles破解

一、Charles官网下载安装包二、安装charles三、charles破解 一、Charles官网下载安装包 根据自己电脑系统 官网下载即可。 链接: https://www.charlesproxy.com/download/latest-release/ 二、安装charles 点击下载的安装包&#xff0c;然后进行安装。 三、charles破解 打…

[解决方案]使用微软拼音打中文卡顿到离谱

去这里看&#xff0c;发现有65535个文件&#xff0c;基本都是临时文件。删除后测试了一下&#xff0c;不会卡顿了但是只要打中文还是会疯狂生成tmp临时文件。 问题&#xff1a;输入法不兼容 解决方案 先把上面那个文件夹里的tmp文件全删了 直接点是&#xff0c;其他的文件会…

BEVM基于OP-Stack发布首个以WBTC为GAS连接以太坊和比特币生态的中继链

为了更好的连接以太坊和比特币生态&#xff0c;BEVM团队正在基于OPtimism的OP Stack来构建一个以WBTC为GAS兼容OP-Rollup的中继链&#xff0c;这条中继链将作为一种完全去中心化的中间层&#xff0c;把以太坊上的主流资产(WBTC/ ETH/USDC/USDT等)引入到BEVM网络。 不仅如此&am…

3.优化算法之二分查找1

二分查找简介 1.特点 最简单最恶心&#xff0c;细节最多&#xff0c;最容易写出死循环的算法 2.学习中的侧重点 1&#xff09;算法原理 数组有序的情况 2&#xff09; 模板 不要死记硬背 ->理解之后再记忆 1.朴素的二分模板 2.查找左边界的二分模板 3.查找右边界的二分模板 …

同步时钟系统为何能成为机场时间管理的好伙伴?

在机场这个分秒必争的环境中&#xff0c;精准的时间管理至关重要。同步时钟系统的出现&#xff0c;成为了机场时间管理的得力助手&#xff0c;为机场的高效运行和服务质量的提升发挥了关键作用。 一、同步时钟系统简介 同步时钟系统是一种通过网络技术实现时间同步的高精度计时…

python3使用ast.parse详解

使用ast库分析python3脚本, 并对脚本进行一些处理, 比如注释pirnt语句 一.基础知识 官方网址连接 ast — Abstract Syntax Trees ast库可以方便的分析python代码结构, 并做一些处理, 很适合对大量脚本文件做批量处理, 比如把print语句全部注释等. 直观的打印出代码结构 impo…

洞察用户需求,Xinstall数据统计App让你的App运营如虎添翼

在互联网时代&#xff0c;App推广和运营面临着前所未有的挑战。流量红利逐渐衰退&#xff0c;用户获取成本不断攀升&#xff0c;如何确保在多变的互联网环境下&#xff0c;迅速搭建起能时刻满足用户需求的运营体系&#xff0c;成为众多企业急待解决的问题。今天&#xff0c;我们…

简易人工智能入门(2)

上篇文章讨论过了人工智能的几个核心概念&#xff0c;线性模型&#xff0c;损失函数和梯度下降。下面我们继续探讨。 一、几种梯度下降的方式 1、批量梯度下降法&#xff08;Batch Gradient Descent&#xff0c;简称BGD&#xff09;是梯度下降法最初的形式&#xff0c;在更新…

RabbitMQ 入门

目录 一&#xff1a;什么是MQ 二&#xff1a;安装RabbitMQ 三&#xff1a;在Java中如何实现MQ的使用 RabbitMQ的五种消息模型 1.基本消息队列&#xff08;BasicQueue&#xff09; 2.工作消息队列&#xff08;WorkQueue&#xff09; 3. 发布订阅&#xff08;Publish、S…

机器发货到菲律宾的完整流程 广东智慧物流

机器发货到菲律宾的完整流程 广东智慧物流 &#x1f31f;【机器发货到菲律宾完全攻略】&#x1f31f; 机器发货到菲律宾的完整流程 广东智慧物流 为你整理了一份超详细的机器发货到菲律宾的攻略&#xff01;海运14天轻松到达&#xff0c;让你无后顾之忧&#xff01;&#x1f…

昇思25天学习打卡营第3天|MindSpore快速入门-模型训练

基于MNIST_Data.zip手写数据集案例&#xff0c;进行MindSpore模型训练。 MNIST数据集 MNIST数据集由美国国家标准与技术研究所&#xff08;NIST&#xff09;整理发布&#xff0c;最初的目的是实现对手写数字的自动识别。该数据集包含了来自250个不同人的手写数字图片&#xff…