【Java开发Spring优雅编程系列】基于Spring Boot + MongoDB 最简单使用案例

使用场景
  • 用于价值较低的数据,对事务性要求不高,例如:视频的评论点赞互动信息、数据下行日志数据,但是对于财务类系统最好使用关系型数据库;
  • 灵活的数据模型,由于数据字段采用JSON形式,业务字段多变的场景,推荐使用MongoDB;
  • 大数据量、高性能,由于数据结构简单,在大数据量下具有很好的读写性能,为互联网三高项目使用;
  • 相比关系型数据库,具有更好的扩展性;
与Mysql数据库对比
比较点 MongoDB MySQL
数据库类型 文档型数据库,存储的是文档型数据(JSON格式) 关系型数据库,存储结构化数据
数据模式 动态模式,同一集合文档不需要有相同字段和结构 需要预先定义字段
查询语言 面向文档查询语言,可以对JSON格式的数据进行查询 使用SQL语言查询数据库
索引 可以对任何属性建立索引 对表中的列建立索引
扩展性 方便扩展到大数据量和高并发 虽然也可以扩展,但需要更多的工作
延迟性 写入操作低 相对高
事务性 在4.2版本中引入分布式事务 事务的ACID特性,支持较好
windows MonogDB安装

官网下载地址:www.mongodb.com/try/downloa... 这里安装的是企业版,如果是单纯学习使用,建议安装社区版,直接点击下一步进行安装,

如果网速可以,还可以勾选mongodb的图形画工具安装,就不用单独下载连接工具;

点击finish按钮之后,完成安装。

windows MongoDB 相关操作

1、配置环境变量:系统属性-高级-环境变量-path系统变量中,把MongoDB的bin路径,配置到环境变量; 2、删除MongoDB服务 : sc delete MongoDB ; 3、安装MongoDB服务:mongod --dbpath=F:\mongodb\data\db --logpath=F:\mongodb\log\MongoDB.log --install --serviceName "MongoDB" ; 4、启动服务:net start MongoDB,关闭服务:net stop MongoDB; 5、mongod -version 查看mongodb版本;

6、mongodb 开启账号密码认证,只需要编辑文件D:\Program Files\MongoDB\bin\mongod.cfg,如下所示,编辑完成之后,记得重启MongoDB服务。

yaml 复制代码
#注意这里的语法,要遵循spring boot中的yaml语法
security:
  authorization: enabled
NoSQLBooster for MongoDB 破解

NoSQLBooster 基于 Electron 编写, 并且使用 asar 打包(Ref-1),所以我们能够解压 NoSQLBooster 安装目录下.asar格式的包文件,并修改代码重新打包替换掉原来的包文件 1、安装打包和解压工具,由于npm访问较慢,可以通过指定阿里镜像,提升安装速度;

ini 复制代码
npm install asar -g --registry=http://registry.npm.taobao.org

2、解压包文件 打开任务管理器,找到 NoSQLBooster 进程,选中任一个子进程,右键打开文件所在位置,找到安装根目录。进入resources目录, 解压app.asar文件;

执行命令:

asar extract app.asar app

3、修改 app\shared\lmCore.js, 延长试用期 找到上述文件,搜索关键字MAX_TRIAL_DAYS 修改控制试用天数的常量

ini 复制代码
const MAX_TRIAL_DAYS=150; //比如改成3600
const TRIAL_DAYS=30;      //同样改成3600

4、重新打包、删除app文件

perl 复制代码
asar pack app app.asar

5、禁用自动更新 找到resources\app-update.yml,任意修改url, 使得自动更新不能请求到该地址,修改

rust 复制代码
url: 'http://s3.mongobooster.com/download/releasesv7/404'

偶然发现了自动更新目录,也删除一下

bash 复制代码
C:\Users\XXXXX\AppData\Local\Programs\nosqlbooster4mongo\resources>cd ../../../

C:\Users\XXXXX\AppData\Local>cd nosqlbooster4mongo-updater

C:\Users\XXXXX\AppData\Local\nosqlbooster4mongo-updater>dir /b
installer.exe

C:\Users\XXXXX\AppData\Local\nosqlbooster4mongo-updater>cd ../

C:\Users\XXXXX\AppData\Local>rmdir /S /Q nosqlbooster4mongo-updater

###### MongoDB 资料链接

    1、csdn技术文档  https://blog.csdn.net/yuan2019035055/article/details/123031732
    2、MongoDB中文手册 https://docs.mongoing.com/aggregation/aggregation-pipeline
    3、Spring官网 API https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/query/package-summary.html

###### 与Spring项目集成
    1、pom文件中引入Maven依赖

<!--引入Spring mongodb依赖-->

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

2、application.yaml文件添加MongoDB数据库链接配置

yaml 复制代码
spring:
  #Spring 添加mongodb连接配置
  data:
    mongodb:
      database: test
      uri: mongodb://admin:123456@localhost:27017

3、代码示例demo:

  • 新建实体类,通过@Document(collection = "person")注解标记为mongodb的collection
arduino 复制代码
package com.zhc.model.entity;  
  
import lombok.AllArgsConstructor;  
import lombok.Data;  
import org.springframework.data.mongodb.core.mapping.Document;  
  
  
/**  
*  
* @author zhouhengchao  
* @since 2024-03-01 15:29:00  
*/  
@Document(collection = "person")  
@Data  
@AllArgsConstructor  
public class Person {  
/**  
* 主键id  
*/  
private Long id;  
  
/**  
* 用户名  
*/  
private String userName;  
  
/**  
* 密码  
*/  
private String passWord;  
  
/**  
* 性别  
*/  
private String gender;  
  
/**  
* 年龄  
*/  
private Integer age;  
  
/**  
* 所在城市  
*/  
private String cityName;  
  
}
  • 示例代码,通过junit单元测试介绍MongoDB的CRUD实现
ini 复制代码
package com.zhc.demo;  
  
import com.alibaba.fastjson.JSON;  
import com.google.common.collect.Lists;  
import com.zhc.model.entity.Person;  
import lombok.extern.slf4j.Slf4j;  
import org.junit.jupiter.api.Test;  
import org.springframework.boot.test.context.SpringBootTest;  
import org.springframework.data.domain.PageImpl;  
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 javax.annotation.Resource;  
import java.util.List;  
  
/**  
* 1、日常开发中,可能大家会使用到MongoDB数据库;  
* 2、工作中一般都是在  
*  
* @author zhouhengchao  
* @since 2024-03-01 10:35:00  
* @version 1.0  
*/  
@SpringBootTest  
@Slf4j  
public class MongoDBTest {  
  
@Resource  
private MongoTemplate mongoTemplate;  
  
/**  
* 初始化Collection数据  
*/  
@Test  
void initCollection(){  
log.info("初始化collection数据-开始");  
Person person1 = new Person(1L,"小王","123456","男",18,"重庆");  
Person person2 = new Person(2L,"小丽","23456","女",20,"吕梁");  
Person person3 = new Person(3L,"小军","34567","男",30,"大同");  
Person person4 = new Person(4L,"小红","45678","女",19,"晋中");  
Person person5 = new Person(5L,"小花","13421","女",28,"太原");  
List<Person> personList = Lists.newArrayList(person1,person2, person3, person4, person5);  
mongoTemplate.insertAll(personList);  
log.info("初始化collection数据-结束");  
}  
/**  
* 插入一条数据  
*/  
@Test  
void insertOneData(){  
// 插入一条数据,使用insert ,id如果不指定,会自动生成一个随机值  
Person person = new Person(6L,"小花花","134121","女",28,"孝义");  
mongoTemplate.insert(person);  
// 插入多条数据,使用insertAll,传入集合  
Person person1 = new Person(7L,"小花花1","134121","女",28,"重庆");  
Person person2 = new Person(8L,"小花花2","134121","女",28,"济南");  
Person person3 = new Person(9L,"小花花3","134121","女",28,"苏州");  
List<Person> personList = Lists.newArrayList(person1, person2, person3);  
mongoTemplate.insertAll(personList);  
}  
  
/**  
* 编辑id为6的数据  
*/  
@Test  
void updateData(){  
Person personByIdBefore = mongoTemplate.findById(6L, Person.class);  
log.info("修改前:personById:{}", JSON.toJSONString(personByIdBefore));  
  
Update update = new Update();  
update.set("userName","小花儿");  
Query query = new Query();  
query.addCriteria(Criteria.where("id").is(6L));  
mongoTemplate.updateFirst(query, update, Person.class);  
  
// 按照id查询  
Person personByIdAfter = mongoTemplate.findById(6L, Person.class);  
log.info("修改后:personById:{}", JSON.toJSONString(personByIdAfter));  
}  
  
/**  
* 删除指定id的数据  
*/  
@Test  
void delData(){  
Query query = new Query(Criteria.where("id").is(5L));  
// 数据库中所有满足条件的集合都会删除,如果只是删除某一条,可以在query中添加limit条件  
mongoTemplate.remove(query);  
// 指定需要删除数据的集合  
mongoTemplate.remove(query, Person.class);  
}  
  
  
/**  
* 几种查询操作介绍  
*/  
@Test  
void queryData(){  
// 1、直接按照id查询  
Person personById = mongoTemplate.findById(6L, Person.class);  
log.info("personById:{}", JSON.toJSONString(personById));  
  
// 2、按照多条件And查询,查询28岁的女孩  
Query query1 = new Query();  
query1.addCriteria(Criteria.where("age").is(28));  
query1.addCriteria(Criteria.where("gender").is("女"));  
List<Person> personList1 = mongoTemplate.find(query1, Person.class);  
log.info("查询28岁的女孩:{}", JSON.toJSONString(personList1));  
  
// 3、多条件or操作,查询28岁或者是女孩  
Query query2 = new Query();  
query2.addCriteria(Criteria.where("age").is(28).orOperator(Criteria.where("gender").is("女")));  
List<Person> personList2 = mongoTemplate.find(query2, Person.class);  
log.info("查询28岁或者女孩:{}", JSON.toJSONString(personList2));  
  
// 4、分页查询,性别为女孩的  
Query query3 = new Query(Criteria.where("gender").is("女"));  
PageRequest pageable = PageRequest.of(1, 10);  
query3.with(pageable);  
Sort sort = Sort.by(Sort.Direction.ASC, "id");  
query3.with(sort);  
long total = mongoTemplate.count(query3, Person.class);  
List<Person> personList3 = mongoTemplate.find(query3, Person.class);  
PageImpl<Person> pageResult = new PageImpl<>(personList3, pageable, total);  
log.info("分页查询女孩:{}", JSON.toJSONString(pageResult));  
}  
}
相关推荐
亦世凡华、几秒前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
河西石头1 分钟前
一步一步从asp.net core mvc中访问asp.net core WebApi
后端·asp.net·mvc·.net core访问api·httpclient的使用
2401_8574396913 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66614 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
李老头探索16 分钟前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
芒果披萨21 分钟前
Filter和Listener
java·filter
qq_49244844626 分钟前
Java实现App自动化(Appium Demo)
java
阿华的代码王国34 分钟前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
德育处主任Pro1 小时前
『Django』APIView基于类的用法
后端·python·django
找了一圈尾巴1 小时前
前后端交互通用排序策略
java·交互