MongoDB(介绍,安装,操作,Springboot整合MonggoDB)
目录
MongoDB
1 MongoDB介绍
MongoDB简介
MongoDB的特点
MongoDB使用场景
小结
2 MongoDB安装
安装MongoDB
连接MongoDB
MongoDB逻辑结构
MongoDB数据类型
小结
3 MongoDB操作
操作库和集合
操作文档-增删改
操作文档-查询
MongoDB索引
小结
4 SpringBoot整合MongoDB
介绍
使用入门
API详解
小结
MongoDB
从原型图不难看出,这部分功能主要涉及两个实体:问题 和 回答/评论
因此核心要设计的就是这两类数据的存储。但是问答相关的数据量比较大,且随着时间的推移会越来越大。如果使用MySQL存储海量数据,成本会比较高。因为这里使用MongoDB存储问答相关的数据
1 MongoDB介绍
MongoDB简介
MongoDB官网地址:MongoDB: The Developer Data Platform | MongoDB
MongoDB中文网:MongoDB中文网
MongoDB是一个基于分布式文档型存储的NoSQL数据库。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB由C++语言编写,是非关系数据库当中功能最丰富,最像关系数据库的,它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
MongoDB的特点
MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB像猪八戒:
-
不挑食:存储数据松散,对存储的数据没有要求。每一条数据都可以有完全不同的结构
-
干活快:性能强,对数据没有过多的校验,也支持索引,也支持热点数据的内存映射。性能比MySQL强
-
吃的多:存储容量大,天生是为了分布式环境设计的,非常适合搭建集群存储海量数据
MongoDB特点:
-
面向集合存储,易于存储对象类型的数据。“集合”相当于“表”,集合里存储的是一个个的json对象
-
模式自由:每个json对象的数据都可以完全不同,结构松散
-
支持动态查询
-
支持完全索引,包含内部对象
-
支持复制和故障恢复
-
使用高效的二进制数据存储,包括大型对象(如视频等)
-
自动处理碎片,以支持云计算层次的扩展性
-
支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程 序, 社区中也提供了对Erlang及.NET 等平台的驱动程序
-
文件存储格式为 BSON(一种 JSON 的扩展)
MongoDB使用场景
适用于
-
存储网站数据:
Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
-
作为缓存:
由于性能很高,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo 搭建的持久化缓存层可以避免下层的数据源过载。
-
存储大尺寸、低价值的数据:
使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
-
高伸缩性的场景:
Mongo 非常适合由数十或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce引擎的内置支持。
-
业务变化频繁的场景:
频繁的修改字段、增加字段等等场景,使用MongoDB的结构松散的特性,可以很方便的适应需求
-
用于对象及JSON 数据的存储:
Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。
比如:行动轨迹的存储,例如 快递物流的信息,可以存储
{
"id": "物流单号",
"userId": 所属用户,
"orderId": "关联的订单id",
"track":[
{ "地点":"xxx", "坐标":"纬度,经度", "时间":"",... },
{ "地点":"xxx", "坐标":"纬度,经度", "时间":"",... },
...
{ "地点":"xxx", "坐标":"纬度,经度", "时间":"",... }
]
}
不适用
-
高度事务性的系统:
例如,银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
-
传统的商业智能应用:
针对特定问题的BI 数据库会产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
-
复杂的跨文档(表)级联查询。
MongoDB不支持多表查询
小结
MongoDB是个什么样的数据库?
分布式的文档型NoSQL,存储的是类似json的bson格式,是所有NoSQL里功能最丰富的一个
MongoDB的特点有哪些?
存储数据的结构松散,每一条数据都可以有不同的结构
性能强
适合海量数据的存储
什么场景不适合MongoDB?
对事务要求比较高的场景
不支持多表查询(跨集合的查询)
不适合商业BI应用
2 MongoDB安装
我们使用的MongoDB版本是5.0.9
安装MongoDB
在Linux里执行以下命令,创建MongoDB容器。注意MongoDB的登录帐号:tjxt,密码123
#1. 停止并删除Linux里旧的容器
docker stop mongo
docker rm mongo#2. 重新创建MongoDB容器
docker run -id --name=mongo --network heima-net \
-e MONGO_INITDB_ROOT_USERNAME=tjxt \
-e MONGO_INITDB_ROOT_PASSWORD=123 \
-p 27017:27017 \
-v /usr/local/src/mongo:/data/db \
--restart=always \
mongo
连接MongoDB
使用MongoDB官方提供的studio3t, 或者 idea、DataGrip、Navicat Premium都可以连接MongoDB。我们这里仍然使用idea连接,步骤如下图。
MongoDB逻辑结构
MongoDB 的逻辑结构是一种层次结构。主要由: 文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面 向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。
-
MongoDB 的文档(document),相当于关系数据库中的一行记录。
-
多个文档组成一个集合(collection),相当于关系数据库的表。
-
多个集合(collection),逻辑上组织在一起,就是数据库(database)。
-
一个 MongoDB 实例支持多个数据库(database)。
为了更好的理解,下面与SQL中的概念进行对比:
MongoDB数据类型
常用的数据类型有:
小结
MongoDB的结构:
DataBase:数据库
Collection:集合。一个DataBase里可以有多个Collection
一个集合相当于一张表,但是理解为 是一个List<Object>
Document:文档。一个Collection里可以有多个Document
一个文档相当于一条数据,但是更甚为 是List<Object>里的一个Object对应的json
Field:字段
Index:索引。提升查询数据的速度,但是影响增删改
MongoDB支持数据类型:
-
整数,小数,String,Boolean, 数组,嵌套json对象,……
3 MongoDB操作
操作库和集合
语法
注意:并不需要提前创建集合,在向集合里插入文档数据时,如果集合不存在,会自动创建的
示例
//1. 创建库,名称为heima416。
// 如果库里没有任何内容,库仅仅是在内存里,没有落盘,所以查看库是看不到的。
use heima416
//2. 查看当前库
db
show dbs
//3. 删除库
db.dropDatabase()//4. 创建集合:users。不需要显式的创建库,只要向集合里插入文档,如果集合不存在会自动创建再插入
// db.createCollection("users")
db.users.insertOne({ name:"王丛丛", age:21, sex:"男"})
//5. 查看集合
show collections
//6. 删除集合
db.users.drop()
操作文档-增删改
语法
其中的update
要注意,默认情况下update操作会对原始文档进行覆盖。如果不想覆盖,而是仅仅做增量更新的话,要使用相应的操作符:
-
$set
:设置字段的值。例如
db.表名/集合名.updateMany({}, { $set:{money:1000, status: 1} })
表示修改集合里所有的数据,把money设置为1000,把status设置为1
-
$inc
:字段的值自增例如
db.表名/集合名.updateMany({}, {$inc: {money:1000} })
表示修改集合里所有的数据,给money值自增1000
示例
//1. 插入文档
db.users.insertOne({ name:"王丛丛", age:21, sex:"男"})
db.users.insertMany( [
{name:"齐天泽", age:22, sex:"男"},
{name:"吴磊", age:24, sex:"男"}
] )
// 使用js的语法操作MongoDB
var arr = [
{name:"齐天泽1", age:23, sex:"男"},
{name:"吴磊1", age:25, sex:"男"}
];
db.users.insertMany(arr)
// 利用js的fori循环定义数组,再批量插入
var arr1 = [];
for (let i = 0; i < 10; i++) {
arr1.push( {name:"王丛丛"+i, age: 20+i} )
}
db.users.insertMany(arr1)//2. 修改文档。
//2.1 修改要使用操作符$set
// 只修改匹配到的第一条数据
db.users.updateOne( { age:21 }, { $set:{sex:"女"} } )
// 修改匹配到的所有数据
db.users.updateMany( { age:21 }, { $set:{sex:"男"} } )
// 修改所有数据,设置sex=男,address=北京昌平金燕龙
db.users.updateMany( { }, { $set:{sex:"男",address:"北京昌平金燕龙"} } )
//2.2 字段值自增使用$inc
db.users.updateMany( {}, { $inc:{age:1} } )//3. 删除文档
// 删除age=21的第1条
db.users.deleteOne( {age:21} )
// 删除所有age=22的
db.users.deleteMany( { age:22 } )
// 删除所有文档数据
db.users.deleteMany( {} )
操作文档-查询
语法
其中:
-
query
:表示查询条件,写成json形式,例如{status:1}
表示 查询status=1
的文档。如果需要其它条件,参考下一小节 -
fields
:表示要查询哪些字段,写成json形式,例如{name:1, age:1}
只查询name和age字段 -
排序条件
:写成json形式,例如{age:1, money:-1}
表示 按age升序排序,如果年龄相同则按money降序 -
skip(m)
:表示跳过前m个,从索引m开始查找 -
limit(n)
:表示只要前n个
条件操作符
查询条件操作符
多条件连接
示例
准备数据
db.users.remove({})
db.users.insert({username:'zhangsan', sex:'男', age:20, salary:8000})
db.users.insert({username:'lisi', sex:'女',age:21, salary:9000})
db.users.insert({username:'wangwu', sex:'男',age:22, salary:12000})
db.users.insert({username:'zhaoliu', sex:'男',age:22, salary:9500})
db.users.insert({username:'qianqi', sex:'女',age:25, salary:7500})
db.users.insert({username:'tom', sex:'男',age:19, salary:6500})
db.users.insert({username:'jerry', sex:'女',age:23, salary:8500})
db.users.insert({username:'jack', sex:'男',age:22, salary:4500})
db.users.insert({username:'rose', sex:'女',age:20, salary:14500})
使用示例
//1. 单字段的条件查询
// = 查询性别为男的 select * from users where sex = '男'
db.users.find( { sex:"男"} )
// > 查询年龄大于20岁的 select * from users where age > 20
db.users.find( { age:{$gt:20} } )
db.users.find( { age:{$gt:20, $lt:23} } )
// like 查询username以j开头的 select * from users where username like 'j%'
db.users.find( { username:{$regex:'^j.*$'} } )// 查询符合条件的数据,只要name和salary列
db.users.find( {},{username:1, salary:1} )//2. 多字段的条件查询
// 查询工资8000以上,年龄23岁以下的用户:salary,age
db.users.find( { salary:{$gt:8000}, age:{$lt:23} } )
// 查询工资8000以上,或者 年龄23岁以下的用户:salary,age
db.users.find( { $or:[ {salary:{$gt:8000}},{age:{$lt:23}} ] } )//3. 排序
db.users.find().sort({ salary:-1 })
db.users.find().sort({age:1})
db.users.find().sort({age:1, salary:-1})//4. 分页
db.users.find().skip(3)
db.users.find().skip(3).limit(2)
MongoDB索引
MongoDB的索引底层使用的是B树。
mongoDB中常用的索引类型
-
单字段索引:在单字段上创建索引
-
复合索引:在多字段上创建索引
-
多键索引:在数组字段上创建索引
-
哈希索引:给指定字段建立hash索引,有强大的查找能力,但是不能排序及范围查询
mongoDB中常用的索引属性
-
唯一索引:添加唯一性约束
-
局部索引:只对集合里符合条件的一部分文档创建索引
-
稀疏索引:在有索引字段的文档上创建索引。例如给email字段加稀疏索引,只有文档里包含email字段才会加索引
-
TTL索引:一种特殊的单字段索引,只能用于date类型的字段,给文档添加过期时间,过期后文档会被删除掉
语法
示例
//查询集合里的索引
db.users.getIndexes();
//增加索引
db.users.createIndex( { username:1, age:1 } )
//查询数据时,验证索引是否会生效
db.users.find( {username:"tom"} ).explain(true);
//删除索引
db.users.dropIndex("username_1_age_1")
小结
查询所有库:show dbs
创建库/切换库:use 库名称
查询当前库:db
删除当前库:db.dropDatabase()查看当前库里所有集合:show collections
在当前库里创建集合:
* 方式1:向集合里插入文档,如果集合不存在,就怎么创建。db.集合名.insertOne(json对象)
* 方式2:显式创建集合:db.createCollection("集合名")
删除当前库里某集合:db.集合名.drop()
操作文档增删改
//3.新增文档
db.users.insertOne({name:"李四",age:24,gender:"女"});
db.users.insertMany([
{name:"王五",age:25, gender:"男"},
{name:"赵六",age:26, email: "zl@163.com"},
{name:"钱七",age:27, gender:"女"}
]);//var arr = [
// {name:"王五5",age:25, gender:"男"},
// {name:"赵六6",age:26, gender:"女"}
//];
//db.users.insertMany(arr);
//for(var i = 0; i<arr.length; i++){
// db.users.insertOne(arr[i]);
//}//4. 修改文档:$set修改字段值,$inc字段值自增
db.users.updateOne( {gender:"男"}, { $set: {age:30, salary:10000} } );
db.users.updateMany( {gender:"男"}, { $set: {age:30, salary:10000} } );
db.users.updateMany( {gender:"男"}, { $inc: {salary:-5000} } );//5. 删除文档
db.users.deleteOne( {gender:"男"} );
db.users.deleteMany( {gender:"男"} );
操作文档查询
整体的语法:
db.集合名.find( query,fields ).sort({排序字段:1或-1, 排序字段:1或-1}).skip(起始索引).limit(查询数量)
db.users.find().sort({age:-1, salary:1}).skip(5).limit(5)查询条件:
* 以字段为单位 写条件的 { 字段1:{}, 字段2:{} }
* 条件运算符:$gt, $gte, $lt, $lte, $ne, $in, $nin, $regex等等
1. 单字段的条件查询
// 查询性别为男的 select * from users where sex = '男'
db.users.find( {sex:"男"})// 查询年龄大于20岁的 select * from users where age > 20
db.users.find( { age:{$gt:20} } )
// 查询年龄大于20,并且小于25的
db.users.find( { age:{ $gt:20, $lt:25} } )
// 查询年龄大于20,并且小于25的 性别为男的
db.users.find( { age:{$gt:20, $lt:25}, sex:"男" } )// like 查询username以j开头的 select * from users where username like 'j%'
db.users.find( { username:{ $regex: /^j.*$/ } } )
4 SpringBoot整合MongoDB
介绍
SpringBoot提供了操作MongoDB的起步依赖:spring-boot-starter-data-mongodb,已经帮我们提供了操作MongoDB的一些API,包括两种形式:
-
JPA形式的操作:实现了JPA规范的操作方式,简单的CURD操作更方便,但是复杂操作不够灵活
UserRepository, findByUsernameAndSex, findById
-
MongoTemplate形式的操作:更灵活的操作MongoDB的方式,我们使用这种方式
使用入门
使用步骤如下:
-
准备工作
添加起步依赖spring-boot-starter-data-mongodb
配置MongoDB的连接信息
-
使用入门
准备实体类
操作MongoDB
准备工作
起步依赖
<!-- MongoDB起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency><!-- 为方便测试,再添加单元测试起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
配置文件
spring:
data:
mongodb:
#uri的格式: mongodb://帐号:密码@ip:端口/库名称?authSource=admin
uri: mongodb://tjxt:123@192.168.150.101:27017/demo416?authSource=admin
使用入门
准备实体类
package com.itheima.com.itheima;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;@Data
@Document("course")
public class Course {@Idprivate String id;private String name;private Integer price;private Integer status;
}
新增一条文档
package com.itheima;import com.itheima.com.itheima.Course;
import com.mongodb.client.MongoIterable;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;@SpringBootTest
public class MongoTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void testInsert(){Course course = new Course();course.setName("Java基础");course.setPrice(1);course.setStatus(1);mongoTemplate.insert(course);}
}
API详解
常用方法
mongoTemplate提供了一系列操作MongoDB的常用方法:
注意其中的query
和update
-
query:用于设置查询条件
-
update:用于设置要修改的数据
使用示例
package com.itheima;import com.itheima.com.itheima.Course;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;import java.util.ArrayList;
import java.util.List;@SpringBootTest
public class MongoTest {@Autowiredprivate MongoTemplate mongoTemplate;@Testpublic void testInsert() {Course course = new Course();course.setName("Java基础");course.setPrice(1);mongoTemplate.insert(course);}@Testpublic void testInsertAll() {List<Course> list = new ArrayList<>();for (int i = 0; i < 100; i++) {Course course = new Course();course.setName("Java基础" + i);course.setPrice(100 + i);list.add(course);}mongoTemplate.insertAll(list);}@Testpublic void testUpdateFirst() {Query query = Query.query(Criteria.where("name").is("Java基础"));Update update = Update.update("status", 0);mongoTemplate.updateFirst(query, update, Course.class);}@Testpublic void testUpdateMulti() {Query query = Query.query(Criteria.where("price").gt(150));Update update = Update.update("status", 0);mongoTemplate.updateMulti(query, update, Course.class);}@Testpublic void testRemove() {Query query = Query.query(Criteria.where("name").is("Java基础"));mongoTemplate.remove(query, Course.class);}@Testpublic void testFindById() {mongoTemplate.findById("6588372d561ff41f2377fc4e", Course.class);}@Testpublic void testFindOne() {Query query = Query.query(Criteria.where("name").is("Java基础1"));Course course = mongoTemplate.findOne(query, Course.class);System.out.println("course = " + course);}@Testpublic void testFindAndCount() {//1. 统计符合条件的文档数量Query query = Query//设置查询条件:where price > 120 and status is null.query(Criteria.where("price").gt(120).and("status").is(null));long count = mongoTemplate.count(query, Course.class);System.out.println("count = " + count);//2. 分页查询符合条件的文档列表query//设置排序条件:order by name desc.with(Sort.by(Sort.Order.desc("name")))//设置分页条件:查询第1页的10条。 注意:这里的页码从0开始.with(PageRequest.of(0, 10));List<Course> list = mongoTemplate.find(query, Course.class);list.forEach(System.out::println);}
}
小结
SpringDataMongo操作MongoDB
准备工作:
1. 先导入依赖spring-boot-starter-data-mongodb
2. 修改配置文件,配置MongoDB的连接地址
spring.data.mongodb.uri=地址
地址写法:
mongodb://帐号:密码@服务器ip:端口/库名称?authSource=admin
mongodb://tjxt:123@192.168.150.101:27017/demo418?authSource=admin
使用方式:
1. 需要注入MongoTemplate对象
2. 使用MongoTemplate操作MongoDB
操作方法的小结
//构造查询条件
// 1. 创建一个Query对象,设置where条件
// 2. 设置排序条件
// 3. 设置分页条件。页码是从0开始的
//方式1
Query query = new Query().addCretiria(Criteria.where("字段名").is(值).and("字段名").gt(值)...).with(Sort.by(Sort.Order.desc("字段名"), Sort.Order.asc("字段名"), ...)).with(PageRequest.of(页码, 每页几条));
//方式2
Query query = Query.query(Criteria.where("字段名").is(值).and("字段名").gt(值)...).with(Sort.by(Sort.Order.desc("字段名"), Sort.Order.asc("字段名"), ...)).with(PageRequest.of(页码, 每页几条))//查询
Course course = mongoTemplate.findById(id值, Course.class);
Course course = mongoTemplate.findOne(query, Course.class);
List<Course> list = mongoTemplate.find(query, Course.class);
long count = mongoTemplate.count(query, Course.class);//构造update对象
//方式1
Update update = new Update().set("字段名", 值).inc("字段名", 值)...;
//方式2
Update update = Update.update("字段名", 值).inc("字段名", 值)...;//修改
mongoTemplate.updateFirst(query, update, Course.class);
mongoTemplate.updateMulti(query, update, Course.class);//删除
mongoTemplate.remove(query, Course.class);//新增
mongoTemplate.insert(对象);
mongoTemplate.insertAll(集合);
相关文章:

MongoDB(介绍,安装,操作,Springboot整合MonggoDB)
目录 MongoDB 1 MongoDB介绍 MongoDB简介 MongoDB的特点 MongoDB使用场景 小结 2 MongoDB安装 安装MongoDB 连接MongoDB MongoDB逻辑结构 MongoDB数据类型 小结 3 MongoDB操作 操作库和集合 操作文档-增删改 操作文档-查询 MongoDB索引 小结 4 SpringBoot整合…...
【数字移动通信】期末突击
文章目录 复习题一.简答题1、常用的移动通信系统有哪些?2、分别列出1G,2G,3G,4G的典型系统或标准?3、移动通信信道的基本特征?4、电波传播预测模型是用来计算什么量的,在选择传播预测模型时,主要考虑哪些因素?5、什么…...

数据库(5)——DDL 表操作
表查询 先要进入到某一个数据库中才可使用这些指令。 SHOW TABLES; 可查询当前数据库中所有的表。 表创建 CREATE TABLE 表名( 字段1 类型 [COMMENT 字段1注释] ...... 字段n 类型 [COMMENT 字段n注释] )[COMMENT 表注释]; 例如,在student数据库里创建一张studen…...

【Java EE】网络协议——HTTP协议
目录 1.HTTP 1.1HTTP是什么 1.2理解“应用层协议” 1.3理解HTTP协议的工作过程 2.HTTP协议格式 2.1抓包工具的使用 2.2抓包工具的原理 2.3抓包结果 3.协议格式总结 1.HTTP 1.1HTTP是什么 HTTP(全称为“超文本传输协议”)是一种应用非常广泛的应…...

Docker提示某网络不存在如何解决,添加完网络之后如何删除?
Docker提示某网络不存在如何解决? 创建 Docker 网络 假设现在需要创建一个名为my-mysql-network的网络 docker network create my-mysql-network运行容器 创建网络之后,再运行 mysqld_exporter 容器。完整命令如下: docker run -d -p 9104…...

C++ 红黑树
目录 1.红黑树的概念 2.红黑树的性质 3.红黑树节点的定义 4.红黑树的插入操作 5.数据测试 1.红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个…...
PTA 6-4 配对问题
许多大学生报名参与大运会志愿者工作。其中运动场引导员需要男女生组队,每组一名男生加一名女生,男生和女生各自排成一队,依次从男队和女队队头各出一人配成小组,若两队初始人数不同,则较长那一队未配对者调到其他志愿…...
sklearn基础教程
scikit-learn是一个用于机器学习的Python库,提供了多种机器学习的方法和模型,以及数据预处理、特征选择、模型评估等功能。它简化了机器学习流程,并且具有易于使用和灵活的特点。 本教程将介绍sklearn的基础知识和常用功能,帮助你…...
MySQL入门学习-查询进阶.别名
别名(Alias)是为数据库中的表、列或表达式赋予的一个临时名称。使用别名可以使查询结果更具可读性,并且在复杂的查询中更方便地引用和处理数据。 在 MySQL 中,别名可以通过 AS 关键字来定义,例如: SELECT…...
【Rust日报】嵌入式 Rust:一份简化指南
EvilHelix 编辑器 EvilHelix 是一个采用 Vim 风格的模态编辑器,旨在提供快速且高效的编辑体验。它是 Helix 编辑器的一个分支,增加了 Vim binding,同时积极同步上游的特性,兼备了 Vim 和 Hexli 的优点: Vim 风格的模态…...

Web课外练习9
<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>邮购商品业务</title><!-- 引入vue.js --><script src"./js/vue.global.js" type"text/javascript"></script><link rel&…...
rtsp协议分析
rtsp (real-time stream protocol)实时流媒体控制协议 属于基于文本的应用层协议,rtsp的底层协议可以是udp也可以是tcp ffmpeg 参数-rtsp_transport tcp 用于指定RTSP会话底层传输协议为TCP 本身并不传输流媒体数据,只是提供流媒体的控制,实…...

Spring Web MVC(2)
响应 Http响应的结果可以是数据也可以是静态页面可以针对响应设置状态码 Header信息 返回静态页面注解RestController和Controller 我们创建一个前端页面 package com.example.demo.demos.web.controller;import org.springframework.web.bind.annotation.RequestMapping; i…...
Python-图片旋转360,保存对应图片
#Author :susocool #Creattime:2024/5/25 #FileName:turn360 #Description: 会旋转指定的图像文件360度,并将每个旋转后的图像保存到指定目录,文件名以旋转角度命名。 from PIL import Imagedef rotate_and_save(image_path, output_dir) :# …...

JavaSE——集合框架二(1/6)-前置知识-可变参数、Collections工具类
目录 可变参数 Collections工具类 Collections的常用静态方法 实例演示 可变参数 可变参数 就是一种特殊形参,定义在方法、构造器的形参列表里,格式是:数据类型...参数名称 可变参数的特点和好处 特点:可以不传数据给它&am…...

我用LLaMA-Factory微调大模型来实现商品评论情感分析,准确率高达91.70%
大家好,我是程序锅。 最近在modelscope上闲逛的时候,在数据集板块发现有一个商品评论情感预测数据集。这个数据集源自一个比赛,它的目的是为了预测电商平台顾客的评论是好评还是差评。 数据示例如下所示(其中0代表差评ÿ…...
四大进制--详解--以及进制转换规则
进制介绍 对于整数, 有四种表达方式: 二进制BIN: 0,1 , 满2进1.以0b或0B开头 所谓2进制就是使用0和1来表示一个数, 满2进1如果在开发中看到有这种写法: int n1 0b1010; 这种写法没有错, 这是二进制的一种表示方式 十进制DEC: 0-9, 满10进1 十进制就是0-9来表示一个数, 满10进…...
谈谈API和人工智能领域的开发和使用以及AI大模型开发进程。
API,全称为Application Programming Interface,即应用程序编程接口,是一些预先定义的函数。 它的主要目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而无需访问源码,或理解内部工作机制的细节。API函数包含在操作系统的动态连接库文件中,例如Win…...

用Python Pygame做的一些好玩的小游戏
有些游戏的代码比较长就不公布了 1.简简单单 1.疯狂的鸡哥 你要准备的图片: 命名为:ji.png 代码: import pygame import random as r pygame.init() pygame.display.set_caption(aaa) pm pygame.display.set_mode((800,600))class Ls(py…...

【吊打面试官系列】Java高并发篇 - ThreadLocal 是什么?有什么用?
大家好,我是锋哥。今天分享关于 【ThreadLocal 是什么?有什么用?】面试题,希望对大家有帮助; ThreadLocal 是什么?有什么用? ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...