【探花交友】day03—MongoDB基础
目录
课程介绍
1、通用设置
1.1 需求分析
1.2 查询通用设置
1.2 陌生人问题
1.3 通知设置
1.4 黑名单管理
2、MongoDB简介
1.1、MongoDB简介
1.2、MongoDB的特点
1.3 数据类型
3、MongoDB入门
2.1、数据库以及表的操作
2.2、新增数据
2.3、更新数据
2.4、删除数据
2.5、查询数据
2.6、索引
2.7、执行计划
4、SpringData-Mongo
4.1、环境搭建
4.2、完成基本操作
5、今日佳人
5.1、表结构设计
5.2、服务提供者
5.3、代码实现
课程介绍
-
MongoDB环境搭建
-
MongoDB基本CRUD操作
-
通过JavaApi操作MongoDB
-
SpringBoot整合MongoDB
1、通用设置
1.1 需求分析
1.1.1 需求分析
通用设置,包含探花交友APP基本的软件设置功能。包含:
设置陌生人问题:当平台其他用户想进行在线交流时需要回答陌生人问题。
通用设置:包含一些APP通知设置
黑名单:对于不感兴趣的用户设置黑名单屏蔽骚扰
1.1.2 数据库表
通用设置
CREATE TABLE `tb_settings` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) DEFAULT NULL,`like_notification` tinyint(4) DEFAULT '1' COMMENT '推送喜欢通知',`pinglun_notification` tinyint(4) DEFAULT '1' COMMENT '推送评论通知',`gonggao_notification` tinyint(4) DEFAULT '1' COMMENT '推送公告通知',`created` datetime DEFAULT NULL,`updated` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='设置表';
问题表
CREATE TABLE `tb_question` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) DEFAULT NULL COMMENT '用户id',`txt` varchar(200) DEFAULT NULL COMMENT '问题内容',`created` datetime DEFAULT NULL,`updated` datetime DEFAULT NULL,PRIMARY KEY (`id`),KEY `user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
黑名单
CREATE TABLE `tb_black_list` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) DEFAULT NULL,`black_user_id` bigint(20) DEFAULT NULL,`created` datetime DEFAULT NULL,`updated` datetime DEFAULT NULL,PRIMARY KEY (`id`),KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='黑名单';
1.1.3 搭建提供者环境
实体类
(1) Settings
CREATE TABLE `tb_black_list` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) DEFAULT NULL,`black_user_id` bigint(20) DEFAULT NULL,`created` datetime DEFAULT NULL,`updated` datetime DEFAULT NULL,PRIMARY KEY (`id`),KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='黑名单';
(2)Question
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Question extends BasePojo {private Long id;private Long userId;//问题内容private String txt;}
(3)BlackList
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BlackList extends BasePojo {private Long id;private Long userId;private Long blackUserId;
}
mapper接口
(1)SettingsMapper
public interface SettingsMapper extends BaseMapper<Settings> {
}
(2)QuestionMapper
public interface QuestionMapper extends BaseMapper<Question> {}
(3)BlackListMapper
public interface BlackListMapper extends BaseMapper<BlackList> {}
api接口
(1) SettingApi
package com.tanhua.dubbo.api;import com.tanhua.domain.db.Settings;public interface SettingsApi {}
(2)QuestionApi
package com.tanhua.dubbo.api;import com.tanhua.domain.db.Question;public interface QuestionApi {}
(3)BlackListApi
package com.tanhua.dubbo.api;import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tanhua.domain.db.UserInfo;public interface BlackListApi {}
api服务实现类
(1)SettingServiceImpl
package com.tanhua.dubbo.api;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tanhua.domain.db.Settings;
import com.tanhua.dubbo.mapper.SettingsMapper;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;@DubboService
public class SettingsApiImpl implements SettingsApi {@Autowiredprivate SettingsMapper settingsMapper;}
(2)QuestionServiceImpl
package com.tanhua.dubbo.api;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.tanhua.domain.db.Question;
import com.tanhua.dubbo.mapper.QuestionMapper;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;@DubboService
public class QuestionApiImpl implements QuestionApi {@Autowiredprivate QuestionMapper questionMapper;}
(3)BlackListServiceImpl
package com.tanhua.dubbo.api;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tanhua.domain.db.BlackList;
import com.tanhua.domain.db.UserInfo;
import com.tanhua.dubbo.mapper.BlackListMapper;
import com.tanhua.dubbo.mapper.UserInfoMapper;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;@DubboService
public class BlackListApiImpl implements BlackListApi {@Autowiredprivate BlackListMapper blackListMapper;
}
1.2 查询通用设置
1.2.1 接口文档
1.2.2 代码实现
vo对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SettingsVo implements Serializable {private Long id;private String strangerQuestion = "";private String phone;private Boolean likeNotification = true;private Boolean pinglunNotification = true;private Boolean gonggaoNotification = true;}
SettingsController
在tanhua-server
工程创建SettingsController
完成代码编写
@RestController
@RequestMapping("/users")
public class SettingsController {@Autowiredprivate SettingsService settingsService;/*** 查询通用设置*/@GetMapping("/settings")public ResponseEntity settings() {SettingsVo vo = settingsService.settings();return ResponseEntity.ok(vo);}
}
SettingService
在tanhua-server
工程创建SettingService
完成代码编写
@Service
public class SettingsService {@DubboReferenceprivate QuestionApi questionApi;@DubboReferenceprivate SettingsApi settingsApi;@DubboReferenceprivate BlackListApi blackListApi;//查询通用设置public SettingsVo settings() {SettingsVo vo = new SettingsVo();//1、获取用户idLong userId = UserHolder.getUserId();vo.setId(userId);//2、获取用户的手机号码vo.setPhone(UserHolder.getMobile());//3、获取用户的陌生人问题Question question = questionApi.findByUserId(userId);String txt = question == null ? "你喜欢java吗?" : question.getTxt();vo.setStrangerQuestion(txt);//4、获取用户的APP通知开关数据Settings settings = settingsApi.findByUserId(userId);if(settings != null) {vo.setGonggaoNotification(settings.getGonggaoNotification());vo.setPinglunNotification(settings.getPinglunNotification());vo.setLikeNotification(settings.getLikeNotification());}return vo;}
}
QuestionApi
在tanhua-dubbo中的QuestionApi
和QuestionApiImpl
补充方法
@Override
public Question findByUserId(Long userId) {QueryWrapper<Question> qw = new QueryWrapper<>();qw.eq("user_id",userId);return questionMapper.selectOne(qw);
}
SettingApi
在tanhua-dubbo中的SettingApi
和SettingApiImpl
补充方法
//根据用户id查询
public Settings findByUserId(Long userId) {QueryWrapper<Settings> qw = new QueryWrapper<>();qw.eq("user_id",userId);return settingsMapper.selectOne(qw);
}
1.2 陌生人问题
对数据库表进行操作:如果存在数据,更新数据库。如果不存在数据,保存数据库表数据
1.2.1 接口文档
1.2.2 代码实现
SettingsController
/*** 设置陌生人问题*/
@PostMapping("/questions")
public ResponseEntity questions(@RequestBody Map map) {//获取参数String content = (String) map.get("content");settingsService.saveQuestion(content);return ResponseEntity.ok(null);
}
SettingsService
//设置陌生人问题
public void saveQuestion(String content) {//1、获取当前用户idLong userId = UserHolder.getUserId();//2、调用api查询当前用户的陌生人问题Question question = questionApi.findByUserId(userId);//3、判断问题是否存在if(question == null) {//3.1 如果不存在,保存question = new Question();question.setUserId(userId);question.setTxt(content);questionApi.save(question);}else {//3.2 如果存在,更新question.setTxt(content);questionApi.update(question);}
}
QuestionApi
tanhua-dubbo
工程中的QuestionApi
和QuestionApiImpl
中添加保存和更新方法
@Override
public void save(Question question) {questionMapper.insert(question);
}@Override
public void update(Question question) {questionMapper.updateById(question);
}
1.3 通知设置
1.3.1 接口文档
通知管理:对通知进行保存或者更新的操作
http://192.168.136.160:3000/project/19/interface/api/280
1.3.2 代码实现
SettingsController
/*** 通知设置*/
@PostMapping("/notifications/setting")
public ResponseEntity notifications(@RequestBody Map map) {//获取参数settingsService.saveSettings(map);return ResponseEntity.ok(null);
}
SettingsService
//通知设置
public void saveSettings(Map map) {boolean likeNotification = (Boolean) map.get("likeNotification");boolean pinglunNotification = (Boolean) map.get("pinglunNotification");boolean gonggaoNotification = (Boolean) map.get("gonggaoNotification");//1、获取当前用户idLong userId = UserHolder.getUserId();//2、根据用户id,查询用户的通知设置Settings settings = settingsApi.findByUserId(userId);//3、判断if(settings == null) {//保存settings = new Settings();settings.setUserId(userId);settings.setPinglunNotification(pinglunNotification);settings.setLikeNotification(likeNotification);settings.setGonggaoNotification(gonggaoNotification);settingsApi.save(settings);}else {settings.setPinglunNotification(pinglunNotification);settings.setLikeNotification(likeNotification);settings.setGonggaoNotification(gonggaoNotification);settingsApi.update(settings);}
}
SettingsApi
tanhua-dubbo
工程中的SettingsApi
和SettingsApiImpl
中添加保存和更新方法
@Override
public void save(Settings settings) {settingsMapper.insert(settings);
}@Override
public void update(Settings settings) {settingsMapper.updateById(settings);
}
1.4 黑名单管理
1.3.1 接口文档
-
查询黑名单列表
-
移除黑名单
1.3.2 分页查询
vo对象
tanhua-domain
工程的配置分页vo对象
package com.tanhua.domain.vo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;
import java.util.Collections;
import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult implements Serializable {private Integer counts = 0;//总记录数private Integer pagesize;//页大小private Integer pages = 0;//总页数private Integer page;//当前页码private List<?> items = Collections.emptyList(); //列表public PageResult(Integer page,Integer pagesize,int counts,List list) {this.page = page;this.pagesize = pagesize;this.items = list;this.counts = counts;this.pages = counts % pagesize == 0 ? counts / pagesize : counts / pagesize + 1;}}
SettingsController
/*** 分页查询黑名单列表*/
@GetMapping("/blacklist")
public ResponseEntity blacklist(@RequestParam(defaultValue = "1") int page,@RequestParam(defaultValue = "10") int size) {//1、调用service查询PageResult pr = settingsService.blacklist(page,size);//2、构造返回return ResponseEntity.ok(pr);
}/*** 取消黑名单*/
@DeleteMapping("/blacklist/{uid}")
public ResponseEntity deleteBlackList(@PathVariable("uid") Long blackUserId) {settingsService.deleteBlackList(blackUserId);return ResponseEntity.ok(null);
}
SettingService
//分页查询黑名单列表
public PageResult blacklist(int page, int size) {//1、获取当前用户的idLong userId = UserHolder.getUserId();//2、调用API查询用户的黑名单分页列表 Ipage对象IPage<UserInfo> iPage = blackListApi.findByUserId(userId,page,size);//3、对象转化,将查询的Ipage对象的内容封装到PageResult中PageResult pr = new PageResult(page,size,iPage.getTotal(),iPage.getRecords());//4、返回return pr;
}//取消黑名单
public void deleteBlackList(Long blackUserId) {//1、获取当前用户idLong userId = UserHolder.getUserId();//2、调用api删除blackListApi.delete(userId,blackUserId);
}
BlackListApi
@Override
public IPage<UserInfo> findByUserId(Long userId, int page, int size) {//1、构建分页参数对象PagePage pages = new Page(page,size);//2、调用方法分页(自定义编写 分页参数Page,sql条件参数)return userInfoMapper.findBlackList(pages,userId);
}@Override
public void delete(Long userId, Long blackUserId) {QueryWrapper<BlackList> qw = new QueryWrapper<>();qw.eq("user_id",userId);qw.eq("black_user_id",blackUserId);blackListMapper.delete(qw);
}
UserInfoMapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {@Select("select * from tb_user_info where id in (\n" +" SELECT black_user_id FROM tb_black_list where user_id=#{userId}\n" +")")IPage<UserInfo> findBlackList(@Param("pages") Page pages, @Param("userId") Long userId);
}
MybatisPlusConfig
tanhua-dubbo-db
引导类开启mybatis-plus分页插件支持
public interface UserInfoMapper extends BaseMapper<UserInfo> {@Select("select * from tb_user_info where id in (\n" +" SELECT black_user_id FROM tb_black_list where user_id=#{userId}\n" +")")IPage<UserInfo> findBlackList(@Param("pages") Page pages, @Param("userId") Long userId);
}
使用mybatis-plus的分页:
-
创建分页对象:Page,指定当前页和每页查询条数
-
基础查询:mapper.selectPage(page,查询条件)
-
自定义查询:Ipage 方法名称(Page对象,xxx查询条件)
2、MongoDB简介
对于社交类软件的功能,我们需要对它的功能特点做分析:
-
数据量会随着用户数增大而增大
-
读多写少
-
价值较低
-
非好友看不到其动态内容
-
地理位置的查询
-
……
针对以上特点,我们来分析一下:
-
mysql:关系型数据库(效率低)
-
redis:redis缓存(微博,效率高,数据格式不丰富)
-
对于数据量大而言,显然不能够使用关系型数据库进行存储,我们需要通过MongoDB进行存储
-
对于读多写少的应用,需要减少读取的成本
-
比如说,一条SQL语句,单张表查询一定比多张表查询要快
-
探花交友
-
mongodb:存储业务数据(圈子,推荐的数据,小视频数据,点赞,评论等)
-
redis:承担的角色是缓存层(提升查询效率)
-
mysql:存储和核心业务数据,账户
1.1、MongoDB简介
MongoDB:是一个高效的非关系型数据库(不支持表关系:只能操作单表)
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
官网:MongoDB: The Developer Data Platform | MongoDB
1.2、MongoDB的特点
MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。具体特点总结如下:
-
面向集合存储,易于存储对象类型的数据
-
模式自由
-
支持动态查询
-
支持完全索引,包含内部对象
-
支持复制和故障恢复
-
使用高效的二进制数据存储,包括大型对象(如视频等)
-
自动处理碎片,以支持云计算层次的扩展性
-
支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程 序, 社区中也提供了对Erlang及.NET 等平台的驱动程序
-
文件存储格式为 BSON(一种 JSON 的扩展)
1.2.1、通过docker安装MongoDB
在课程资料的虚拟机中已经提供了MongoDB的镜像和容器,我们只需要使用简单的命令即可启动
#进入base目录 cd /root/docker-file/base/ #批量创建启动容器,其中已经包含了redis,zookeeper,mongodb容器 docker-compose up -d #查看容器 docker ps -a
可以看到mongoDB已经启动,对外暴露了27017的操作端口
1.2.2、MongoDB体系结构
MongoDB 的逻辑结构是一种层次结构。主要由: 文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面 向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。
-
MongoDB 的文档(document),相当于关系数据库中的一行记录。
-
多个文档组成一个集合(collection),相当于关系数据库的表。
-
多个集合(collection),逻辑上组织在一起,就是数据库(database)。
-
一个 MongoDB 实例支持多个数据库(database)。 文档(document)、集合(collection)、数据库(database)的层次结构如下图:
为了更好的理解,下面与SQL中的概念进行对比:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 表中的一条数据 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
1.3 数据类型
-
数据格式:BSON {aa:bb}
-
null:用于表示空值或者不存在的字段,{“x”:null}
-
布尔型:布尔类型有两个值true和false,{“x”:true}
-
数值:shell默认使用64为浮点型数值。{“x”:3.14}或{“x”:3}。对于整型值,可以使用 NumberInt(4字节符号整数)或NumberLong(8字节符号整数), {“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}
-
字符串:UTF-8字符串都可以表示为字符串类型的数据,{“x”:“呵呵”}
-
日期:日期被存储为自新纪元依赖经过的毫秒数,不存储时区,{“x”:new Date()}
-
正则表达式:查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相 同,{“x”:/[abc]/}
-
数组:数据列表或数据集可以表示为数组,{“x”: [“a“,“b”,”c”]}
-
内嵌文档:文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”:{“y”:3 }}
-
对象Id:对象id是一个12字节的字符串,是文档的唯一标识,{“x”: objectId() }
-
二进制数据:二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要 将非utf-字符保存到数据库中,二进制数据是唯一的方式。
3、MongoDB入门
2.1、数据库以及表的操作
#查看所有的数据库
> show dbs#通过use关键字切换数据库
> use admin#创建数据库
#说明:在MongoDB中,数据库是自动创建的,通过use切换到新数据库中,进行插入数据即可自动创建数据库
> use testdb> show dbs #并没有创建数据库> db.user.insert({id:1,name:'zhangsan'}) #插入数据> show dbs#查看表
> show tables> show collections#删除集合(表)
> db.user.drop()
true #如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。#删除数据库
> use testdb #先切换到要删除的数据中> db.dropDatabase() #删除数据库
2.2、新增数据
在MongoDB中,存储的文档结构是一种类似于json的结构,称之为bson(全称为:Binary JSON)。
#插入数据
#语法:db.表名.insert(json字符串)> db.user.insert({id:1,username:'zhangsan',age:20})> db.user.find() #查询数据
2.3、更新数据
update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update(<query>,<update>,[upsert: <boolean>,multi: <boolean>,writeConcern: <document>]
)
参数说明:
-
query : update的查询条件,类似sql update查询内where后面的。
-
update : update的对象和一些更新的操作符(如$,$inc.$set)等,也可以理解为sql update查询内set后面的
-
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
-
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
-
writeConcern :可选,抛出异常的级别。
#查询全部
> db.user.find()#更新数据
> db.user.update({id:1},{$set:{age:22}}) #注意:如果这样写,会删除掉其他的字段
> db.user.update({id:1},{age:25})#更新不存在的字段,会新增字段
> db.user.update({id:2},{$set:{sex:1}}) #更新数据#更新不存在的数据,默认不会新增数据
> db.user.update({id:3},{$set:{sex:1}})#如果设置第一个参数为true,就是新增数据
> db.user.update({id:3},{$set:{sex:1}},true)
2.4、删除数据
通过remove()方法进行删除数据,语法如下:
db.collection.remove(<query>,{justOne: <boolean>,writeConcern: <document>}
)
参数说明:
-
query :(可选)删除的文档的条件。
-
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
-
writeConcern :(可选)抛出异常的级别。
实例:
#删除数据
> db.user.remove({})#插入4条测试数据
db.user.insert({id:1,username:'zhangsan',age:20})
db.user.insert({id:2,username:'lisi',age:21})
db.user.insert({id:3,username:'wangwu',age:22})
db.user.insert({id:4,username:'zhaoliu',age:22})> db.user.remove({age:22},true)#删除所有数据
> db.user.remove({})
2.5、查询数据
MongoDB 查询数据的语法格式如下:
db.user.find([query],[fields])
-
query :可选,使用查询操作符指定查询条件
-
fields :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
条件查询:
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value> } | db.col.find({"by":"黑马程序员"}).pretty() | where by = '黑马程序员' |
小于 | {<key>:{$lt:<value>}} | db.col.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} | db.col.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
大于 | {<key>:{$gt:<value>}} | db.col.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} | db.col.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} | db.col.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
实例:
#插入测试数据
db.user.insert({id:1,username:'zhangsan',age:20})
db.user.insert({id:2,username:'lisi',age:21})
db.user.insert({id:3,username:'wangwu',age:22})
db.user.insert({id:4,username:'zhaoliu',age:22})db.user.find() #查询全部数据
db.user.find({},{id:1,username:1}) #只查询id与username字段
db.user.find().count() #查询数据条数
db.user.find({id:1}) #查询id为1的数据
db.user.find({age:{$lte:21}}) #查询小于等于21的数据
db.user.find({$or:[{id:1},{id:2}]}) #查询id=1 or id=2#分页查询:Skip()跳过几条,limit()查询条数
db.user.find().limit(2).skip(1) #跳过1条数据,查询2条数据
db.user.find().sort({id:-1}) #按照id倒序排序,-1为倒序,1为正序
2.6、索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
#创建索引
> db.user.createIndex({'age':1})#查看索引
> db.user.getIndexes()
[{"v" : 2,"key" : {"_id" : 1},"name" : "_id_","ns" : "testdb.user"}
]
#说明:1表示升序创建索引,-1表示降序创建索引。
2.7、执行计划
MongoDB 查询分析可以确保我们建议的索引是否有效,是查询语句性能分析的重要工具。
#插入1000条数据
for(var i=1;i<1000;i++)db.user.insert({id:100+i,username:'name_'+i,age:10+i})#查看执行计划
> db.user.find({age:{$gt:100},id:{$lt:200}}).explain()#测试没有使用索引
> db.user.find({username:'zhangsan'}).explain()#winningPlan:最佳执行计划
#"stage" : "FETCH", #查询方式,常见的有COLLSCAN/全表扫描、IXSCAN/索引扫描、FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询
4、SpringData-Mongo
Spring-data对MongoDB做了支持,使用spring-data-mongodb可以简化MongoDB的操作,封装了底层的mongodb-driver。
地址:Spring Data MongoDB
使用Spring-Data-MongoDB很简单,只需要如下几步即可:
-
导入起步依赖
-
编写配置信息
-
编写实体类(配置注解 @Document,@Id)
-
操作mongodb
-
注入MongoTemplate对象,完成CRUD操作
-
编写Repository接口,注入接口完成基本Crud操作
-
4.1、环境搭建
第一步,导入依赖:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEASE</version>
</parent>
<dependencies><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>
</dependencies>
第二步,编写application.yml配置文件
spring:data:mongodb:uri: mongodb://192.168.136.160:27017/test
第三步,编写启动类
package com.tanhua.mongo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MongoApplication {public static void main(String[] args) {SpringApplication.run(MongoApplication.class, args);}
}
4.2、完成基本操作
第一步,编写实体类
package com.tanhua.mongo.domain;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.mapping.Document;@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(value="person")
public class Person {private ObjectId id;private String name;private int age;private String address;}
第二步,通过MongoTemplate完成CRUD操作
package cn.itcast.mongo.test;import cn.itcast.mongo.MongoApplication;
import cn.itcast.mongo.domain.Person;
import org.bson.types.ObjectId;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
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 org.springframework.test.context.junit4.SpringRunner;import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest(classes = MongoApplication.class)
public class MongoTest {/*** SpringData-mongodb操作* 1、配置实体类* 2、实体类上配置注解(配置集合和对象间的映射关系)* 3、注入MongoTemplate对象* 4、调用对象方法,完成数据库操作*/@Autowiredprivate MongoTemplate mongoTemplate;//保存@Testpublic void testSave() {for (int i = 0; i < 10; i++) {Person person = new Person();person.setId(ObjectId.get()); //ObjectId.get():获取一个唯一主键字符串person.setName("张三"+i);person.setAddress("北京顺义"+i);person.setAge(18+i);mongoTemplate.save(person);}}//查询-查询所有@Testpublic void testFindAll() {List<Person> list = mongoTemplate.findAll(Person.class);for (Person person : list) {System.out.println(person);}}@Testpublic void testFind() {//查询年龄小于20的所有人Query query = new Query(Criteria.where("age").lt(20)); //查询条件对象//查询List<Person> list = mongoTemplate.find(query, Person.class);for (Person person : list) {System.out.println(person);}}/*** 分页查询*/@Testpublic void testPage() {Criteria criteria = Criteria.where("age").lt(30);//1、查询总数Query queryCount = new Query(criteria);long count = mongoTemplate.count(queryCount, Person.class);System.out.println(count);//2、查询当前页的数据列表, 查询第二页,每页查询2条Query queryLimit = new Query(criteria).limit(2)//设置每页查询条数.skip(2) ; //开启查询的条数 (page-1)*sizeList<Person> list = mongoTemplate.find(queryLimit, Person.class);for (Person person : list) {System.out.println(person);}}/*** 更新:* 根据id,更新年龄*/@Testpublic void testUpdate() {//1、条件Query query = Query.query(Criteria.where("id").is("5fe404c26a787e3b50d8d5ad"));//2、更新的数据Update update = new Update();update.set("age", 20);mongoTemplate.updateFirst(query, update, Person.class);}@Testpublic void testRemove() {Query query = Query.query(Criteria.where("id").is("5fe404c26a787e3b50d8d5ad"));mongoTemplate.remove(query, Person.class);}
}
5、今日佳人
在用户登录成功后,就会进入首页,首页中有今日佳人、推荐好友、探花、搜附近等功能。
今日佳人,会推荐缘分值最大的用户,进行展现出来。缘分值的计算是由用户的行为进行打分,如:点击、点赞、评论、学历、婚姻状态等信息组合而成的。
实现:我们先不考虑推荐的逻辑,假设现在已经有推荐的结果,我们只需要从结果中查询到缘分值最高的用户就可以了。至于推荐的逻辑以及实现,我们将后面的课程中讲解。
流程:
5.1、表结构设计
#表结构 recommend_user
{"userId":1001, #推荐的用户id"toUserId":1002, #用户id"score":90, #推荐得分"date":"2019/1/1" #日期
}
在MongoDB中只存储用户的id数据,其他的数据需要通过接口查询。
5.2、服务提供者
5.2.0、导入依赖
找到tanhua-domain模块的pom.xml
打开mongo的依赖
5.2.1、实体类
@AllArgsConstructor
@NoArgsConstructor
@Data
@Document(collection = "recommend_user")
public class RecommendUser implements java.io.Serializable {private ObjectId id; //主键idprivate Long userId; //推荐的用户idprivate Long toUserId; //用户idprivate Double score =0d; //推荐得分private String date; //日期
}
5.2.2、RecommendUserApi接口
public interface RecommendUserApi {RecommendUser queryWithMaxScore(Long toUserId);
}
5.2.3、RecommendUserApiImpl
@DubboService
public class RecommendUserApiImpl implements RecommendUserApi {@Autowiredprivate MongoTemplate mongoTemplate;//查询今日佳人public RecommendUser queryWithMaxScore(Long toUserId) {//根据toUserId查询,根据评分score排序,获取第一条//构建CriteriaCriteria criteria = Criteria.where("toUserId").is(toUserId);//构建Query对象Query query = Query.query(criteria).with(Sort.by(Sort.Order.desc("score"))).limit(1);//调用mongoTemplate查询return mongoTemplate.findOne(query,RecommendUser.class);}
}
5.2.4、application配置
server:port: 18082
spring:application:name: tanhua-dubbo-mongocloud:nacos:discovery:server-addr: 192.168.136.160:8848data:mongodb:uri: mongodb://192.168.136.160:27017/tanhua
dubbo:protocol:name: dubboport: 20882registry:address: spring-cloud://localhostscan:base-packages: com.tanhua.dubbo.api #dubbo中包扫描
5.2.5 启动类
package com.tanhua.dubbo;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;@SpringBootApplication
public class DubboMongoApplication {public static void main(String[] args) {SpringApplication.run(DubboMongoApplication.class,args);}
}
5.3、代码实现
5.3.1、接口说明
地址:http://192.168.136.160:3000/project/19/interface/api/100
5.3.2、TanhuaController
@RestController
@RequestMapping("/tanhua")
public class TanhuaController {@Autowiredprivate TanhuaService tanhuaService;//今日佳人@GetMapping("/todayBest")public ResponseEntity todayBest() {TodayBest vo = tanhuaService.todayBest();return ResponseEntity.ok(vo);}
}
5.3.3、TanhuaService
@Service
public class TanhuaService {@DubboReferenceprivate RecommendUserApi recommendUserApi;@DubboReferenceprivate UserInfoApi userInfoApi;@DubboReferenceprivate QuestionApi questionApi;@Autowiredprivate HuanXinTemplate template;//查询今日佳人数据public TodayBest todayBest() {//1、获取用户idLong userId = UserHolder.getUserId();//2、调用API查询RecommendUser recommendUser = recommendUserApi.queryWithMaxScore(userId);if(recommendUser == null) {recommendUser = new RecommendUser();recommendUser.setUserId(1l);recommendUser.setScore(99d);}//3、将RecommendUser转化为TodayBest对象UserInfo userInfo = userInfoApi.findById(recommendUser.getUserId());TodayBest vo = TodayBest.init(userInfo, recommendUser);//4、返回return vo;}
}
5.3.4、vo对象
package com.tanhua.domain.vo;import com.tanhua.domain.db.UserInfo;
import com.tanhua.domain.mongo.RecommendUser;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.BeanUtils;/*** 今日佳人*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TodayBest {private Long id; //用户idprivate String avatar;private String nickname;private String gender; //性别 man womanprivate Integer age;private String[] tags;private Long fateValue; //缘分值/*** 在vo对象中,补充一个工具方法,封装转化过程*/public static TodayBest init(UserInfo userInfo, RecommendUser recommendUser) {TodayBest vo = new TodayBest();BeanUtils.copyProperties(userInfo,vo);if(userInfo.getTags() != null) {vo.setTags(userInfo.getTags().split(","));}vo.setFateValue(recommendUser.getScore().longValue());return vo;}
}
5.3.5、解决MongoDB启动bug
在项目中,添加了mongo的依赖的话,springboot就会自动去连接本地的mongo,由于他连接不上会导致出错。
解决有2种方案:
-
排除掉mongo的依赖
-
springboot中添加排除自动配置的注解
package com.tanhua.server;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;@SpringBootApplication(exclude = {MongoAutoConfiguration.class,MongoDataAutoConfiguration.class }) //排除mongo的自动配置 public class TanhuaServerApplication {public static void main(String[] args) {SpringApplication.run(TanhuaServerApplication.class,args);} }
相关文章:
【探花交友】day03—MongoDB基础
目录 课程介绍 1、通用设置 1.1 需求分析 1.2 查询通用设置 1.2 陌生人问题 1.3 通知设置 1.4 黑名单管理 2、MongoDB简介 1.1、MongoDB简介 1.2、MongoDB的特点 1.3 数据类型 3、MongoDB入门 2.1、数据库以及表的操作 2.2、新增数据 2.3、更新数据 2.4、删除数…...
总结-常见缓存替换算法
缓存替换算法 1. 总结 1. 总结 常见的缓存替换算法除了FIFO、LRU和LFU还有下面几种: 算法优点缺点适用场景FIFO简单实现可能移除重要数据嵌入式系统,简单场景LRU局部性原理良好维护成本高,占用更多存储空间内存管理,浏览器缓存L…...
宏集eX710物联网工控屏在石油开采机械中的应用与优势
案例概况 客户:天津某石油机械公司 应用产品:宏集eX710物联网工控屏 应用场景:钻井平台设备控制系统 一、应用背景 石油开采和生产过程复杂,涵盖钻井平台、采油设备、压缩机、分离器、管道输送系统等多种机械设备。这些设备通…...
【社区投稿】自动特征auto trait的扩散规则
自动特征auto trait的扩散规则 公式化地概括,auto trait marker trait derived trait。其中,等号右侧的marker与derived是在Rustonomicon书中的引入的概念,鲜见于Rust References。所以,若略感生僻,不奇怪。 marker …...
【MySQL】第一弹----库的操作及数据类型
笔上得来终觉浅,绝知此事要躬行 🔥 个人主页:星云爱编程 🔥 所属专栏:MySQL 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 一、SQL 语句分类 DDL:数据定…...
【服务器主板】定制化:基于Intel至强平台的全新解决方案
随着数据处理需求不断增长,服务器硬件的发展也在持续推进。在这一背景下,为用户定制了一款全新的基于Intel至强平台的服务器主板,旨在提供强大的计算能力、优异的内存支持以及高速存储扩展能力。适用于需要高性能计算、大规模数据处理和高可用…...
Flutter路由工具类RouteUtils,可二次开发,拿来即用
一、RouteUtils路由核心类 /*** 路由封装*/ class RouteUtils {RouteUtils._();static final navigatorKey GlobalKey<NavigatorState>();// App 根节点Contextstatic BuildContext get context > navigatorKey.currentContext!;static NavigatorState get navigato…...
报错:No module named ‘pygeohash‘
如果你遇到这个错误: platform... using builtin-java classes where applicableTraceback (most recent call last):File "/home/spark-shell/AppLogDWD02.py", line 4, in <module>from pygeohash import encodeModuleNotFoundError: No module …...
SQL中的TRIM用法
TRIM 是 SQL 中用于去除字符串两端(左侧和右侧)的空格或特定字符的函数。这个函数常用于清理数据中的无效空白字符,尤其是在从外部系统导入数据时,常常会遇到数据两端有不必要的空格,使用 TRIM 可以去除这些多余的字符…...
AIGC在电影与影视制作中的应用:提高创作效率与创意的无限可能
云边有个稻草人-CSDN博客 目录 引言 一、AIGC在剧本创作中的应用 1.1 剧本创作的传统模式与挑战 1.2 AIGC如何协助剧本创作 1.3 未来的剧本创作:AI辅助的协同创作 二、AIGC在角色设计中的应用 2.1 传统角色设计的挑战 2.2 AIGC如何协助角色设计 三、AIGC在…...
【蓝桥杯——物联网设计与开发】拓展模块5 - 光敏/热释电模块
目录 一、光敏/热释电模块 (1)资源介绍 🔅原理图 🔅AS312 🌙简介 🌙特性 🔅LDR (2)STM32CubeMX 软件配置 (3)代码编写 (4&#x…...
深入探索openEuler Kernel:操作系统的心脏
title: 深入探索openEuler Kernel:操作系统的心脏 date: ‘2024-12-28’ category: blog tags: openEulerLinux Kernel操作系统性能优化 sig: Kernel archives: ‘2024-12’ author:way_back summary: openEuler Kernel作为openEuler操作系统的核心,扮演…...
Unity3d UGUI如何优雅的实现Web框架(Vue/Rect)类似数据绑定功能(含源码)
前言 Unity3d的UGUI系统与Web前端开发中常见的数据绑定和属性绑定机制有所不同。UGUI是一个相对简单和基础的UI系统,并不内置像Web前端(例如 Vue.js或React中)那样的双向数据绑定或自动更新UI的机制。UGUI是一种比较传统的 UI 系统ÿ…...
【JavaEE进阶】@RequestMapping注解
目录 📕前言 🌴项目准备 🌲建立连接 🚩RequestMapping注解 🚩RequestMapping 注解介绍 🎄RequestMapping是GET还是POST请求? 🚩通过Fiddler查看 🚩Postman查看 …...
Vue.js组件开发-自定义文件上传
在Vue.js中开发自定义文件上传组件,创建一个独立的Vue组件来处理文件选择和上传的逻辑。这个组件可以包含文件选择器、上传进度条、上传状态提示等元素,并根据需要进行自定义。 示例: <template><div class"file-upload"…...
CES Asia 2025的低空经济展区有哪些亮点?
CES Asia 2025(赛逸展)的低空经济展区有以下亮点: • 前沿科技产品展示: 多款新型无人机将亮相,如固定翼无人机和系留无人机的最新型号,其在监测、救援和货物运输等方面功能强大。此外,还有可能…...
公路边坡安全监测中智能化+定制化+全面守护的应用方案
面对公路边坡的安全挑战,我们如何精准施策,有效应对风险?特别是在强降雨等极端天气下,如何防范滑坡、崩塌、路面塌陷等灾害,确保行车安全?国信华源公路边坡安全监测解决方案,以智能化、定制化为…...
Arduino 驱动GY-271(HMC5883L)三轴磁场模块
Arduino 驱动GY-271(HMC5883L)三轴磁场模块 简介特征参数原理图寄存器通信测量步骤接线主要代码结果 简介 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场的检测领域。HMC5883L 包…...
ImportError: cannot import name ‘einsum‘ from ‘einops‘
报错: from einops import einsum ImportError: cannot import name einsum from einops 测试代码: python -c "from einops import einsum" 解决方法: pip uninstall einops pip install einops Successfully installed ein…...
GitLab安装及使用
目录 一、安装 1.创建一个目录用来放rpm包 2.检查防火墙状态 3.安装下载好的rpm包 4.修改配置文件 5.重新加载配置 6.查看版本 7.查看服务器状态 8.重启服务器 9.输网址 二、GitLab的使用 1.创建空白项目 2.配置ssh 首先生成公钥: 查看公钥 把上面的…...
攻防世界web第二题unseping
这是题目 <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("ping"))) {cal…...
Bitmap(BMP)图像信息验证
Bitmap BMP图像信息验证 参考文章例程目的一、Bitmap图像结构二、获取文件大小三、获取应用程序路径四、获取目录中所有内容(包括子目录)五、Bitmap图像信息验证六、主函数测试七、测试结果 参考文章 在Windows下C语言获取当前应用程序运行路径并获取指定目录下所有文件Bitmap…...
Faster R-CNN
文章目录 摘要Abstract1. 引言2. 框架2.1 RPN2.1.1 网络结构2.1.2 损失函数2.1.3 训练细节 2.2 训练过程 3. 创新点和不足3.1 创新点3.2 不足 参考总结 摘要 Faster R-CNN是针对Fast R-CNN缺点改进的目标检测模型。为了解决候选区域生成耗时长的问题,Faster R-CNN提…...
MySQL数据库锁
MySQL中读写不互斥(前提是没有使用串行化隔离级别),但是写写操作要互斥才行,MySQL中使用锁机制来实现写写互斥。 按照锁的粒度可以分为:全局锁、表锁、行锁以及其他位于二者之间的间隙锁。 全局锁 锁定整个数据库&…...
树莓派A+安装lnmp-第一步,安装mariadb
20:26 2024/12/27 第一件事情,当然是超频!!! raspi-config 4 Performance Options,选择P1 Overclock,可配置超频 不要贪心,选择900就可以!!! rootpia4:~#…...
C++:单例模式
创建自己的对象,同时确保对象的唯一性。 单例类只能有一个实例☞静态成员static☞静态成员 必须类外初始化 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一实例 静态成员类内部可以访问 构造函数私有化☞构造函数私有外部不能创建&#x…...
【数据结构】数据结构整体大纲
数据结构用来干什么的?很简单,存数据用的。 (这篇文章仅介绍数据结构的大纲,详细讲解放在后面的每一个章节中,逐个击破) 那为什么不直接使用数组、集合来存储呢 ——> 如果有成千上亿条数据呢ÿ…...
网页数据的解析提取之Beautiful Soup
前面博客介绍了正则表达式的相关用法,只是一旦正则表达式写得有问题,得到的结果就可能不是我们想要的了。而且每一个网页都有一定的特殊结构和层级关系,很多节点都用id或 class 作区分所以借助它们的结构和属性来提取不也可以吗? 本篇博客我…...
Ai写作人工智能官网模板源码
Mortal是响应式的Tailwind CSS 模板,适用于AI写作和文案智能生成网站。 可用于撰写博客内容、数字广告文案、技术写作、SEO内容、登陆页面文案、社交媒体内容、电子邮件营销、网站文案等。使用世界上流行的响应式CSS框架Tailwind CSS、HTML5、CSS3 和 Javascript构…...
VSCode 插件开发实战(七):插件支持了哪些事件,以及如何利用和监听这些事件
前言 VSCode 作为现代开发者的首选编辑器之一,其核心优势在于其高度可扩展性。通过自定义插件,开发者可以根据自己的需求对编辑器进行功能扩展和优化。在这些插件开发过程中,事件处理和监听机制尤为重要,它们允许插件在特定事件发…...
现货量化合约跟单系统开发策略指南
随着加密货币市场的日益发展,量化交易和合约跟单已经成为了投资者在市场中获取稳定收益的重要手段。现货量化合约跟单系统作为一种自动化交易工具,可以帮助用户自动执行交易策略,同时也能跟随成功的交易者进行复制交易,从而降低投…...
Flink的Watermark水位线详解
一、Flink的时间语义 Flink有如下三种时间语义: Flink的三种时间语义-CSDN博客 在实际应用中,一般会采用事件时间语义。而正如前面所说的,事件时间语义需要等窗口的数据全部到齐了,才能进行窗口计算。那么,什么时候数…...
香港 GPU 服务器托管引领 AI 创新,助力 AI 发展
在当今科技飞速发展的时代,中国人工智能市场呈现出蓬勃发展的态势,对高性能计算资源的需求日益增长,而香港 GPU 服务器托管服务凭借其卓越的优势,成为众多企业的首选,同时其三地灾备方案更是为企业数据安全和业务连续性…...
FFmpeg来从HTTP拉取流并实时推流到RTMP服务器
当使用FFmpeg来从HTTP拉取流并实时推流到RTMP服务器时,你可以使用以下命令: ffmpeg -i http://输入流地址 -c:v copy -c:a copy -f flv rtmp://RTMP服务器地址/应用名称/流名称 这是一个基本的命令示例,其中: - -i http://输入流地…...
vue 集成 webrtc-streamer 播放视频流 - 解决阿里云内外网访问视频流问题
资料: 史上最详细的webrtc-streamer访问摄像机视频流教程-CSDN博客 webrtc目录 前端集成 html文件夹里的webrtcstreamer.js,集成到前端,可以访问webrtc,转换rtsp为webrtc视频流,在前端video中播放 <videoref&quo…...
Spring创建异步线程池方式
在Java 11中,可以通过多种方式创建异步线程池,包括使用原生的ExecutorService和Spring的异步支持(如Async注解结合线程池)。以下是具体实现方式。 方式 1:使用原生ExecutorService Java 11 的ExecutorService提供灵活…...
《PHP MySQL 插入数据》
《PHP MySQL 插入数据》 介绍 PHP是一种广泛使用的服务器端脚本语言,而MySQL是一种流行的关系型数据库管理系统。在Web开发中,经常需要将用户输入的数据存储到数据库中。本文将详细介绍如何使用PHP和MySQL实现数据的插入操作。 环境准备 在开始之前&…...
2022博客之星年度总评选开始了
作者简介:陶然同学 专注于Java领域开发 熟练掌握Java、js等语言的“Hello World” CSDN原力计划作者、CSDN内容合伙人、Java领域优质作者、Java领域新星作者、51CTO专家、华为云专家、阿里云专家等 🎬 陶然同学🎥 由 陶然同学 原创&#…...
0055. shell命令--useradd
目录 55. shell命令--useradd 功能说明 语法格式 选项说明 选项 退出值 相关文件 /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/skel/ /etc/login.defs /etc/default/useradd 实践操作 注意事项 55. shell命令--useradd 功能说明 useradd 命令是 Lin…...
HTML5适配手机
要使 HTML5 网站适配手机设备,您可以遵循以下几个步骤和最佳实践: 1. 使用视口(Viewport) 在 HTML 文档的 <head> 部分添加视口元标签,以确保页面在移动设备上正确缩放和显示: <meta name"…...
网络安全 | 5G网络安全:未来无线通信的风险与对策
网络安全 | 5G网络安全:未来无线通信的风险与对策 一、前言二、5G 网络的技术特点2.1 超高速率与低延迟2.2 大容量连接与网络切片 三、5G 网络面临的安全风险3.1 网络架构安全风险3.2 设备终端安全风险3.3 应用场景安全风险3.4 用户隐私安全风险 四、5G 网络安全对策…...
Markov test笔记
补充知识 来源于数学之美第五章: 到了 19 世纪,概率论的发展从相对静止的随机变量的研究发展到随机变量的时间序列 ( s 1 , s 2 , s 3 , … ) (s_1, s_2, s_3, \dots) (s1,s2,s3,…),即随机过程(动态的)。这在…...
docker 搭建集群
准备3台机器: #dockermaster 192.168.31.150 sudo hostnamectl set-hostname dockermaster #初始化主节点 docker swarm init --advertise-addr 192.168.31.150 #查看集群是否搭建成功 docker node ls #dockernode1 192.168.31.151 sudo hostnamectl set-hostname …...
C# WPF读写STM32/GD32单片机Flash数据
1.安装jlink 下载你需要的Jlink版本 JLink-Windows-V792k-x86-64 JLink-Windows-V810k-x86-64 https://download.csdn.net/download/hmxm6/90178195 2.Visual Studio创建WPF项目 如果没有这个选项请看 https://blog.csdn.net/hmxm6/article/details/132914337 创建完…...
[图形渲染]【Unity Shader】【游戏开发】 Shader数学基础17-法线变换基础与应用
在计算机图形学中,法线(normal) 是表示表面方向的向量。它在光照、阴影、碰撞检测等领域有着重要作用。本文将介绍如何在模型变换过程中正确变换法线,确保其在光照计算中的正确性,特别是法线与顶点的变换问题。 1. 法线与切线的基本概念 法线(Normal Vector) 法线(或…...
MySQL外键类型与应用场景总结:优缺点一目了然
前言: MySQL的外键简介:在 MySQL 中,外键 (Foreign Key) 用于建立和强制表之间的关联,确保数据的一致性和完整性。外键的作用主要是限制和维护引用完整性 (Referential Integrity)。 主要体现在引用操作发生变化时的处理方式&…...
Axure10
如果还是不行就将字体图标安装在控制面板–字体下 打开原型了之后,icon没有 一定要将字体库放到–》控制面板\外观和个性化\字体 里面...
数据结构(单向循环链表)
循环单向链表 所谓的循环,指得是将链表末尾节点的后继指针指向头结点。比如,单向链表变成循环链表的示意 图如下所示: 循环链表的操作跟普通链表操作基本上是一致的,只要针对循环特性稍作修改即可。 sclist.h #ifndef __SCLIST_…...
springboot项目搭建
springboot搭建 问题描述不够清晰,无法提供具体的代码解决方案。"springboot搭" 这个表述不明确是要进行什么操作,比如搭建项目、搭建环境、搭建服务等。 如果你是想要创建一个基本的Spring Boot项目,可以使用Spring Initializr&…...
五模型对比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测
目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 光伏功率预测!五模型对比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测(Matlab2023b 多输入单输出) 1.程序已经调试好,替换数据集后,仅运…...