【mybatisPlus简化开发过程】

mybatisPlus简化开发过程

  • 1.入门案例
    • 1.1 SpringBoot整合Mybatis开发过程(复习)
  • 2.Mp简介
  • 3. 增删改查
  • 4. 分页插件
  • 5. 多条件查询(lambda版本)
  • 6 条件查询的null值处理
  • 7. Lambda查询投影
  • 8.条件查询
    • 8.1 范围查询(>、=、between)
    • 8.2 模糊查询 (like)
    • 8.3 空判定(null)
    • 8.4 包含性判定(in)
    • 8.5 分组(group)
    • 8.6 排序(order)
  • 9. 字段映射和表名映射不一致
    • 使用@TableField和@TableName
  • 10. id生成策略控制
    • 10.1 不同的表应用不同的id生成策略
    • 10.2 mp支持的id生成策略
    • 10.3 配置id生成策略
    • 10.4 全局指定id生成策略
  • 11. 批量删除/查询
  • 12.逻辑删除
    • 12.1 逻辑删除全局配置
    • 12.2 Mp中的逻辑删除说明
  • 13.乐观锁
  • 14. 代码生成器

1.入门案例

1.1 SpringBoot整合Mybatis开发过程(复习)

  • 使用springInitialier创建springboot工程
new Module -> 填入属性
  • 修改maven xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.6.3</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.ypy</groupId>
	<artifactId>mybatisplus_quickstart</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>mybatisplus_quickstart</name>
	<description>mybatisplus_quickstart</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.5.0</version>
		</dependency>

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.2.16</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.23</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.26</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

  • 修改mybatis-plus连接信息(数据源)
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
    username: root
    password: root
# 开启mybatis-plus日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

  • 修改实体类
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Accessors(chain=true)
@AllArgsConstructor
@NoArgsConstructor
@Data
@TableName(value = "tb_user")
public class User {
    @TableId("id")
    private Long id;
    private String username;
    private String password;
    private String gender;
    private String addr;
}
  • 增加mapper层接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ypy.mybatisplus_quickstart.model.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {

}
  • do 测试
@SpringBootTest
class MybatisplusQuickstartApplicationTests {

	@Autowired
	private UserMapper userMapper;

	@Test
	public void testGetAll() {
		QueryWrapper<User> wrapper = new QueryWrapper<>();
		wrapper.eq("gender","男");
		List<User> users = userMapper.selectList(wrapper);
		System.out.println(users);
	}

}
  • 查看响应结果

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.6.3)

2023-11-13 14:37:57.566  INFO 4740 --- [           main] .m.MybatisplusQuickstartApplicationTests : Starting MybatisplusQuickstartApplicationTests using Java 1.8.0_221 on DESKTOP-YPYJE7C with PID 4740 (started by ypykip in D:\Application\WorkSpace\self-learn\base-learn\mybatisplus_quickstart)
2023-11-13 14:37:57.566  INFO 4740 --- [           main] .m.MybatisplusQuickstartApplicationTests : No active profile set, falling back to default profiles: default
org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@4d33940d
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.5.0 
2023-11-13 14:37:59.217  INFO 4740 --- [           main] .m.MybatisplusQuickstartApplicationTests : Started MybatisplusQuickstartApplicationTests in 1.909 seconds (JVM running for 2.778)
2023-11-13 14:37:59.567  INFO 4740 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
[User(id=9, username=小奥, password=456, gender=男, addr=北京)]
2023-11-13 14:38:00.669  INFO 4740 --- [ionShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closing ...
2023-11-13 14:38:00.671  INFO 4740 --- [ionShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closed

Process finished with exit code 0

2.Mp简介

MyBatisPlus概述
● MyBatisP1us(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率
● 官网:https://mybatis.plus/ (网友送的)   https://mp.baomidou.com/

3. 增删改查

@SpringBootTest
class MybatisplusQuickstartApplicationTests {

	@Autowired
	private UserMapper userMapper;

	@Test
	void testSave(){
		User user = new User();
		user.setId(2L).setUsername("tt").setGender("女").setAddr("天津").setPassword("123456");
		userMapper.insert(user);
	}

	@Test
	void testPage() {
		IPage<User> page = new Page<>(2,3);
		userMapper.selectPage(page,null);
		System.out.println("当前页码: " + page.getCurrent());
		System.out.println("每页显示数: " + page.getSize());
		System.out.println("一共多少页: " + page.getPages());
		System.out.println("一共多少条: " + page.getTotal());
		System.out.println("数据: " + page.getRecords());

	}

	@Test
	public void testGetAll() {
		QueryWrapper<User> wrapper = new QueryWrapper<>();
		wrapper.eq("gender","男");
		List<User> users = userMapper.selectList(wrapper);
		System.out.println(users);
	}

}

4. 分页插件

@Component
public class MpInterceptor {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}
// 测试
@Test
	void testPage() {
		IPage<User> page = new Page<>(2,3);
		userMapper.selectPage(page,null);
		System.out.println("当前页码: " + page.getCurrent());
		System.out.println("每页显示数: " + page.getSize());
		System.out.println("一共多少页: " + page.getPages());
		System.out.println("一共多少条: " + page.getTotal());
		System.out.println("数据: " + page.getRecords());

	}

5. 多条件查询(lambda版本)

@Test
	public void testGetAll() {
		// 方式一: 按条件查询
		// QueryWrapper<User> qw = new QueryWrapper<>();
		// qw.eq("gender","男");

		// 方式二:lambda格式条件查询
		// QueryWrapper<User> qw = new QueryWrapper<>();
		// qw.lambda().gt(User::getAge,25);

		// 方式三: lambda格式条件查询【推荐】
		LambdaQueryWrapper<User> qw = new LambdaQueryWrapper<>();
		qw.gt(User::getAge,25).lt(User::getAge,30);
		
		// qw.lt(User::getAge,25).or().gt(User::getAge,30);
		List<User> users = userMapper.selectList(qw);
		System.out.println(users);

	}

6 条件查询的null值处理

@Test
    public void testUq() {
        // 模拟页面传递过来的查询数据
        UserQuery uq = new UserQuery();
        //uq.setAge(25);
        uq.setAge2(30);

        // null判定(下限没有设置,查询不出结果数据)
        /*LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.lt(User::getAge,uq.getAge2());
        lqw.gt(User::getAge,uq.getAge());*/

        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.lt(uq.getAge2() != null, User::getAge, uq.getAge2());
        lqw.gt(uq.getAge() != null, User::getAge, uq.getAge());
        // lqw.lt(uq.getAge2() != null, User::getAge, uq.getAge2())
        //   .gt(uq.getAge() != null, User::getAge, uq.getAge());

        List<User> users = userMapper.selectList(lqw);
        System.out.println(users);
    }

7. Lambda查询投影

// 只将id和age查询出来,其他为null
@Test
    public void testQs(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.select(User::getId,User::getAge);
        List<User> userList = userMapper.selectList(lqw);
        System.out.println(userList);
    }
// 分组查询使用到投影
@Test
    public void testSelectCount() {
        QueryWrapper<User> lqw = new QueryWrapper<>();
        lqw.select("count(*) as count, gender");
        lqw.groupBy("gender");
        List<Map<String, Object>> maps =
                userMapper.selectMaps(lqw);
        System.out.println(maps);
    }
//[{gender=男, count=2}, {gender=女, count=2}]

8.条件查询

8.1 范围查询(>、=、between)

8.2 模糊查询 (like)

8.3 空判定(null)

8.4 包含性判定(in)

8.5 分组(group)

8.6 排序(order)

	@Test
    public void testCondition() {
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        String username = "乐";
        String password = "";
        lqw.eq(User::getUsername, username).eq(User::getPassword, password);
        User users = userMapper.selectOne(lqw);
        System.out.println(users);

        // 范围查询: lt le gt ge eq between
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.between(User::getAge,25,30);
        List<User> users1 = userMapper.selectList(wrapper);
        System.out.println(users1);

        // 模糊匹配 like
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.likeRight(User::getUsername,"周");
        User user = userMapper.selectOne(queryWrapper);
        System.out.println(user);

        // 更多查询条件设置参看 https://baomidou.com/pages/10c804/#abstractwrapper
    }

9. 字段映射和表名映射不一致

在这里插入图片描述

使用@TableField和@TableName

属性注解,位置:模型类属性定义上方,作用:设置当前属性对应的数据表的字段关系
范例:
@TableName("tb_user")
public class User {
	@TableFiled(value ="pwd", select = false) // 告诉mp pwd 不参与查询
	private String password;
	@TableFiled(exist = false)
	private Integer online; // 表示表里面不存在这个字段
}

10. id生成策略控制

10.1 不同的表应用不同的id生成策略

  • 日志:自增(1,2,3,4,5,6)
  • 购物订单:特殊规则(FQ235996299)
  • 外卖单:关联地区日期等信息(10 04 20200314 34 91)
  • 关系表:可省略id

10.2 mp支持的id生成策略

package com.baomidou.mybatisplus.annotation;

public enum IdType {
	/**
     * 数据库ID自增
     * <p>该类型请确保数据库设置了 ID自增 否则无效</p>
     */
    AUTO(0),
    /**
     * 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
     */
    NONE(1),
    /**
     * 用户输入ID
     * <p>该类型可以通过自己注册自动填充插件进行填充</p>
     */
    INPUT(2),
     /**
     * 分配ID (主键类型为number或string),
     * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
     *
     * @since 3.3.0
     */
    ASSIGN_ID(3),
    /**
     * 分配UUID (主键类型为 string)
     * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
     */
    ASSIGN_UUID(4);

    private final int key;

    private IdType(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }
}

10.3 配置id生成策略

如果想要使用数据库的自增策略,那么就可以使用type = IdType.AUTO,
如果需要让程序员自己指定id,那么就可以在实体类上使用type = IdType.INPUT,并且注意,将表上的id生成
	策略去掉
如果使用雪花算法生成,则可以使用type=IdType.ASSIGN_ID,这个会生成64bit的数,也就是说数据库表的id
必须是64位的int

如果想要使用uuid,可以使用type=IdType.ASSIGN_UUID.
  • 使用auto策略的时候,数据库指定auto_increment即可,插入数据不用插入id
  • 使用input策略的时候,数据库需要去掉自动策略,用户需要自己set id
  • 使用雪花算法生成id,需要将实体的id设置为Long类型,并且数据库和表id字段没有策略,指定全局配置
  • 使用uuid算法生成id,需要将实体类和表指定为string和Varchar类型

10.4 全局指定id生成策略

#applicaiton.yml文件
    db-config:
      id-type: assign_uuid
      table-prefix: tb_

11. 批量删除/查询

	@Test
    public void testBatchSearchOrDelete(){
        // 批量删除
         Object[] ids = new Object[]{8,2};
         userMapper.deleteBatchIds(Arrays.asList(ids));
         // 批量查询
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 10, 9));
        System.out.println(users);
    }

12.逻辑删除


	@TableLogic(value = "0",delval = "1")
    private Integer deleted;

	@Test
    public void testDelete(){
        userMapper.deleteById(1);
    }

12.1 逻辑删除全局配置

		# 输入logic-delete即可
      logic-delete-field: deleted
      logic-not-delete-value: 0
      logic-delete-value: 1

12.2 Mp中的逻辑删除说明

mp逻辑删除会将delete修改为update语句,并且在查询全部的时候,会加上条件 deleted = 0

13.乐观锁

执行原理(依赖版本信息)
==>  Preparing: UPDATE tb_user SET version=? WHERE id=? AND version=? AND deleted=0
==> Parameters: 2(Integer), 9(String), 1(Integer)

// 在数据库表中添加一个字段:
alter table tb_user add column version int default 1;
// 在实体类上添加一个属性:
@Version
private Integer version;
// 在mp拦截器上添加乐观锁拦截器
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

// 测试
	@Test
    void testOptimisticLock() {
        // 先查询,后更新
        boolean flag = false;
        while (!flag) {
        User user = userMapper.selectById("9");
        user.setId("9").setUsername("version修改");
            int count = userMapper.updateById(user);
            if (count == 1)
                flag = true;
        }
    }
// 查看输出结果:
==>  Preparing: SELECT id,username,password,gender,addr,age,deleted,version FROM tb_user WHERE id=? AND deleted=0
==> Parameters: 9(String)
<==    Columns: id, username, password, gender, addr, age, deleted, version
<==        Row: 9, 小奥, 456,, 北京, 36, 0, 2
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7397c6]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@295bf2a] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@36061cf3] will not be managed by Spring
==>  Preparing: UPDATE tb_user SET username=?, password=?, gender=?, addr=?, age=?, version=? WHERE id=? AND version=? AND deleted=0
==> Parameters: version修改(String), 456(String),(String), 北京(String), 36(Integer), 3(Integer), 9(String), 2(Integer)
<==    Updates: 1

14. 代码生成器

  • 模版: MyBatisPlus提供
  • 数据库配置:读取数据库获取信息
  • 开发者自定义配置:手工配置
    具体配置可以详见此链接

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

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

相关文章

重复性工作自动化解决方案——影刀

以前&#xff0c;影刀是一个邂逅的初见小工具&#xff0c;新奇在里头&#xff0c;踌躇在外头&#xff1b; 现在&#xff0c;影刀是一个稳定的职场贾维斯&#xff0c;高效在里头&#xff0c;悠闲在外头&#xff1b; 以后&#xff0c;影刀是一个潜力的知己老司机&#xff0c;有序…

【网络奇缘】我和英特网再续前缘

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络的概念 计算机网络的功能 ⭐1.数据通信 ⭐2.资源共享 ⭐3.分布式处理 ⭐4.提高可靠性 ⭐…

如何使用`open-uri`模块

首先&#xff0c;我们需要使用open-uri模块来打开网页&#xff0c;并使用Nokogiri模块来解析网页内容。然后&#xff0c;我们可以使用Nokogiri的css方法来选择我们想要的元素&#xff0c;例如标题&#xff0c;作者&#xff0c;内容等。最后&#xff0c;我们可以使用open-uri模块…

算法的入门基础了解

目录 算法的特征 如何设计算法&#xff1f; 伪代码 “算法”一词最早出现在《周髀算经》这本书中&#xff0c;对应的英文单词是“algorism”&#xff08;由 9 世纪的波斯数学家阿尔霍瓦里兹米提出&#xff09;&#xff0c;代指阿拉伯数字的运算规则。随着计算机的快速发展&a…

小白看CLIP代码解析

CLIP代码解析 CLIP演示代码&#xff08;以cifar100举例&#xff09;补充11. 为什么选用100*image_feature&#xff1f;2. 为什么使用L2规范点积&#xff0c;而不直接使用点积&#xff1f; cifar100的所有类别model.encode_image >> VisionTransformer补充21. 为什么加入c…

GoldWave v6.78 绿色免费便携版功能介绍及使用说明

GoldWave v6.78 绿色免费便携版是一款集声音编辑、播放、录制与转换为一体的音频编辑工具&#xff0c;还可以对音频内容进行转换格式等处理。该软件支持许多格式的音频文件&#xff0c;包括WAV, OGG, VOC, IFF, AIF, AFC, AU, SND, MP3,MAT, DWD, SMP, VOX, SDS, AVI, MOV等音频…

程序运行前后内存分区存储

程序运行前是源码 在程序运行后&#xff0c;生成了exe可执行程序 分为代码区和全局区 代码区&#xff1a; 存放CPU执行的机器指令代码区是共享的&#xff0c;共享的目的是对于频繁被执行的程序&#xff0c;只需要在内存中有一份代码就可以了代码区是只读的&#xff0c;其只读…

淘宝京东优惠券信息API接口系列

获取淘宝优惠券信息接口需要使用淘宝开放平台提供的API接口。以下是获取优惠券信息的步骤&#xff1a; 进入淘宝开放平台&#xff0c;注册并登录账号。在开放平台页面中&#xff0c;找到“优惠券”或“营销工具”等相关的API接口&#xff0c;根据需要进行选择。根据接口文档&a…

C语言——函数

导读 &#xff1a; 这篇文章主要讲解一下C语言函数的一些基本知识。 前言&#xff1a;函数的概念 C语言中的函数又常常被称为子程序&#xff0c;是用来完成某项特定的工作的一段代码。就像我们生活中的模块化建造技术&#xff0c;类比模块化建房子的过程&#xff1a;整个程序…

快速掌握队列的基础知识

目录 队列的特点基于链表实现队列用栈实现队列用队列实现栈 队列是一种线性数据结构&#xff0c;它只允许在一边进行插入操作&#xff08;队尾&#xff09;&#xff0c;另一边进行删除操作&#xff08;队头&#xff09;。插入操作称为入队&#xff0c;删除操作称为出队。队列遵…

数据分类分级方法及典型应用场景

1 2021-09-29 来源&#xff1a;数据学堂 [打印本稿][字号 大 中小] 《数据安全法》的第二十一条明确规定了由国家建立数据分类分级保护制度&#xff0c;根据数据在经济社会发展中的重要程度&#xff0c;以及一旦遭到篡改、破坏、泄露或者非法获取、非法利用&#xff0c;对国…

ISP 处理流程

#灵感# 摆烂时间太长了&#xff0c;感觉知识忘光光了。重新学习&#xff0c;常学常新。 因为公司文档都不让摘抄、截取&#xff0c;所以内容是工作的一些自己记录和网络内容&#xff0c;不对的欢迎批评指正。 1、ISP概述 ISP是Image Signal Processor 的简称&#xff0c;也就…

Python---综合案例:通讯录管理系统---涉及点:列表、字典、死循环

需求&#xff1a; 开个一个通讯录的管理系统&#xff0c;主要用于实现存储班级中同学的信息&#xff08;姓名、年龄、电话&#xff09; 涉及点&#xff1a;列表、字典、死循环 相关链接&#xff1a;Python--列表及其应用场景---增、删、改、查。-CSDN博客 Python---字典---…

回顾 — SFA:简化快速 AlexNet(模糊分类)

模糊图像的样本 一、说明 在本文回顾了基于深度学习的模糊图像分类&#xff08;SFA&#xff09;。在本文中&#xff1a;Simplified-Fast-AlexNet (SFA)旨在对图像是否因散焦模糊、高斯模糊、雾霾模糊或运动模糊而模糊进行分类。 二、大纲 图像模糊建模简要概述简化快速 AlexNet…

Model Inspector—软件模型静态规范检查工具

产品概述 Model Inspector&#xff08;MI&#xff09;原厂商是韩国Suresoft&#xff0c;是KOLAS国际公认测评机构&#xff0c;旨在提升安全关键领域软件可信度。MI用于开发过程中模型的静态检查&#xff0c;包括规范检查、复杂度度量&#xff0c;提供MAAB、HIS、CG、MISRA_AC_…

MCU通过KT6368A用SPP透传发送1K左右的数据,手机APP显示是3个包或者4个包,但是我看手册说最大一个包是512,理论应该是两个包吧,请问这正常吗?

一、问题简介 MCU通过KT6368A用SPP透传发送1K左右的数据&#xff0c;手机APP显示是3个包或者4个包&#xff0c;但是我看手册说最大一个包是512&#xff0c;理论应该是两个包吧&#xff0c;请问这正常吗&#xff1f; 详细说明 实际测试的截图如下&#xff1a;使用的是安卓app…

【MySQL】库的相关操作 + 库的备份和还原

库的操作 前言正式开始创建数据库删除数据库编码集查看系统默认字符集以及校验规则字符集校验规则 所有支持的字符集和校验规则所有字符集所有校验规则 指明字符集和校验规则创建数据库相同的字符集用不同的校验规则读取会出现什么情况 alter修改数据库show create databasealt…

深入理解Kafka3.6.0的核心概念,搭建与使用

Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需求场景&a…

OpenMMlab导出yolov3模型并用onnxruntime和tensorrt推理

导出onnx文件 直接使用脚本 import torch from mmdet.apis import init_detector, inference_detectorconfig_file ./configs/yolo/yolov3_mobilenetv2_8xb24-ms-416-300e_coco.py checkpoint_file yolov3_mobilenetv2_mstrain-416_300e_coco_20210718_010823-f68a07b3.pth…

跨境电商源码:多语言支持与扩展的终极解决方案

随着全球电商市场的不断扩大&#xff0c;跨境电商源码的需求日益增长。对于想要拓展国际业务的电商企业来说&#xff0c;多语言支持显得尤为重要。在这方面&#xff0c;我们的跨境电商源码产品具备显著优势&#xff0c;不仅全面支持多语言&#xff0c;还方便扩展多个语言的CSDN…