SpringBoot(4)整合数据源

news2024/12/24 9:36:47

SpringBoot整合数据源

  • 数据层解决方案
    • 数据源技术
    • 持久化技术
  • 数据库技术
  • NoSQL
      • 整合Redis
      • 整合MongDB
      • 整合ES

数据层解决方案

MySQL数据库与MyBatisPlus框架,后面又用了Druid数据源的配置,所以现在数据层解决方案可以说是Mysql+Druid+MyBatisPlus。而三个技术分别对应了数据层操作的三个层面:

  • 数据源技术:Druid
  • 持久化技术:MyBatisPlus
  • 数据库技术:MySQL

数据源技术

数据源配置格式:

格式一:

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC
      username: root
      password: 12345678

格式二:

spring:
  datasource:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/springbootdata?serverTimezone=UTC
      username: root
      password: 12345678
      type: com.alibaba.druid.pool.DruidDataSource

目前我们使用的数据源技术是Druid,运行时可以在日志中看到对应的数据源初始化信息,具体如下:
在这里插入图片描述
如果不使用Druid数据源,程序运行后是什么样子呢?是独立的数据库连接对象还是有其他的连接池技术支持呢?

将Druid技术对应的starter去掉再次运行程序可以在日志中找到如下初始化信息:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
springboot技术提供了3种内置的数据源技术,分别是Hikari、tomcat内置数据源、DBCP

  • HikartCP,这是springboot官方推荐的数据源技术,作为默认内置数据源使用。
  • Tomcat提供的DataSource,如果不想用HikartCP,并且使用tomcat作为web服务器进行web程序的开发,可以使用这个。为什么是Tomcat,不是其他web服务器呢?因为web技术导入starter后,默认使用内嵌tomcat,既然都是默认使用的技术了,那就一用到底,数据源也用它的。有人就提出怎么才能不使用HikartCP用tomcat提供的默认数据源对象呢?把HikartCP技术的坐标排除掉就OK了。
  • DBCP,这个使用的条件就更苛刻了,既不使用HikartCP也不使用tomcat的DataSource时,默认给你用这个。

配置druid时使用druid的starter对应的配置如下:

spring:
  datasource:
    druid:	
   	  url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: root

换成是默认的数据源HikariCP后,直接吧druid删掉就行了,如下:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root

也可以写上是对hikari做的配置,但是url地址要单独配置,如下:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
    hikari:
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: root

如果想对hikari做进一步的配置,可以继续配置其独立的属性。例如:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
    hikari:
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: root
      maximum-pool-size: 50

如果不想使用hikari数据源,使用tomcat的数据源或者DBCP配置格式也是一样的。

持久化技术

springboot充分发挥其最强辅助的特征,给开发者提供了一套现成的数据层技术,叫做JdbcTemplate。​这个技术其实就是回归到jdbc最原始的编程形式来进行数据层的开发,操作步骤如下:

1.导入jdbc对应的坐标,记得是starter

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

2.自动装配JdbcTemplate对象

@SpringBootTest
class Springboot15SqlApplicationTests {
    @Test
    void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){
    }
}

3.使用JdbcTemplate实现查询操作(非实体类封装数据的查询操作)

@Test
void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){
    String sql = "select * from tbl_book";
    List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
    System.out.println(maps);
}

4.使用JdbcTemplate实现查询操作(实体类封装数据的查询操作)

@Test
void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){

    String sql = "select * from tbl_book";
    RowMapper<Book> rm = new RowMapper<Book>() {
        @Override
        public Book mapRow(ResultSet rs, int rowNum) throws SQLException {
            Book temp = new Book();
            temp.setId(rs.getInt("id"));
            temp.setName(rs.getString("name"));
            temp.setType(rs.getString("type"));
            temp.setDescription(rs.getString("description"));
            return temp;
        }
    };
    List<Book> list = jdbcTemplate.query(sql, rm);
    System.out.println(list);
}

在这里插入图片描述
5.使用JdbcTemplate实现增删改操作

@Test
void testJdbcTemplateSave(@Autowired JdbcTemplate jdbcTemplate){
    String sql = "insert into tbl_book values(3,'springboot1','springboot2','springboot3')";
    jdbcTemplate.update(sql);
}

6.如果想对JdbcTemplate对象进行相关配置,可以在yml文件中进行设定,具体如下:

spring:
  jdbc:
    template:
      query-timeout: -1   # 查询超时时间
      max-rows: 500       # 最大行数
      fetch-size: -1      # 缓存行数

数据库技术

springboot提供了3款内置的数据库,分别是 H2,HSQL,Derby
​以上三款数据库除了可以独立安装之外,还可以像是tomcat服务器一样,采用内嵌的形式运行在spirngboot容器中。内嵌在容器中运行,那必须是java对象啊,这三款数据库底层都是使用java语言开发的。

我们一直使用MySQL数据库就挺好的,为什么有需求用这个呢?原因就在于这三个数据库都可以采用内嵌容器的形式运行,在应用程序运行后,如果我们进行测试工作,此时测试的数据无需存储在磁盘上,但是又要测试使用,内嵌数据库就方便了,运行在内存中,该测试测试,该运行运行,等服务器关闭后,一切烟消云散,多好,省得你维护外部数据库了。这也是内嵌数据库的最大优点,方便进行功能测试。

下面以H2数据库为例讲解如何使用这些内嵌数据库,操作步骤也非常简单,简单才好用

1.导入H2数据库对应的坐标,一共2个

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

2.将工程设置为web工程,启动工程时启动H2数据库

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

3.通过配置开启H2数据库控制台访问程序,也可以使用其他的数据库连接软件操作

spring:
  h2:
    console:
      enabled: true
      path: /h2

web端访问路径/h2,访问密码123456,如果访问失败,先配置下列数据源,启动程序运行后再次访问/h2路径就可以正常访问了(注意要启动服务器)

datasource:
  url: jdbc:h2:~/test
  hikari:
    driver-class-name: org.h2.Driver
    username: sa
    password: 123456

注意: SpringBoot可以根据url地址自动识别数据库种类,在保障驱动类存在的情况下,可以省略配置
在这里插入图片描述
创建表
在这里插入图片描述
添加两条数据

在这里插入图片描述
在这里插入图片描述

4.使用JdbcTemplate或MyBatisPlus技术操作数据库(略)

mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_
      id-type: auto
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

测试:

    @Test
    void testJdbcTemplateSave(@Autowired JdbcTemplate jdbcTemplate){
        String sql = "insert into tbl_book values(3,'springboot1','springboot2','springboot3')";
        jdbcTemplate.update(sql);
    }

在这里插入图片描述

其实我们只是换了一个数据库而已,其他的东西都不受影响。一个重要提醒,别忘了,上线时,把内存级数据库关闭,采用MySQL数据库作为数据持久化方案,关闭方式就是设置enabled属性为false即可。
在这里插入图片描述

NoSQL

从字面来看,No表示否定,NoSQL就是非关系型数据库解决方案,意思就是数据该存存该取取,只是这些数据不放在关系型数据库中了,那放在哪里?自然是一些能够存储数据的其他相关技术中了,比如Redis等。

整合Redis

Redis是一款采用key-value数据存储格式的内存级NoSQL数据库,重点关注数据存储格式,是key-value格式,也就是键值对的存储形式。与MySQL数据库不同,MySQL数据库有表、有字段、有记录,Redis没有这些东西,就是一个名称对应一个值,并且数据以存储在内存中使用为主。什么叫以存储在内存中为主?其实Redis有它的数据持久化方案,分别是RDB和AOF,但是Redis自身并不是为了数据持久化而生的,主要是在内存中保存数据,加速数据访问的,所以说是一款内存级数据库。

redis技术专栏:https://blog.csdn.net/weixin_43994244/category_12071099.html?spm=1001.2014.3001.5482

1.导入springboot整合redis的starter坐标

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

上述坐标可以在创建模块的时候通过勾选的形式进行选择,归属NoSQL分类中
在这里插入图片描述
2.redis信息配置

spring:
  redis:
    host: localhost
    port: 6379

以上两组信息都有默认配置,刚好就是上述配置值。

3.使用springboot整合redis的专用客户端接口操作,此处使用的是RedisTemplate

@SpringBootTest
class Springboot16RedisApplicationTests {
    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    void set() {
    	//选择操作数据类型
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set("age",41);
    }
    @Test
    void get() {
        ValueOperations ops = redisTemplate.opsForValue();
        Object age = ops.get("age");
        System.out.println(age);//41
    }
    @Test
    void hset() {
        HashOperations ops = redisTemplate.opsForHash();
        ops.put("info","b","bb");
    }
    @Test
    void hget() {
        HashOperations ops = redisTemplate.opsForHash();
        Object val = ops.get("info", "b");
        System.out.println(val);//bb
    }
}

在操作redis时,需要先确认操作何种数据,根据数据种类得到操作接口。例如使用opsForValue()获取string类型的数据操作接口,使用opsForHash()获取hash类型的数据操作接口,剩下的就是调用对应api操作了。各种类型的数据操作接口如下:
在这里插入图片描述

由于redis内部不提供java对象的存储格式,因此当操作的数据以对象的形式存在时,会进行转码,转换成字符串格式后进行操作。为了方便开发者使用基于字符串为数据的操作,springboot整合redis时提供了专用的API接口StringRedisTemplate,可以理解为这是RedisTemplate的一种指定数据泛型的操作API。
在这里插入图片描述

@SpringBootTest
public class StringRedisTemplateTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Test
    void get(){
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        String name = ops.get("name");
        System.out.println(name);
    }
}

redis客户端选择
springboot整合redis技术提供了多种客户端兼容模式,默认提供的是lettucs客户端技术,也可以根据需要切换成指定客户端技术,例如jedis客户端技术,切换成jedis客户端技术操作步骤如下:
1.导入坐标,jedis坐标受springboot管理,无需提供版本号

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

2.配置客户端技术类型,设置为jedis

spring:
  redis:
    host: localhost
    port: 6379
    client-type: jedis

3.根据需要设置对应的配置

spring:
  redis:
    host: localhost
    port: 6379
    client-type: jedis
    #lettuce:
    #  pool:
    #    max-active: 16
    jedis:
      pool:
        max-active: 16

lettcus与jedis区别

  • jedis连接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池使每个连接专用,这样整体性能就大受影响
  • lettcus基于Netty框架进行与Redis服务器连接,底层设计中采用StatefulRedisConnection。 StatefulRedisConnection自身是线程安全的,可以保障并发访问安全问题,所以一个连接可以被多线程复用。当然lettcus也支持多连接实例一起工作

总结

  1. 导入springboot整合redis的starter坐标
  2. 进行基础配置
  3. 使用springboot整合redis的专用客户端接口RedisTemplate操作

整合MongDB

使用Redis技术可以有效的提高数据访问速度,但是由于Redis的数据格式单一性,无法操作结构化数据,当操作对象型的数据时,Redis就显得捉襟见肘。

MongoDB是一个开源、高性能、无模式的文档型数据库,它是NoSQL数据库产品中的一种,是最像关系型数据库的非关系型数据库。

什么叫无模式呢?简单说就是作为一款数据库,没有固定的数据存储结构,第一条数据可能有A、B、C一共3个字段,第二条数据可能有D、E、F也是3个字段,第三条数据可能是A、C、E3个字段,也就是说数据的结构不固定,这就是无模式。有人会说这有什么用啊?灵活,随时变更,不受约束。基于上述特点,MongoDB的应用面也会产生一些变化。以下列出了一些可以使用MongoDB作为数据存储的场景,但是并不是必须使用MongoDB的场景:

  • 淘宝用户数据
    • 存储位置:数据库
    • 特征:永久性存储,修改频度极低
  • 游戏装备数据、游戏道具数据
    • 存储位置:数据库、Mongodb
    • 特征:永久性存储与临时存储相结合、修改频度较高
  • 直播数据、打赏数据、粉丝数据
    • 存储位置:数据库、Mongodb
    • 特征:永久性存储与临时存储相结合,修改频度极高
  • 物联网数据
    • 存储位置:Mongodb
    • 特征:临时存储,修改频度飞速

1.导入springboot整合MongoDB的starter坐标

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

上述坐标也可以在创建模块的时候通过勾选的形式进行选择,同样归属NoSQL分类中
在这里插入图片描述
2.基础配置

spring:
  data:
    mongodb:
      uri: mongodb://localhost/itheima

3.使用springboot整合MongoDB的专用客户端接口MongoTemplate来进行操作

@SpringBootTest
class Springboot17MongodbApplicationTests {
    @Autowired
    private MongoTemplate mongoTemplate;
    @Test
    void contextLoads() {
        Book book = new Book();
        book.setId(2);
        book.setName("springboot2");
        book.setType("springboot2");
        book.setDescription("springboot2");
        mongoTemplate.save(book);
    }
    @Test
    void find(){
        List<Book> all = mongoTemplate.findAll(Book.class);
        System.out.println(all);
    }
}

总结

  1. 导入springboot整合MongoDB的starter坐标
  2. 进行基础配置
  3. 使用springboot整合MongoDB的专用客户端接口MongoTemplate操作

整合ES

Redis可以使用内存加载数据并实现数据快速访问,MongoDB可以在内存中存储类似对象的数据并实现数据的快速访问。还有ES技术加速数据查询。

ES(Elasticsearch)是一个分布式全文搜索引擎,重点是全文搜索。比如用户要买一本书,以Java为关键字进行搜索,不管是书名中还是书的介绍中,甚至是书的作者名字,只要包含java就作为查询结果返回给用户查看,上述过程就使用了全文搜索技术。搜索的条件不再是仅用于对某一个字段进行比对,而是在一条数据中使用搜索条件去比对更多的字段,只要能匹配上就列入查询结果,这就是全文搜索的目的。而ES技术就是一种可以实现上述效果的技术。

ES技术专栏:https://blog.csdn.net/weixin_43994244/category_12282070.html?spm=1001.2014.3001.5482

1.导入springboot整合ES的starter坐标

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

2.进行基础配置

spring:
  elasticsearch:
    rest:
      uris: http://localhost:9200

3.使用springboot整合ES的专用客户端接口ElasticsearchRestTemplate来进行操作

@SpringBootTest
class Springboot18EsApplicationTests {
    @Autowired
    private ElasticsearchRestTemplate template;
}

上述操作形式是ES早期的操作方式,使用的客户端被称为Low Level Client,这种客户端操作方式性能方面略显不足,于是ES开发了全新的客户端操作方式,称为High Level Client。高级别客户端与ES版本同步更新,但是springboot最初整合ES的时候使用的是低级别客户端,所以企业开发需要更换成高级别的客户端模式。

下面使用高级别客户端方式进行springboot整合ES,操作步骤如下:
1.导入springboot整合ES高级别客户端的坐标,此种形式目前没有对应的starter

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

2.使用编程的形式设置连接的ES服务器,并获取客户端对象
配置ES服务器地址与端口9200,记得客户端使用完毕需要手工关闭。由于当前客户端是手工维护的,因此不能通过自动装配的形式加载对象。

@SpringBootTest
class Springboot18EsApplicationTests {
    private RestHighLevelClient client;
      @Test
      void testCreateClient() throws IOException {
          HttpHost host = HttpHost.create("http://localhost:9200");
          RestClientBuilder builder = RestClient.builder(host);
          client = new RestHighLevelClient(builder);
  
          client.close();
      }
}

3.使用客户端对象操作ES,例如创建索引

@SpringBootTest
class Springboot18EsApplicationTests {
    private RestHighLevelClient client;
      @Test
      void testCreateIndex() throws IOException {
          HttpHost host = HttpHost.create("http://localhost:9200");
          RestClientBuilder builder = RestClient.builder(host);
          client = new RestHighLevelClient(builder);
          
          CreateIndexRequest request = new CreateIndexRequest("books");
          client.indices().create(request, RequestOptions.DEFAULT); 
          
          client.close();
      }
}

当前操作我们发现,无论进行ES何种操作,第一步永远是获取RestHighLevelClient对象,最后一步永远是关闭该对象的连接。在测试中可以使用测试类的特性去帮助开发者一次性的完成上述操作,但是在业务书写时,还需要自行管理。将上述代码格式转换成使用测试类的初始化方法和销毁方法进行客户端对象的维护。

@SpringBootTest
class Springboot18EsApplicationTests {
    @BeforeEach		//在测试类中每个操作运行前运行的方法
    void setUp() {
        HttpHost host = HttpHost.create("http://localhost:9200");
        RestClientBuilder builder = RestClient.builder(host);
        client = new RestHighLevelClient(builder);
    }

    @AfterEach		//在测试类中每个操作运行后运行的方法
    void tearDown() throws IOException {
        client.close();
    }

    private RestHighLevelClient client;

    @Test
    void testCreateIndex() throws IOException {
        CreateIndexRequest request = new CreateIndexRequest("books");
        client.indices().create(request, RequestOptions.DEFAULT);
    }
}

总结:

  1. 导入springboot整合ES的High Level Client坐标
  2. 手工管理客户端对象,包括初始化和关闭操作
  3. 使用High Level Client根据操作的种类不同,选择不同的Request对象完成对应操作

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

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

相关文章

一文彻底了解派克Parker无铁芯/有铁芯直线电机及其应用

一、什么是直线电机&#xff1f; 直线电机是一种将电能直接转换成直线运动机械能&#xff0c;而不需要任何中间转换机构的传动装置。它可以看成是一台旋转电机按径向剖开&#xff0c;并展成平面而成。 二、直线电机的特点 直线电机类似于一台旋转电机解剖摊开来进行运转。在一…

9、DRF实战总结:过滤(filter)与排序,以及第三方库django-filter的使用(附源码)

在前面的DRF系列教程中&#xff0c;以博客为例介绍了序列化器(Serializer), 并使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API接口&#xff0c;并详细对权限、认证(含jwt认证)和分页进行了总结与演示。在本篇文章中将向演示如何在Django REST …

Boost库在windows上的使用

今天要配置一个C环境&#xff0c;被Boost库困扰了一段时间&#xff0c;在这里记录一下解决的方法。 主要是打不开 libboost_iostreams-vc143-mt-gd-x64-1_82.lib这样的问题。 操作的步骤如下&#xff1a; 下载binary包&#xff1a; 链接: https://boostorg.jfrog.io/artifac…

ChatGPT有用到知识图谱吗?它自己是这样回答...

从搜索引擎到个人助手&#xff0c;我们每天都在使用问答系统。问答系统必须能够访问相关的知识并进行推理。通常&#xff0c;知识可以隐式地编码在大型语言模型&#xff08;LLMs&#xff09;中&#xff0c;例如ChatGPT、T5 和LaMDA 等大型语言模型&#xff0c;这些模型在未结构…

如何面对人生困境至暗时刻

北方春天伊始刚好想发表下另一种境遇就是当人生面临困境或者至暗怎么样走出来&#xff0c;如果有正面临这样的情况来分享下如何走出阴霾&#xff0c;拥有更多可能性的人生&#xff0c;现在回望过去一年的自己太过牵强失去自我。 对世界的应该思维&#xff1a;为什么我总看不清现…

PHP快速入门10-图像处理,附图像大小调整、旋转、获取颜色等15个常见示例

文章目录前言一、PHP的图像处理1.1 图像处理函数二、 图像处理示例2.1 创建一个空白的图像2.2 从文件创建一个新的图像2.3 从URL创建一个新的图像2.4 调整图像大小2.5 对比度和亮度调整2.6 度数旋转2.7 模糊滤镜2.8 获取图像的颜色信息2.9. 图像合并2.10 图像旋转和裁剪2.11 图…

css补充内容

1.最好给body设置min-width,防止缩小页面时出现空白 2.让图片随着网页缩小而缩小 3.html5语义化元素 4.video与audio video是行内替换元素 默认是第一帧静态画面,需要手动调整画面大小和添加播放条,是否自动播放 大多数浏览器不支持自动播放,除非设置为muted,这是为了用户的…

小巧“抠门”的FTHR-F0140开发板

小巧“抠门”的FTHR-F0140开发板 文章目录小巧“抠门”的FTHR-F0140开发板缘起硬件电路主控芯片供电系统调试器插座LED灯按键CAN接口电路软件资源资源链接缘起 工欲善其事&#xff0c;必先利其器。调试和开发MM32F0140这种小巧的芯片&#xff0c;还是需要小巧的板子去适配&…

本科也可入行的IC模拟版图,需要学习哪些知识?

IC模拟版图是一个入门非常简单&#xff0c;但同时又是一份涉及知识面非常广阔&#xff0c;资深较难的工作。 在众多IC岗位中&#xff0c;模拟版图确实属于容易入门&#xff0c;吸引来很多想要转行IC行业的朋友&#xff0c;但需要掌握的知识点和技巧并不比设计少&#xff0c;属…

Python+Selenium+Unittest 之selenium5--元素定位4-XPath定位1(基本概念)

目录 一、简介 二、节点关系 三、绝对路径与相对路径 一、简介 Xpath定位在selenium中属于常用的定位方式&#xff0c;首先来说下Xpath的一些概念&#xff0c;Xpath即为XML路径语言&#xff08;XML Path Language&#xff09;&#xff0c;它是一种用来确定XML文档中某部分位置…

Vision Transformers for Dense Prediction论文笔记

文章目录Vision Transformers for Dense Prediction&#xff0c; ICCV&#xff0c; 2021一、背景介绍二、网络结构三、实验结果1.语义分割实验2.消融实验Vision Transformers for Dense Prediction&#xff0c; ICCV&#xff0c; 2021 一、背景介绍 本篇论文主要提出一种网络…

SpringBoot 集成webSocket

pom.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 …

IT软件行业用契约锁实现“代理-销售-投标-项目-合作”电子签

IT软件行业产品销售渠道多、销售订单体量大&#xff0c;从产品研发、销售到项目实施&#xff0c;伴随着大量的协议、合同、单据需要与员工、客户或者经销商签署。引入电子签章&#xff0c;化解纸质合同签署带来的效率、成本、安全等问题&#xff0c;成为软件行业产品代理、销售…

Vector - CAPL - Panel面板_01

前面有过简单的介绍panel面板的功能&#xff0c;不过终究感觉有点简陋&#xff0c;最近也在搞PyQT5&#xff0c;发现如果对于这块了解不多的情况下&#xff0c;想要做一些东西的话&#xff0c;简直无从下手&#xff0c;因此专门翻阅了之前的文章&#xff0c;查看了下确实缺少了…

ChatGPT自动化提高工作效率: 2分钟快速生成思维导图

一、简要说明 ChatGPT不止是一个聊天机器人&#xff0c;更是一个自然语言处理、文本内容生成模型&#xff0c;它可以理解语言规则&#xff0c;不仅仅是给你输出已有的知识内容&#xff0c;还会给到你一些创意点子&#xff1b;所以我们应该学会如何使用它&#xff0c;让它更好的…

集合例题,

package com.hspedu.homework;import java.util.*;/*** author 韩顺平* version 1.0*/ SuppressWarnings({"all"}) public class Homework03 {public static void main(String[] args) {Map m new HashMap();m.put("jack", 650);//int->Integerm.put(&…

STL源码剖析-六大部件, 部件的关系,复杂度, 区间表示

C标准库-体系结构与内核分析 根据源代码来分析 介绍 自学C侯捷老师的STL源码剖析的个人笔记&#xff0c;方便以后进行学习&#xff0c;查询。 为什么要学STL&#xff1f;按侯捷老师的话来说就是&#xff1a;使用一个东西&#xff0c;却不明白它的道理&#xff0c;不高明&…

分享一个Vue输入框获取焦点自动选中指令

需求背景&#xff1a;最近项目中遇到很多输入类控件&#xff0c;且有频繁改动需求&#xff0c;如果数值过长&#xff0c;则需要一直按着删除键&#xff0c;于是想能不能获取焦点的时候&#xff0c;就直接选中&#xff0c;这样就可以直接删除了 1、思路分析 记得很早的时候做小…

顺序表的实现

思维导图&#xff1a; 一&#xff0c;顺序表 一&#xff0c;顺序表的创建&#xff08;位置&#xff1a;头文件内&#xff09; 1.1顺序表的结构体类型 要求&#xff1a;创建顺序表并使这个顺序表能够存放数据&#xff0c;能记录有效数据的个数&#xff0c;能够记录容量大小。…

记 ==> 首次使用rabbitMQ优化项目

昨天刚学习完了rabbitMQ&#xff0c;刚好我的项目有个模块挺符合使用rabbitMQ进行异步处理的。 这个模块大概功能是&#xff1a;用户发送的所有帖子都会添加到他的发件箱&#xff0c;当有个新用户关注了他&#xff0c;他发件箱内所有的博客都会被添加到关注他的用户的收件箱里…