mongodb-java apispringboot整合mongodb

  • mongodb入门
  • mongodb-java api的使用
  • springboot整合mongodb
  • 评论

一 MongoDB

1.1 MongoDB简介

​ MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

​ MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。

​ MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

官网:https://www.mongodb.com

1.2 MongoDB安装

1.2.1 windows安装mongodb

官网下载mongodb安装包

https://www.mongodb.com/try/download/community

1 将mongodb压缩包解压到指定目录即可

2 配置环境变量 将mongodb/bin目录配置到path中

在这里插入图片描述

3 启动 ,双击bin/mongod.exe

如果启动时,报错

在这里插入图片描述

说明是mongodb启动时会默认加载这个路径作为存储数据的地方,而当前路径没有,就需要手动新建一个目录

4 启动完成以后,可以双击mongo.exe,打开命令行连接本机mongodb,测试本机mongodb是否启动成功

在这里插入图片描述

1.2.2 docker安装mongodb
# 安装mongodb容器
docker run  -id --name=mongodb --hostname=mongodb -p 27017:27017 mongo# 进入mongodb容器
docker exec -it mongodb /bin/bash# 进入mongodb命令行
mongo# 查看当前mongodb中所有的数据库
show dbs# 安装mongodb容器并设置用户名,密码
docker run  -id --name=mongodb --hostname=mongodb -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 mongo# mongodb设置了密码以后,怎么连接?
docker exec -it mongodb /bin/bash   # 进入mongodb容器
mongo    # 进入mongodb命令行
use admin    # 切换到admin数据库
db.auth("用户名","密码")  # 输入用户名和密码,如果返回1就说明登录成功

1.3 MongoDB基本使用

1.3.1 基本概念

在使用Mongodb以前,为了方便理解,先对应关系型数据库了解下相关概念

sql概念mongodb概念说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据行/文档
columnfield列/字段
indexindex索引
table joins表关联,mongodb不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

在这里插入图片描述

1.3.2 数据库和表操作

查看所有数据库 show dbs

> show dbs
admin  0.000GB
local  0.000GB

切换数据库 use 数据库名

> use admin
switched to db admin

创建数据库和表

在MongoDB中,数据库是自动创建的,通过use切换到新数据库中,进行插入数据即可自动创建数据库和表

# 查看所有的数据库,当前没有test数据库
> show dbs
admin  0.000GB
local  0.000GB# 切换到test数据库
> use test
switched to db test# 再次查看所有数据库,还是没有test,说明use只是切换数据库,不会创建数据库
> show dbs
admin  0.000GB
local  0.000GB# 直接向test数据库中的user表插入数据
> db.user.insert({id:1,name:"zhangsan"})
WriteResult({ "nInserted" : 1 })# 查看所有数据库,当前有了test数据库
> show dbs
admin  0.000GB
local  0.000GB
test   0.000GB

删除数据库

> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
> show dbs
admin  0.000GB
local  0.000GB

查看所有的表 show tables/collections

> show tables
user
> show collections
user

删除表 drop

> db.user.drop()
true
> show tables
1.3.3 文档操作
1.3.3.1 新增数据

insert/save 如果当前没有这个表,那么当第一次新增数据时,会自动新建表

> db.user.insert({id:1,name:"zhangsan"})
WriteResult({ "nInserted" : 1 })
> db.user.save({id:2,name:"lisi"})
WriteResult({ "nInserted" : 1 })
> db.user.find()
{ "_id" : ObjectId("6638c98397dbe43ebeabeadf"), "id" : 1, "name" : "zhangsan" }
{ "_id" : ObjectId("6638c98f97dbe43ebeabeae0"), "id" : 2, "name" : "lisi" }
1.3.3.2 更新数据
db.表名.update({query},{set})
query: 就相当于sql中写在where条件后面
set : 就是修改后的字段值,相当于Sql中set # 更新数据,更新id=1的name为zs
> db.user.update({id:1},{$set:{name:"zs"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find()
{ "_id" : ObjectId("6638c98397dbe43ebeabeadf"), "id" : 1, "name" : "zs" }
{ "_id" : ObjectId("6638c98f97dbe43ebeabeae0"), "id" : 2, "name" : "lisi" }# 更新id=2的数据,年龄为30,但是其他字段都会删除掉
> db.user.update({id:2},{age:30})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find()
{ "_id" : ObjectId("6638c98397dbe43ebeabeadf"), "id" : 1, "name" : "zs" }
{ "_id" : ObjectId("6638c98f97dbe43ebeabeae0"), "age" : 30 }# 更新id=1的数据,age=35,如果age字段不存在,会默认新增该字段
> db.user.update({id:1},{$set:{age:35}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find()
{ "_id" : ObjectId("6638c98397dbe43ebeabeadf"), "id" : 1, "name" : "zs", "age" : 35 }
{ "_id" : ObjectId("6638c98f97dbe43ebeabeae0"), "age" : 30 }
1.3.3.3 删除数据
# 删除id=1
> db.user.remove({id:1})
WriteResult({ "nRemoved" : 1 })
> db.user.find()
{ "_id" : ObjectId("6638c98f97dbe43ebeabeae0"), "age" : 30 }# 删除所有
> db.user.remove({})
WriteResult({ "nRemoved" : 1 })
> db.user.find()
1.3.3.4 查询数据
#查询语句结构
db.user.find([query],[fields])query 是查询的条件
fields 是查询的字段# 造数据
> db.user.insert({id:1,name:"zs",age:20})
WriteResult({ "nInserted" : 1 })
> db.user.insert({id:2,name:"ls",age:35})
WriteResult({ "nInserted" : 1 })
> db.user.insert({id:3,name:"ww",age:28})
WriteResult({ "nInserted" : 1 })
> db.user.insert({id:4,name:"zl",age:32})
WriteResult({ "nInserted" : 1 })# 查询所有
> db.user.find()
{ "_id" : ObjectId("6638cc3497dbe43ebeabeae5"), "id" : 1, "name" : "zs", "age" : 20 }
{ "_id" : ObjectId("6638cc3d97dbe43ebeabeae6"), "id" : 2, "name" : "ls", "age" : 35 }
{ "_id" : ObjectId("6638cc4897dbe43ebeabeae7"), "id" : 3, "name" : "ww", "age" : 28 }
{ "_id" : ObjectId("6638cc5797dbe43ebeabeae8"), "id" : 4, "name" : "zl", "age" : 32 }# 只查询id,name字段
> db.user.find({},{id:1,name:1})
{ "_id" : ObjectId("6638cc3497dbe43ebeabeae5"), "id" : 1, "name" : "zs" }
{ "_id" : ObjectId("6638cc3d97dbe43ebeabeae6"), "id" : 2, "name" : "ls" }
{ "_id" : ObjectId("6638cc4897dbe43ebeabeae7"), "id" : 3, "name" : "ww" }
{ "_id" : ObjectId("6638cc5797dbe43ebeabeae8"), "id" : 4, "name" : "zl" }# 查询条数
> db.user.find().count()
4# 查询ID=1的数据
> db.user.find({id:1})
{ "_id" : ObjectId("6638cc3497dbe43ebeabeae5"), "id" : 1, "name" : "zs", "age" : 20 }# 查询年龄在25-35之间的数据
> db.user.find({age:{$lte:35,$gte:25}})
{ "_id" : ObjectId("6638cc3d97dbe43ebeabeae6"), "id" : 2, "name" : "ls", "age" : 35 }
{ "_id" : ObjectId("6638cc4897dbe43ebeabeae7"), "id" : 3, "name" : "ww", "age" : 28 }
{ "_id" : ObjectId("6638cc5797dbe43ebeabeae8"), "id" : 4, "name" : "zl", "age" : 32 }# 查询年龄<=35,且id>=3的
> db.user.find({age:{$lte:35},id:{$gte:3}})
{ "_id" : ObjectId("6638cc4897dbe43ebeabeae7"), "id" : 3, "name" : "ww", "age" : 28 }
{ "_id" : ObjectId("6638cc5797dbe43ebeabeae8"), "id" : 4, "name" : "zl", "age" : 32 }# 查询id=1 or id=2的数据
> db.user.find({$or:[{id:1},{id:2}]})
{ "_id" : ObjectId("6638cc3497dbe43ebeabeae5"), "id" : 1, "name" : "zs", "age" : 20 }
{ "_id" : ObjectId("6638cc3d97dbe43ebeabeae6"), "id" : 2, "name" : "ls", "age" : 35 }# 分页查询  skip()跳过几条数据,可以理解为从第几条开始查询  limit()查询的条数
> db.user.find().skip(2).limit(2)
{ "_id" : ObjectId("6638cc4897dbe43ebeabeae7"), "id" : 3, "name" : "ww", "age" : 28 }
{ "_id" : ObjectId("6638cc5797dbe43ebeabeae8"), "id" : 4, "name" : "zl", "age" : 32 }# 按照年龄倒序排  -1倒序排列  1 正序排列
> db.user.find().sort({age:-1})
{ "_id" : ObjectId("6638cc3d97dbe43ebeabeae6"), "id" : 2, "name" : "ls", "age" : 35 }
{ "_id" : ObjectId("6638cc5797dbe43ebeabeae8"), "id" : 4, "name" : "zl", "age" : 32 }
{ "_id" : ObjectId("6638cc4897dbe43ebeabeae7"), "id" : 3, "name" : "ww", "age" : 28 }
{ "_id" : ObjectId("6638cc3497dbe43ebeabeae5"), "id" : 1, "name" : "zs", "age" : 20 }
1.3.4 索引操作

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取

那些符合查询条件的记录。

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站

的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排

序的一种结构

# 查看索引  说明:1表示升序创建索引,-1表示降序创建索引。
> db.user.getIndexes()
[{"v" : 2,"key" : {"_id" : 1},"name" : "_id_","ns" : "test.user"}
]# 创建索引 按照年龄升序创建索引
> db.user.createIndex({age:1})
{"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1
}
> db.user.getIndexes()
[{"v" : 2,"key" : {"_id" : 1},"name" : "_id_","ns" : "test.user"},{"v" : 2,"key" : {"age" : 1},"name" : "age_1","ns" : "test.user"}
]#删除索引
db.user.dropIndex("age_1")
#或者,删除除了_id之外的索引
db.user.dropIndexes()#创建联合索引
db.user.createIndex({'age':1, 'id':-1})#查看索引大小,单位:字节
db.user.totalIndexSize()

1.4 Mongodb图形客户端的使用

1.4.1 安装mongoDB客户端

Robo 3T是MongoDB的客户端工具,我们可以使用它来操作MongoDB。

在这里插入图片描述

注意:如果连接的是远程云服务器的话,一定要在安全组中放行mongodb的端口27017

1.4.2 客户端基本使用

在这里插入图片描述

在这里插入图片描述

二 java操作MongoDB

1 javaApi操作MongoDB

导依赖

    <dependencies><dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId><version>3.9.1</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.4</version></dependency></dependencies>
1.1 文档操作

连接MongoDB

@Testpublic void test() throws Exception{// 创建MongoDb客户端MongoClient mongoClient = MongoClients.create("mongodb://root:123456@116.205.236.142:27017");// 选择要操作的数据库MongoDatabase database = mongoClient.getDatabase("test");// 选择要操作的表MongoCollection<Document> collection = database.getCollection("user");System.out.println(collection);// 关闭客户端连接mongoClient.close();}

文档crud

public class MongodbTest {private static MongoClient mongoClient = null;public MongoCollection<Document> getCollection() throws Exception{// 创建MongoDb客户端mongoClient = MongoClients.create("mongodb://116.205.236.142:27017");// 选择要操作的数据库MongoDatabase database = mongoClient.getDatabase("test");// 选择要操作的表MongoCollection<Document> collection = database.getCollection("user");System.out.println(collection);return collection;}@Testpublic void testAdd() throws Exception{// 连接mongodb,获取要操作的表MongoCollection<Document> collection = getCollection();// 构造要新增的数据Document document = new Document("id", 5).append("name", "tq").append("age", 24);// 插入数据collection.insertOne(document);// 关闭客户端连接mongoClient.close();}@Testpublic void testUpdate() throws Exception{// 连接mongodb,获取要操作的表MongoCollection<Document> collection = getCollection();// 构建修改的条件Bson bson = Filters.eq("id", 5);// 构建修改后的对象Bson bson1 = Updates.set("age", 26);// 修改数据collection.updateOne(bson,bson1 );// 关闭客户端mongoClient.close();}@Testpublic void testDelete() throws Exception{// 连接mongodb,获取要操作的表MongoCollection<Document> collection = getCollection();// 删除id=5的数据collection.deleteOne(Filters.eq("id", 5));// 关闭客户端mongoClient.close();}@Testpublic void testQuery() throws Exception{// 连接mongodb,获取要操作的表MongoCollection<Document> collection = getCollection();// 查询所有数据FindIterable<Document> documents = collection.find();for (Document document : documents) {System.out.println(document);}System.out.println("==============================================");// 查询age在25-35之间的,按照年龄倒序排列,且分页查询FindIterable<Document> documents1 = collection.find(Filters.and(Filters.lte("age", 35),Filters.gte("age", 25))).sort(Sorts.descending("age")).skip(0).limit(2);for (Document document : documents1) {System.out.println(document);}// 关闭客户端mongoClient.close();}
}
1.2 操作对象

定义要操作的员工类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {private Long id;private String name;private Integer age;private String intro;private Integer sex;}

crud操作

public class EmployeeTest {private static MongoClient mongoClient = null;public MongoCollection<Employee> getCollection() throws Exception{//定义对象的解码注册器CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(MongoClientSettings.getDefaultCodecRegistry(),CodecRegistries.fromProviders(PojoCodecProvider.builder().automatic(true).build()));// 创建MongoDb客户端mongoClient = MongoClients.create("mongodb://116.205.236.142:27017");// 选择要操作的数据库MongoDatabase database = mongoClient.getDatabase("test").withCodecRegistry(pojoCodecRegistry);;// 选择要操作的表MongoCollection<Employee> collection = database.getCollection("employee", Employee.class);System.out.println(collection);return collection;}@Testpublic void testAdd() throws Exception{Employee employee = new Employee(1L, "zhangsan", 30, "张三是一个好员工", 1);MongoCollection<Employee> collection = getCollection();collection.insertOne(employee);mongoClient.close();}@Testpublic void testUpdate() throws Exception{MongoCollection<Employee> collection = getCollection();collection.updateOne(Filters.eq("_id", 1), Updates.set("name", "张三"));mongoClient.close();}@Testpublic void testFind() throws Exception{MongoCollection<Employee> collection = getCollection();for (Employee employee : collection.find(Filters.eq("age", 30))) {System.out.println(employee);}mongoClient.close();}@Testpublic void testDelete() throws Exception{MongoCollection<Employee> collection = getCollection();collection.deleteOne(Filters.eq("_id",1));mongoClient.close();}}

2 spring-data-mongodb

spring-data对MongoDB做了支持,使用spring-data-mongodb可以简化MongoDB的操作。

springboot spring data mongodb 就是在springboot项目中使用spring data mongodb

导入依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.5.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></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></dependency></dependencies>

配置application.yml配置文件

spring:application:name: springboot-mongodb-demodata:mongodb:uri: mongodb://127.0.0.1:27017/test1

启动类

@SpringBootApplication
public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);}}

测试类测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public class MongodbTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void testAdd() throws Exception{Employee employee = new Employee(1L, "张三", 30, "张三是个好员工", 1);mongoTemplate.save(employee);}@Testpublic void testGetAll() throws Exception{List<Employee> employees = mongoTemplate.findAll(Employee.class);System.out.println(employees);}@Testpublic void testUpdate() throws Exception{Employee employee = new Employee(1L, "张三1", 28, "张三1是个好员工", 1);Query query = Query.query(Criteria.where("id").is(employee.getId()));Update update = new Update().set("name", employee.getName()).set("age", employee.getAge()).set("intro", employee.getIntro()).set("sex", employee.getSex());mongoTemplate.updateFirst(query,update,Employee.class);}@Testpublic void testDelete() throws Exception{Query query = Query.query(Criteria.where("id").is(1));mongoTemplate.remove(query,Employee.class);}
}

评论功能

用户可以对看上的车辆提问,别的用户或者销售人员可以针对用户的提问进行回复。

需要实现的功能:

​ 发表评价

​ 回复评论

​ 展示该商品的评论

​ 删除评论/回复

  • 基于mongodb 将评论数据存放在mongodb中

    1. 模式自由:MongoDB是一个面向文档的数据库,这意味着它不使用固定的表结构,而是使用灵活的文档模型来存储数据。在商品评论场景中,评论的字段可能会随着业务的发展而发生变化,使用MongoDB可以更加灵活地应对这种变化,而无需修改整个数据库结构。
    2. 高性能:MongoDB的查询性能通常优于传统关系型数据库,尤其是在处理大量数据时。对于商品评论系统来说,可能需要存储和检索大量的评论数据,MongoDB的高性能可以确保系统的响应速度和稳定性。
    3. 可扩展性:MongoDB支持分布式存储和自动分片,可以轻松实现横向扩展。这意味着当评论数据量增长时,可以通过添加更多的服务器来扩展存储容量和查询性能,而无需停机或中断服务。
    4. 易用性:MongoDB使用BSON(二进制JSON)格式存储数据,数据以文档的形式组织,类似于JSON对象。这使得数据的存储和检索更加直观和易于理解,降低了开发难度。
    5. 数据一致性:MongoDB支持数据复制和冗余存储,以提供高可用性和数据备份。这意味着即使发生硬件故障或网络问题,也可以保证数据的完整性和一致性,从而确保商品评论系统的稳定性和可靠性。

MongoDB的模式自由、高性能、可扩展性、易用性和数据一致性等特点使其成为商品评论功能中存储数据的理想选择。然而,具体是否使用MongoDB还需要根据项目的实际需求和技术栈来决定

2 后端实现

domain

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Comment {private String id;private Long userId;private String username;private Long carId;private String content;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Date commentTime;private List<CommentReplies> replies;
}@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommentReplies {private String id;private Long userId;private String username;private String content;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Date repliesTime;
}

dto

@Data
public class AddRepliesDTO {private String commentId;private Long userId;private String username;private String content;}

controller

@RestController
@RequestMapping("/comment")
public class CommentController {@Autowiredprivate ICommentService commentService;@PutMappingpublic AjaxResult addOrUpdate(@RequestBody Comment comment){if(Objects.nonNull(comment.getId())){commentService.update(comment);}else{commentService.add(comment);}return AjaxResult.me();}@DeleteMappingpublic AjaxResult deleteById(String id){commentService.deleteById(id);return AjaxResult.me();}@GetMapping("/carId/{carId}")public AjaxResult getByCarId(@PathVariable("carId")Long carId){List<Comment> list = commentService.getByCarId(carId);return AjaxResult.me().setData(list);}@PutMapping("/addReplies")public AjaxResult addReplies(@RequestBody AddRepliesDTO dto){commentService.addReplies(dto);return AjaxResult.me();}
}

service

@Service
public class CommentServiceImpl implements ICommentService {@Autowiredprivate MongoTemplate mongoTemplate;@Overridepublic void add(Comment comment) {comment.setId(UUID.randomUUID().toString().replaceAll("-", ""));comment.setCommentTime(new Date());mongoTemplate.save(comment);}@Overridepublic void update(Comment comment) {Query query = Query.query(Criteria.where("id").is(comment.getId()));Update update = new Update().set("content", comment.getContent()).set("commentTime", new Date());mongoTemplate.updateFirst(query,update,Comment.class);}@Overridepublic void deleteById(String id) {Query query = Query.query(Criteria.where("id").is(id));mongoTemplate.remove(query,Comment.class);}@Overridepublic List<Comment> getByCarId(Long carId) {Query query = Query.query(Criteria.where("carId").is(carId));query.with(Sort.by(Sort.Direction.DESC, "commentTime"));List<Comment> list = mongoTemplate.find(query, Comment.class);return list;}@Overridepublic void addReplies(AddRepliesDTO dto) {Comment comment = mongoTemplate.findById(dto.getCommentId(), Comment.class);CommentReplies commentReplies = new CommentReplies();BeanUtils.copyProperties(dto, commentReplies);commentReplies.setRepliesTime(new Date());commentReplies.setId(UUID.randomUUID().toString().replaceAll("-", ""));List<CommentReplies> replies = comment.getReplies();if(replies == null){replies = new ArrayList<>();}replies.add(commentReplies);Query query = Query.query(Criteria.where("id").is(comment.getId()));Update update = new Update().set("replies", replies);mongoTemplate.updateFirst(query,update,Comment.class);}
}

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

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

相关文章

等保2.0对于物联网设备的漏洞管理还有哪些规定?

等保2.0针对物联网设备的漏洞管理&#xff0c;主要规定了以下几个方面&#xff1a; 1. 漏洞发现与识别&#xff1a;要求定期进行漏洞扫描和评估&#xff0c;利用专业的漏洞扫描工具和安全服务&#xff0c;及时发现物联网设备及其软件中的安全漏洞。这包括但不限于操作系统、应…

文献解读-流行病学-第十期|《SARS-CoV-2 德尔塔和奥密克戎合并感染和重组的证据》

关键词&#xff1a;基因组变异检测&#xff1b;全基因组测序&#xff1b;流行病学&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;Evidence for SARS-CoV-2 Delta and Omicron co-infections and recombination标题&#xff08;中文&#xff09;&#xf…

手持风扇哪个品牌好?五大手持风扇品牌推荐!

随着炎热夏季的到来&#xff0c;手持风扇已成为人们出行的必备清凉神器。然而&#xff0c;面对市场上众多品牌的手持风扇&#xff0c;如何选择一款既时尚又高效的产品成为了许多消费者的难题。为了解决这个困扰&#xff0c;我们精心挑选了五大手持风扇品牌进行推荐。这些品牌不…

报表控件Stimulsoft 图表轴的日期时间步长模式

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…

Qt|海康摄像头多个页面展示问题

为大家分享一个使用海康摄像头的小功能&#xff0c;希望对大家有用~ 使用场景&#xff1a; 在程序中多个不同功能页面需要展示摄像头的实时预览画面&#xff0c;该如何高效的展示呢&#xff1f; 对于海康摄像头的实时预览接口调用流程&#xff0c;如下所示&#xff1a; 按照流…

JS正则表达式构造函数和正则表达式字面量的区别

背景 笔者在使用正则表达式的过程中&#xff0c;经常看到两种使用方式&#xff0c;比较好奇这两种方式有什么不同。 一种是 正则表达式构造函数&#xff1a;new RegExp(“[xxx]”) 另一种是 正则表达式字面量&#xff1a; /[xxx]/ 于是&#xff0c;就去网上搜了一下…结果看到国…

阿里云ECS(CentOS/Alibaba Cloud Linux)安装最新 Docker 方法

最近&#xff08;6月份&#xff09;我发现 docker 官方无法正常访问&#xff0c;docker pull 命令也执行失败&#xff0c;用 TZ 也一样&#x1f614;。 以下步骤适用于 CentOS 7/8或Alibaba Cloud Linux 系统。 1. 更新系统包 首先&#xff0c;确保您的ECS实例系统软件包是最…

使用nvm管理nodejs版本,设置淘宝NPM镜像源

nvm-windows https://github.com/coreybutler/nvm-windows nvm配置文件的路径 C:\Users\用户名\AppData\Roaming\nvm 修改 settings.txt 文件&#xff0c;添加淘宝镜像源地址 node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors…

【FAS】《Survey on face anti-spoofing in face recognition》

文章目录 原文基于手工设计特征表达的人脸活体检测方法基于深度学习的人脸活体检测方法基于融合策略的人脸活体检测方法人脸检测活体数据库点评 原文 邓雄,王洪春,赵立军等.人脸识别活体检测研究方法综述[J].计算机应用研究,2020,37(09):2579-2585.DOI:10.19734/j.issn.1001-3…

程序员们,能告诉我你们为什么选择arch linux吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; Arch Linux 受到程序员青…

IDC发布2023年中国Web应用防火墙市场份额报告

全球范围内针对Web应用的网络攻击从未停止&#xff0c;经验丰富的网络攻击者仍在不断尝试使用更为高效和不易察觉的攻击方式入侵到Web应用内部&#xff0c;利用Web应用的脆弱性进行网络攻击&#xff0c;成为企业敏感数据泄露、内容篡改、业务中断等问题的主要原因&#xff0c;对…

NL2SQL进阶系列(1):DB-GPT-Hub、SQLcoder、Text2SQL开源应用实践详解

1. MindSQL(库) MindSQL 是一个 Python RAG&#xff08;检索增强生成&#xff09;库&#xff0c;旨在仅使用几行代码来简化用户与其数据库之间的交互。 MindSQL 与 PostgreSQL、MySQL、SQLite 等知名数据库无缝集成&#xff0c;还通过扩展核心类&#xff0c;将其功能扩展到 Sn…

实例详解C/C++中static与extern关键字的使用

目录 1、概述 2、编译C++代码时遇到的变量及函数重复定义的问题 3、用 extern 声明外部变量 4、extern与全局函数 5、为何在变量和函数前添加一个static关键字编译就没问题了呢? 6、静态局部变量 7、函数的声明与定义都放置到一个头文件中,不使用static,通过宏控制去…

MyBatisPlus可以自动把我们的业务对应的动态代理接口注入到父类baseMapper属性中,因此我们可以省略对应的mapper动态代理接口

MyBatisPlus可以自动把我们的业务对应的动态代理接口注入到父类baseMapper属性中&#xff0c;因此我们可以省略对应的mapper动态代理接口 在service服务实现类中&#xff0c;当我们使用MyBatis框架的时候&#xff0c;那么一般会有一个类似于下面的动态地理接口的显示引入&…

【Java】已解决java.lang.UnsupportedOperationException异常

文章目录 问题背景可能出错的原因错误代码示例正确代码示例注意事项 已解决java.lang.UnsupportedOperationException异常 在Java编程中&#xff0c;java.lang.UnsupportedOperationException是一个运行时异常&#xff0c;通常表示尝试执行一个不支持的操作。这种异常经常发生…

【附带源码】机械臂MoveIt2极简教程(五)、第二个demo - rviz可视化

系列文章目录 【附带源码】机械臂MoveIt2极简教程&#xff08;一&#xff09;、moveit2安装 【附带源码】机械臂MoveIt2极简教程&#xff08;二&#xff09;、move_group交互 【附带源码】机械臂MoveIt2极简教程&#xff08;三&#xff09;、URDF/SRDF介绍 【附带源码】机械臂…

免费分享:2014-2021年OSM中国POI数据(附下载方法)

OpenStreetMap&#xff08;OSM&#xff09;是一个全球性的开源协作地图项目&#xff0c;允许任何人编辑和分享地理信息&#xff0c;旨在创建自由、准确且可广泛使用的世界地图。POI是“Point of Interest”的缩写&#xff0c;意为“兴趣点”。 OSM POI矢量数据是OpenStreetMap项…

超神级!Markdown最详细教程,程序员的福音

超神级&#xff01;Markdown最详细教程&#xff0c;程序员的福音Markdown最详细教程&#xff0c;关于Markdown的语法和使用就先讲到这里&#xff0c;如果喜欢&#xff0c;请关注“IT技术馆”。馆长会更新​最实用的技术&#xff01;https://mp.weixin.qq.com/s/fNzhLFyYRd3skG-…

为什么人们对即将推出的 Go 1.23 迭代器感到愤怒

原文&#xff1a;gingerBill - 2024.06.17 TL;DR 它让 Go 变得太“函数式”&#xff0c;而不再是不折不扣的命令式语言。 最近&#xff0c;我在 Twitter 上看到一篇帖子&#xff0c;展示了 Go 1.23&#xff08;2024 年 8 月&#xff09;即将推出的 Go 迭代器设计。据我所知&a…

golang windows打包为linux可执行文件

使用go的交叉编译功能 set GOOSlinux set GOARCHamd64然后再执行go build 可能会报异常, 所以贴出我的go env配置仅供参考 go env环境配置 D:\GoWork\src\go-tzv>go env set GO111MODULEauto set GOARCHamd64 set GOBIN …