12、MongoDB -- 通过 SpringBoot 整合 Spring Data MongoDB 操作 MongoDB 数据库(传统的同步API编程)

目录

  • 通过 SpringBoot 整合 Spring Data MongoDB 操作 MongoDB 数据库(传统的同步API编程)
    • 演示前提:
      • 登录单机模式的 mongodb 服务器命令
      • 登录【test】数据库的 mongodb 客户端命令
      • 登录【admin】数据库的 mongodb 客户端命令
    • 代码演示同步API编程
      • 实体类
      • 配置类
      • 方法名关键字查询和@Query查询的接口
      • 自定义查询的接口
        • 自定义查询接口的实现类
          • 要求书名【name】匹配这个这个正则表达式【nameRegex】,且价格【price】大于这个【startPrice】
          • 查询价格在这个范围的文档
      • 测试方法
      • 测试结果
    • 完整代码
      • Book 实体类
      • SyncBookDao 方法名关键字查询和@Query查询接口
      • SyncCustomBookDao 自定义查询接口
      • SyncCustomBookDaoImpl 自定义查询方法的实现类
      • application.properties 配置类
      • SyncBookDaoTest 测试类方法
      • pom.xml 依赖文件

通过 SpringBoot 整合 Spring Data MongoDB 操作 MongoDB 数据库(传统的同步API编程)

演示前提:


登录单机模式的 mongodb 服务器命令

mongod.exe --config "E:\install\mongodb\mongodb-4.2.25\mongod.conf"

在这里插入图片描述


将 MongoDB 注册成 Windows 服务器

为了方便,我们可以以管理员的身份打开命令行窗口,来执行如下命令可将 MongoDB 注册成 Windows 服务器,就不用每次都用命令启动 mongodb 服务器

mongod.exe --config "E:\install\mongodb\mongodb-4.2.25\mongod.conf" --install

在这里插入图片描述


登录【test】数据库的 mongodb 客户端命令

mongo mongodb://192.168.0.107:27017/test -u LJHAAA -p 123456

在这里插入图片描述


登录【admin】数据库的 mongodb 客户端命令

mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456

在这里插入图片描述


MongoDB–通过SpringBoot整合Spring Data MongoDB操作MongoDB数据库(反应式(异步)编程演示: 方法名关键字查询、@Query查询、自定义查询、样本查询)这篇文章是通过反应式异步编程来演示的。


接下来演示传统的同步API编程:

区别:

异步的DAO接口是继承这个【ReactiveCrudRepository】接口
同步的DAO接口是继承这个【CrudRepository 】接口



代码演示同步API编程


实体类

在这里插入图片描述


配置类

在这里插入图片描述


方法名关键字查询和@Query查询的接口

在这里插入图片描述


自定义查询的接口

在这里插入图片描述


自定义查询接口的实现类

要求书名【name】匹配这个这个正则表达式【nameRegex】,且价格【price】大于这个【startPrice】

在这里插入图片描述


查询价格在这个范围的文档

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


测试方法

具体可以参考上一篇的基于反应式的异步API

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


测试结果

全部都测试通过

在这里插入图片描述

mongodb 数据库的books集合的数据

在这里插入图片描述



完整代码


Book 实体类

package cn.ljh.mongoboot.domain;import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.index.TextIndexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.FieldType;
import org.springframework.data.mongodb.core.mapping.MongoId;/*** author JH  2024-03*///映射到mongodb数据库里面的【books】集合
@Document("books")
@Data
public class Book
{// id 的类型定义成String,灵活性比较大// @MongoId(FieldType.INT64)//普通的 @Id 注解更合适@Idprivate String id;//给【name】字段建立索引@Indexedprivate String name;@Indexedprivate double price;private String author;//表示 【desc】 字段映射到数据库集合中的【description】字段列@Field("description")@TextIndexed  //目前全文检索默认不支持中文private String desc;//无参构造器public Book(){}//有参构造器public Book( String name, double price, String author, String desc){this.name = name;this.price = price;this.author = author;this.desc = desc;}
}

SyncBookDao 方法名关键字查询和@Query查询接口

package cn.ljh.mongoboot.dao;import cn.ljh.mongoboot.domain.Book;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
import java.util.List;//继承这个传统的同步API ---> CrudRepository//类型参数1:操作的实体类  ; 类型参数2:实体类的主键类型
public interface SyncBookDao extendsCrudRepository<Book, String>,QueryByExampleExecutor<Book>, //样本查询的接口SyncCustomBookDao //自定义的查询方法的接口
{//===================================================方法名关键字查询(全自动)==========================================//返回值为 Flux ,表示接收多个返回值 ;  返回值为 Mono ,表示接收单个返回值//根据【关键字】,查询【name】字段包含该关键字的文档List<Book> findByName(String name);//根据【关键字】,对【price】字段的值进行范围查询List<Book> findByPriceBetween(double startPrice, double endPrice);//根据【关键字】,通过【通配符】形式查询【author】字段包含该关键字的文档List<Book> findByAuthorLike(String authorPattern);//根据【关键字】,通过【正则表达式】方式查询【name】字段包含该关键字的文档List<Book> findByNameRegex(String name);//查询【price】字段的值大于指定参数值(关键字)的文档【有几条】Integer countByPriceGreaterThan(double startPrice);//===================================================@Query查询(半自动)==============================================//通过关键字 term 对文档进行全文检索@Query("{$text: {$search: ?0}}")List<Book> findByText(String term);//通过 【author】字段 和 【price】价格大于指定参数值 来查询文档@Query("{author: ?0 ,price:{$gt: ?1}}")List<Book> findByQuery(String author, double startPrice);}

SyncCustomBookDao 自定义查询接口

package cn.ljh.mongoboot.dao;import cn.ljh.mongoboot.domain.Book;
import reactor.core.publisher.Flux;import java.util.List;//自定义查询方法的接口public interface SyncCustomBookDao
{//要求书名【name】匹配这个这个正则表达式【nameRegex】,且价格【price】大于这个【startPrice】List<Book> findByCustomRegexAndPrice(String nameRegex , double startPrice);//查询价格在这个范围的文档List<Book> findByCustomPrice(double startPrice , double endPrice);}

SyncCustomBookDaoImpl 自定义查询方法的实现类

package cn.ljh.mongoboot.dao.impl;import cn.ljh.mongoboot.dao.SyncCustomBookDao;
import cn.ljh.mongoboot.domain.Book;
import com.mongodb.BasicDBObject;
import com.mongodb.client.MongoCursor;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import reactor.core.publisher.Flux;import java.util.ArrayList;
import java.util.List;public class SyncCustomBookDaoImpl implements SyncCustomBookDao
{@Autowiredprivate MongoTemplate mongoTemplate;@Overridepublic List<Book> findByCustomRegexAndPrice(String nameRegex, double startPrice){//Spring Data MongoDB 提供了一个 Criteria类 来构建 query 这个查询对象// where是Criteria类的一个静态方法,用于指定要查询的字段或属性// Criteria.where("name")表示对"name"字段进行查询操作,// .regex(nameRegex)表示使用正则表达式进行匹配,nameRegex是传入的名称的正则表达式// .and("price")表示在上述查询条件的基础上再加入"price"字段的查询条件// .gt(startPrice)表示查询大于给定起始价格的值Query query = Query.query(Criteria.where("name").regex(nameRegex) //查询条件1.and("price").gt(startPrice));  //查询条件2//query:代表查询条件 ; Book.class:要查询的实体对象List<Book> books = mongoTemplate.find(query, Book.class);return books;}@Overridepublic List<Book> findByCustomPrice(double startPrice, double endPrice){//.execute 方法用来执行一个MongoDB查询操作//mongoCollection,来自 MongoDB的驱动 API ,代表一个 collectionList<Book> bList = mongoTemplate.execute(Book.class, mongoCollection ->{//自定义的查询条件是这样的:{price: { $gt: startPrice , $lt:endPrice }}//这个BasicDBObject 就是代表查询条件中的一个对象BasicDBObject cond = new BasicDBObject();//给这个对象设置查询条件,就能得到这个 { $gt: startPrice , $lt:endPrice }cond.put("$gt", startPrice);cond.put("$lt", endPrice);//再创建一个对象BasicDBObject bson = new BasicDBObject();//再把查询条件设置进去,就得到这个 {price: { $gt: startPrice , $lt:endPrice }} 查询对象bson.put("price", cond);MongoCursor<Document> docs = mongoCollection.find(bson).iterator();//将 docs 里面的每个 document 转换成 Book ,并存到List之后再返回List<Book> bookList = new ArrayList<>();while (docs.hasNext()){Document document = docs.next();Book book = new Book((String) document.get("name"),(Double) document.get("price"),(String) document.get("author"),(String) document.get("description"));//因为 id 有普通的string类型,也有 objectId 类型,所以需要做判断Object id = document.get("_id");//如果 id 是 ObjectId 类型; instanceof是Java中的一个运算符,用于检查一个对象是否属于某个特定的类型或其子类型if (id instanceof ObjectId){ObjectId obId = (ObjectId) id;//toHexString是ObjectId类的一个方法,用于将ObjectId对象转换为十六进制字符串表示形式book.setId(obId.toHexString());} else{book.setId((String) id);}bookList.add(book);}return bookList;});return bList;}
}

application.properties 配置类

# 连接mongodb数据库
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=test
spring.data.mongodb.username=LJHAAA
spring.data.mongodb.password=123456# 指定 spring.data.mongodb 根据实体类Book的字段上的索引注解(@Indexed@TextIndexed )来创建索引
spring.data.mongodb.auto-index-creation=true

SyncBookDaoTest 测试类方法

package cn.ljh.mongoboot.dao;import cn.ljh.mongoboot.domain.Book;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;import java.util.List;
import java.util.Optional;/*** author JH  2024-03*///表示不要用web环境来进行测试
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public class SyncBookDaoTest
{//依赖注入@Autowiredprivate SyncBookDao bookDao;//==============================================增删改查==============================================================//添加一个文档到books集合里面,该文档的id为自己指定的@ParameterizedTest //表示这个方法是一个参数化的测试//需要多个参数进行测试,用这个注解@CsvSource({//因为 mongodb 目前不支持中文进行全文检索,所以把内容写成英文来测试"1,火影忍者,100,岸本齐史,this cartoon is very good"})public void testSaveWithId(String id, String name, double price, String author, String desc){Book b = new Book(name, price, author, desc);//自己设置idb.setId(id);Book book = bookDao.save(b);System.err.println(book);}//添加多个文档到books集合里面,该文档的id为mongodb自己指定的//表示这个方法是一个参数化的测试@ParameterizedTest//需要多个参数进行测试,用这个注解@CsvSource({"家庭教师,200,天野明,aa this cartoon is jiatingjiaoshi","七龙珠,300,鸟山明,aa this cartoon is very qilongzhu","蜡笔小新,400,臼井仪人,bb this cartoon is very labixiaoxin"})public void testSaveWithId(String name, double price, String author, String desc){Book b = new Book(name, price, author, desc);Book book = bookDao.save(b);System.err.println(book);}//根据id查询文档@ParameterizedTest//测试方法只需要一个参数用这个注解@ValueSource(strings = {"1","65eda80aec60bd4deae6f38b"})public void testFindById(String id){Optional<Book> book = bookDao.findById(id);System.err.println(book);}//对文档进行修改@Testpublic void testUpdate(){Optional<Book> b = bookDao.findById("1");//如果Optional对象中存在图书对象,则执行ifPresent中的逻辑b.ifPresent(//使用Lambda表达式的方式对查找到的图书进行操作book ->{//进行修改操作book.setName(book.getName() + "AAAAA");//使用.block()方法阻塞当前线程,直到保存操作完成。这样确保更新操作在调用block()之前完成,并且等待操作结果返回bookDao.save(book);});}//根据id查询文档@ParameterizedTest//测试方法只需要一个参数用这个注解@ValueSource(strings = {"1",})public void testDeleteById(String id){bookDao.deleteById(id);}//==============================================方法名关键字查询(全自动查询)============================================//根据名字查询文档//表示这个方法是一个参数化的测试方法@ParameterizedTest//只需要一个参数用这个注解@ValueSource(strings = {"火影忍者","七龙珠"})public void testFindByName(String name){List<Book> books = bookDao.findByName(name);books.forEach(System.err::println);}//根据价格范围查询@ParameterizedTest@CsvSource({"50,250","150,450"})public void testFindByPriceBetween(double startPrice, double endPrice){List<Book> books = bookDao.findByPriceBetween(startPrice, endPrice);books.forEach(System.err::println);}//根据【author】字段进行【通配符】查询@ParameterizedTest@ValueSource(strings = {"天*","岸*"})public void testFindByAuthorLike(String authorPattern){List<Book> books = bookDao.findByAuthorLike(authorPattern);books.forEach(System.err::println);}//通过名字来进行正则表达式查询@ParameterizedTest@ValueSource(strings = {// ^ 符号表示开头,表示必须由【火】字开头; 这个 . 这个点表示匹配任意字符;  $ 符号表示结尾"^火.+$",//^ . 表示任意符号开头,中间包含【小】,后面的.表示任意符号结尾"^.+小.+$"})public void testFindByNameRegex(String name){List<Book> books = bookDao.findByNameRegex(name);books.forEach(System.err::println);}//查询价格大于指定参数值的文档有几条@ParameterizedTest@ValueSource(doubles = {100.0,200.0})public void testCountByPriceGreaterThan(double startPrice){System.err.println("price 大于【 " + startPrice + " 】的文档有【 " + bookDao.countByPriceGreaterThan(startPrice) + " 】条");}//===================================================@Query查询(半自动)==============================================//通过关键字 term 对文档进行全文检索@ParameterizedTest@ValueSource(strings = {"good","aa"})public void testFindByText(String term){List<Book> books = bookDao.findByText(term);books.forEach(System.err::println);}//通过 作者 和 价格大于指定参数值 来查询文档@ParameterizedTest@CsvSource({"天野明,50","天野明,500"})public void testFindByQuery(String author, double startPrice){List<Book> books = bookDao.findByQuery(author, startPrice);books.forEach(System.err::println);}//==============================================自定义查询(全手动查询)=================================================//要求书名【name】匹配这个这个正则表达式【nameRegex】,且价格【price】大于这个【startPrice】@ParameterizedTest@CsvSource({//^ 表示开头 , 点 . 表示任意字符 ,$ 表示结尾 :全部就是以任意字符开头,然后中间有个【影】字,然后以任意字符结尾"^.+影.+$ , 50","^.+教.+$, 50"})public void testFindByCustomRegexAndPrice(String nameRegex, double startPrice){List<Book> books = bookDao.findByCustomRegexAndPrice(nameRegex, startPrice);books.forEach(System.err::println);}//查询价格在这个范围的文档@ParameterizedTest@CsvSource({"99,199","199,399"})public void testFindByCustomPrice(double startPrice, double endPrice){List<Book> books = bookDao.findByCustomPrice(startPrice, endPrice);books.forEach(System.err::println);}//==============================================样本查询=============================================================@ParameterizedTest@CsvSource({"火影忍者,岸本齐史","家庭教师,天野明明明"})public void testByExanple(String name, String author){//构建一个样本查询的对象Example<Book> example = Example.of(new Book(name, 0.0, author, null),ExampleMatcher.matching().withIgnoreNullValues() //忽略 null 属性.withIgnorePaths("price") //忽略 price 属性);Iterable<Book> books = bookDao.findAll(example);books.forEach(System.err::println);}}

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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3</version></parent><groupId>cn.ljh</groupId><artifactId>mongoboot</artifactId><version>1.0.0</version><name>mongoboot</name><properties><java.version>11</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><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-data-mongodb-reactive</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>io.projectreactor</groupId><artifactId>reactor-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>


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

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

相关文章

欧科云链:比特币现货ETF后时代,链上数据揭示真实供需关系

出品&#xff5c;欧科云链研究院 作者&#xff5c;Hedy Bi 本文于3月11日首发TechFlow深潮&#xff0c;原标题为《比特币现货ETF通过后的2个月&#xff1a;链上数据揭示BTC供不应求》。文中观点纯属笔者基于链上数据进行分析&#xff0c;不构成对任何潜在投资目标的推荐或意见…

双指针、bfs与图论

1238. 日志统计 - AcWing题库 import java.util.*;class PII implements Comparable<PII>{int x, y;public PII(int x, int y){this.x x;this.y y;}public int compareTo(PII o){return Integer.compare(x, o.x);} }public class Main{static int N 100010, D, K;st…

数字电子技术实验(四)

单选题 1.组合逻辑电路中产生竞争冒险的原因是&#xff1f; A. 电路没有最简化 。 B. 时延 。 C. 电路有多个输出。 D. 逻辑门的类型不同。 答案&#xff1a;B 评语&#xff1a;10分 单选题 2.下列表达式不存在竞争冒险的有&#xff1f; 答案&#xff1a;A 评语&#x…

深度强化学习(七)策略梯度

深度强化学习(七)策略梯度 策略学习的目的是通过求解一个优化问题&#xff0c;学出最优策略函数或它的近似函数&#xff08;比如策略网络&#xff09; 一.策略网络 假设动作空间是离散的,&#xff0c;比如 A { 左 , 右 , 上 } \cal A\{左,右,上\} A{左,右,上}&#xff0c;策…

【零基础学习06】嵌入式linux驱动中PWM驱动基本实现

大家好,今天给大家分享一下,如何利用PWM外设来实现LCD背光调节,本次实验使用Linux系统中PWM控制器以及PWM子系统来控制对应的功能。 第一:设备树下PWM控制节点 PWM对应的节点信息如下: pwm3: pwm@02088000 {compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm…

操作系统系列学习——一个实际的schedule函数

文章目录 前言一个实际的schedule函数 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感…

我打算修一段时间仙,望周知

1、大科学家牛顿也修过仙&#xff0c;虽然修的是西方的仙&#xff1b;我们东方人不信那个邪&#xff0c;有自己优秀的传统文化&#xff0c;我只修东方的仙&#xff1b;另外&#xff0c;作为普通凡人我成就和智慧都无法望牛顿老人家项背的普通人&#xff0c;即使现在暂时“修仙”…

【代码】求出指定图片的平均RGB颜色值

import cv2求出指定图片的平均颜色值# 读取图片 image cv2.imread(D:\\Desktop\\0001.png)# 计算平均颜色 # cv2.mean()函数会返回图像所有通道的平均值 # 这里的平均值是按通道分别计算的&#xff0c;返回值是一个包含每个通道平均值的元组 average_color_per_channel cv2.m…

FFmpeg工作流程及视频文件分析

FFmpeg工作流程: 解封装(Demuxing)--->解码(Decoding)--->编码(Encoding)--->封装(Muxing) FFmpeg转码工作流程: 读取输入流--->音视频解封装--->解码音视频帧--->编码音视频帧--->音视频封装--->输出目标流 可简单理解为如下流程: 读文件-->解…

软件测试工程师简历要怎么写,才能让HR看到

作为软件测试的从业者&#xff0c;面试或者被面试都是常有的事。 可是不管怎样&#xff0c;和简历有着理不清的关系&#xff0c;面试官要通过简历了解面试者的基本信息、过往经历等。 面试者希望通过简历把自己最好的一面体现给面试官&#xff0c;所以在这场博弈中&#xff0…

MySQL和Redis如何保证数据一致性?

前言 由于缓存的高并发和高性能已经在各种项目中被广泛使用&#xff0c;在读取缓存这方面基本都是一致的&#xff0c;大概都是按照下图的流程进行操作&#xff1a; 但是在更新缓存方面&#xff0c;是更新完数据库再更新缓存还是直接删除缓存呢&#xff1f;又或者是先删除缓存再…

什么又是线程呢??

线程&#xff1a; 线程可以并发的执行&#xff0c;但是线程的地址是可以共享的 进程与线程的比较&#xff1a; 进程>线程 线程分三种&#xff1a; 用户线程 只有用户程序的库函数来 用户线程 因为操作系统感知不到 线程&#xff0c;如果有线程在运行&#xff0c;然后不交…

如何使用Python进行数据可视化:Matplotlib和Seaborn指南【第123篇—Matplotlib和Seaborn指南】

如何使用Python进行数据可视化&#xff1a;Matplotlib和Seaborn指南 数据可视化是数据科学和分析中不可或缺的一部分&#xff0c;而Python中的Matplotlib和Seaborn库为用户提供了强大的工具来创建各种可视化图表。本文将介绍如何使用这两个库进行数据可视化&#xff0c;并提供…

element-plus表格,多样本比较,动态渲染表头

问题&#xff1a; 公司给了个excel表格&#xff0c;让比较两个样本之间的数据&#xff0c;并且动态渲染&#xff0c;搞了半天没搞出来&#xff0c;最后让大佬解决了&#xff0c;特此写篇博客记录一下。 我之前的思路是合并行&#xff0c;大概效果是这样&#xff1a; 但是最终…

DataGrip 面试题及答案整理,最新面试题

DataGrip的数据库兼容性和多数据库支持如何实现&#xff1f; DataGrip实现数据库兼容性和多数据库支持的方式包括&#xff1a; 1、广泛的数据库支持&#xff1a; DataGrip支持多种数据库&#xff0c;包括但不限于MySQL, PostgreSQL, SQL Server, Oracle, SQLite, 和MongoDB&a…

小米笔记本出现no bootable devices

原因&#xff1a;硬件松动 解决方案&#xff1a; 1、不妨翻个面敲几下&#xff0c;上下左右晃晃试试 2、这个问题也困扰我好久了 搜了好多答案说是硬盘出了问题 前几次就是摇一摇&#xff0c;拍一拍就好了 后来怎么拍也没有用了 没办法自己动手&#xff0c;买一套螺丝刀&…

Docker----Dockerfile构建微服务镜像

目录 一、关键步骤 二、具体步骤 1、准备后端jar包(这里以java后端演示) 2、编写Dockerfile 3、构建镜像 4、运行镜像容器 5、测试是否成功 一、关键步骤 1、准备后端jar包(这里以java后端演示) 2、编写Dockerfile 3、构建镜像 4、运行镜像容器 5、测试是否成功 二…

Web前端依赖版本管理最佳实践

本文需要读者懂一点点前端的构建知识&#xff1a; 1. package.json文件的作用之一是管理外部依赖&#xff1b;2. .npmrc是npm命令默认配置&#xff0c;放在工程根目录。 Web前端构建一直都是一个不难&#xff0c;但是非常烦人的问题&#xff0c;在DevOps、CI/CD领域。 烦人的是…

HTTPS证书很贵吗?

首先&#xff0c;我们需要明确一点&#xff0c;HTTPS证书的价格并不是一成不变的&#xff0c;它受到多种因素的影响。其中最主要的因素包括证书的类型、颁发机构以及所需的验证级别。 从类型上来看&#xff0c;HTTPS证书主要分为单域名证书、多域名证书和通配符证书。单域名证书…

pta上的几个例题

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…