SpringBoot整合MongoDB详解

SpringBoot——整合MongoDB详解

注意: MongoDB默认是本机访问 需要开启远程访问
window修改如下
在这里插入图片描述
linux 修改如下
/usr/local/mongodb4/mongodb.conf 详细内容

dbpath=/data/mongodb4/mongo #数据文件保存地址
logpath=/data/mongodb4/log/mongod.log  #日志保存地址
port=27017  #端口
fork=true #是否后台启动
auth=true #是否开启权限,访问需要用户名和密码
bind_ip=0.0.0.0  #任意ip都能访问
logappend=true

引入依赖

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

配置文件

spring:data:mongodb:host: 127.0.0.1database: testport: 27017# 也可以使用uri   mongodb://127.0.0.1:27017/test

创建实体类

@Data
public class Student {@Idprivate String studentId;private String studentName;private Integer studentAge;private Double studentScore;private Date studentBirthday;public Student(String studentId, String studentName, Integer studentAge, Double studentScore, Date studentBirthday) {this.studentId = studentId;this.studentName = studentName;this.studentAge = studentAge;this.studentScore = studentScore;this.studentBirthday = studentBirthday;}public Student() {}}

dao层

1、JPA方式

/*** JPA方式* 继承MongoRepository即可,不需要实现类*/
public interface StudentRepository extends MongoRepository<Student, String> {
}

StudentController

@RestController
public class StudentController {@Autowiredprivate StudentRepository studentRepository;/*** 插入单条数据*/@GetMapping("/insertOne")public void insertOne() {Student student = new Student("009", "tom", 18, 88.2d, new Date());studentRepository.insert(student);}/*** 插入多条数据*/@GetMapping("/insertMany")public void insertMany() {Student student1 = new Student("002", "jerry", 19, 38.2d, new Date());Student student2 = new Student("003", "mike", 20, 78.2d, new Date());List<Student> list = new ArrayList<>();list.add(student1);list.add(student2);studentRepository.insert(list);}/*** 修改数据*/@GetMapping("/update")public void update() {Optional<Student> op = studentRepository.findById("002");Student student = op.get();student.setStudentAge(222);studentRepository.save(student);}/*** 查询数据*/@GetMapping("/query")public void query() {//根据Id查询单个对象Optional<Student> stuOp = studentRepository.findById("002");System.out.println(stuOp.get());//根据字段查询单个对象Student student = new Student();student.setStudentAge(19);Optional<Student> stuOp1 = studentRepository.findOne(Example.of(student));System.out.println(stuOp1.get());//根据id列表查询多个对象Iterable<Student> itStu = studentRepository.findAllById(Arrays.asList(new String[]{"002", "003"}));Iterator<Student> itor = itStu.iterator();while (itor.hasNext()){System.out.println(itor.next());}//查询所有List<Student> all = studentRepository.findAll();//查询所有并排序List<Student> all1 = studentRepository.findAll(Sort.by(Sort.Order.desc("studentId"), Sort.Order.asc("studentName")));for (Student stu : all1){System.out.println(stu);}//根据条件查询所有并排序Student student1 = new Student();student1.setStudentName("tom");List<Student> all2 = studentRepository.findAll(Example.of(student1), Sort.by(Sort.Order.desc("studentId"), Sort.Order.asc("studentName")));for (Student stu : all2){System.out.println(stu);}//根据条件查询所有并排序,且分页Pageable pageable = PageRequest.of(0, 2);Page<Student> all3 = studentRepository.findAll(pageable);List<Student> content = all3.getContent();for (Student stu : content){System.out.println(stu);}}/*** 其他操作*/@GetMapping("/other")public void other() {//countlong count = studentRepository.count();System.out.println(count);Student student = new Student();student.setStudentAge(18);long count1 = studentRepository.count(Example.of(student));System.out.println(count1);//existsboolean exists = studentRepository.exists(Example.of(student));System.out.println(exists);boolean b = studentRepository.existsById("001");System.out.println(b);}/*** 删除操作*/@GetMapping("/remove")public void remove() {//根据id删除单个对象studentRepository.deleteById("002");//根据字段删除Student student = new Student();student.setStudentAge(20);studentRepository.delete(student);//删除所有studentRepository.deleteAll();//根据字段删除多个Student student1 = new Student();student1.setStudentName("jerry");List<Student> list = new ArrayList<>();list.add(student);list.add(student1);studentRepository.deleteAll(list);}
}

2、MongoTemplate方式

dao接口:

public interface StudentDao {//插入单个对象void addOne(Student student);//根据id删除单个对象void deleteOneById(String  studentId);//修改单个对象void updateOne(Student student);//根据id获取单个对象Student findOneById(String studentId);//获取全部学生List<Student> findAll();
}

实现类:

public class StudentDaoImpl implements StudentDao {@Autowiredprivate MongoTemplate mongoTemplate;@Overridepublic void addOne(Student student) {mongoTemplate.save(student);}@Overridepublic void deleteOneById(String studentId) {Student stu = mongoTemplate.findById(studentId, Student.class);if (stu != null)mongoTemplate.remove(stu);}@Overridepublic void updateOne(Student student) {mongoTemplate.save(student);}@Overridepublic Student findOneById(String studentId) {return mongoTemplate.findById(studentId, Student.class);}@Overridepublic List<Student> findAll() {return mongoTemplate.findAll(Student.class);}
}

测试类

@SpringBootTest
public class StudentDaoTest {@Autowiredprivate StudentDao studentDao;@Testvoid addOneStudent(){
//        插入10行for (Integer count = 0; count < 10; count++) {Student student = new Student();student.setStudentId("study_"+count);student.setStudentName("Echo"+count);student.setStudentAge(count);student.setStudentScore(98.5-count);student.setStudentBirthday(new Date());studentDao.addOne(student);}}@Testvoid deleteOneStudentByStudentId(){
//        删除id为study_0的学生studentDao.deleteOneById("study_0");}@Testvoid updateOneStudent(){
//        修改id为study_1的Student年龄为21Student student = studentDao.findOneById("study_1");student.setStudentAge(21);studentDao.updateOne(student);}@Testvoid getOneStudentByStudentId(){System.out.println(studentDao.findOneById("study_1"));}@Testvoid getAllStudent(){List<Student> studentList = studentDao.findAll();studentList.forEach(System.out::println);}
}

MongoTemplate

is查询:

Query query = new Query();
// where...is... 相当于 where ? = ?
query.addCriteria(Criteria.where("数据库字段名").is("你的参数"));
// findOne 返回的是一个对象 Class代表你的表对应的映射类
mongoTemplate.findOne(query, Class.class);
// find 返回的是数组
mongoTemplate.find(query, Class.class);

in查询:

ArrayList<String> list = new ArrayList<>();
// list代表你的数据
Query query = Query.query(Criteria.where("数据库字段").in(list));
mongoTemplate.find(query, Class.class);// 如果想要查询指定的数据是否在数据库的数组中,可以用以下方法
Query query = Query.query(Criteria.where("数据库字段(数组)").is("你的数组"));

字符模糊查询:

Query query = Query.query(Criteria.where("name").regex("小"));

指定字段不返回:

query.fields().exclude("field");

数组中添加或删除一条数据:

Query query = Query.query(Criteria.where("_id").is("id"));
Update update = new Update();
// push方法可以在数组中添加一条数据
// pull方法可以在数组中删除一条数据
// update.pull()
update.push("字段名称", "data");
mongoTemplate.updateFirst(query, update, Class.class);

批量添加:

ArrayList<Class> list = new ArrayList<>();
mongoTemplate.insert(list, Class.class);

数组查询:

数组格式:
{name:"小明",age:13,friends:[{name:"小王",age:12},{name:"小李",age:18}]
}当要查询朋友中姓名为小王时
Query query = new Query();
query.addCriteria(Criteria.where("friends.$.name").is("小王"));
mongoTemplate.find(query, User.class);同样更新时也是一样,但是注意,更新时查询条件需要添加
query.addCriteria(Criteria.where("friends").elemMatch(Criteria.where("name").is("小王"));
Update update = Update.update("friends.$.friends", "小赵");

数字字符串排序操作

对数据库中数字字符串排序:
加上这一行就行了 亲身体验
query.collation(Collation.of("zh").numericOrdering(true));
还有根据字符串排序时又是顺序并不是我们所想的字典序,加上下面这个也ok
query.collation(Collation.of("zh"));

分页

//分页
query.limit(10);
//排序
Sort sort=Sort.by(Sort.Direction.DESC,"timestamp");
query.with(sort);

criteria:

在这里插入图片描述

2、更新

User user = new User();
user.setId("5d1312aeb1829c279c6c256b");
user.setName("admin");
user.setAddress("测试");Query query = Query.query(Criteria.where("_id").is("5d1312aeb1829c279c6c256b"));
Update update = Update.update("name","zs");
//  更新一条数据
mongoTemplate.updateFirst(query,update, User.class);
mongoTemplate.updateFirst(query,update, "mongodb_user");
mongoTemplate.updateFirst(query,update, User.class,"mongodb_user");
//  更新多条数据
mongoTemplate.updateMulti(query,update, User.class);
mongoTemplate.updateMulti(query,update,"mongodb_user");
mongoTemplate.updateMulti(query,update, User.class,"mongodb_user");
//  更新数据,如果数据不存在就新增
mongoTemplate.upsert(query,update, User.class);
mongoTemplate.upsert(query,update,"mongodb_user");
mongoTemplate.upsert(query,update, User.class,"mongodb_user");

3、插入

List<User> list = new ArrayList<>();
User user= new User();//
user.setName("admin");
user.setAddress("测试");
list.add(user);//  保存对象到mongodb
mongoTemplate.save(user);
mongoTemplate.insert(user);
//  根据集合名称保存对象到mongodb
mongoTemplate.save(user,"mongodb_user");
mongoTemplate.insert(user,"mongodb_user");
//  根据集合名称保存list到mongodb
mongoTemplate.save(list,"mongodb_user");
mongoTemplate.insert(list,"mongodb_user");
mongoTemplate.insert(list,User.class);

删除

List<MongoDbJavaTest> list = new ArrayList<>();
User user= new User();
user.setId("5d1312aeb1829c279c6c256b");
list.add(user);Query query = Query.query(Criteria.where("_id").in("5d1312aeb1829c279c6c256b","5d13133ab1829c29d02ce29c"));
//  根据条件删除
mongoTemplate.remove(query);
mongoTemplate.remove(user);
mongoTemplate.remove(User.class);
//  根据条件删除(可删除多条)
mongoTemplate.remove(query,User.class,"mongodb_user");

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

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

相关文章

架构设计系列之基础:初探软件架构设计

11 月开始突发奇想&#xff0c;想把自己在公司内部做的技术培训、平时的技术总结等等的内容分享出来&#xff0c;于是就开通了一个 Wechat 订阅号&#xff08;灸哥漫谈&#xff09;&#xff0c;开始同步发送内容。 今天&#xff08;12 月 10 日&#xff09;也同步在 CSDN 上开通…

mysql字段设计规范:使用unsigned(无符号的)存储非负值

如果一个字段存储的是数值&#xff0c;并且是非负数&#xff0c;要设置为unsigned&#xff08;无符号的&#xff09;。 例如&#xff1a; 备注&#xff1a;对于类型是 FLOAT、 DOUBLE和 DECIMAL的&#xff0c;UNSIGNED属性已经废弃了&#xff0c;可能在mysql的未来某个版本去…

AI隆重软件,AI原创文章隆重软件

随着信息量的急剧增加&#xff0c;许多写作者、网站管理员和内容创作者们纷纷感受到了文章降重的压力。原始文本的降重&#xff0c;需要保留关键信息的同时避免重复&#xff0c;这是一项既繁琐又耗时的任务。 改写软件的批量降重功能 147SEO改写软件在降重领域的卓越表现主要体…

常见SSL证书都有哪些格式

常见Web服务软件 常见的Web服务软件&#xff0c;通常都基于OpenSSL和Java两种基础密码库。 Tomcat、Weblogic、JBoss等Web服务软件&#xff0c;一般使用Java提供的密码库。通过Java Development Kit&#xff08;JDK&#xff09;工具包中的Keytool工具&#xff0c;生成Java Ke…

android studio 按键点击事件的实现方法

一、onClick属性&#xff1a; 1&#xff09;、在activity_main.xml中设置button的onClick属性&#xff1a; <Buttonandroid:id"id/button"android:layout_width"wrap_content"android:layout_height"wrap_content"android:text"开灯&q…

SpringCloud系列(三)| 集成Nacos注册中心

好了万事具备&#xff0c;接下来我们就开始搭建我们SpringCloud项目。本章节我们先来搭建我们SpringCloud项目框架&#xff0c;然后开发两个服务&#xff0c;把他们注册到Nacos注册中心中。上一章节我们已经介绍了Nacos是可以作为注册中心和配置中心的&#xff0c;这一章节我们…

Linux centos8安装JDK1.8、tomcat

一、安装jdk 1.如果之前安装过jdk&#xff0c;先卸载掉旧的 rpm -qa | grep -i jdk 2.检查yum中有没有java1.8的包 yum list java-1.8* 3.yum安装jdk yum install java-1.8.0-openjdk* -y 4.验证 二、安装tomcat Index of /tomcat 可以在这里选择你想要安装的tomcat版本…

【unity实战】一个通用的FPS枪支不同武器射击控制脚本

文章目录 前言模型素材文章用到的粒子火光特效射击效果换弹瞄准开枪抖动效果设置显示文本最终代码不同武器射击效果1. 手枪2. 机枪3. 狙击枪4. 霰弹枪5. 加特林 其他感谢完结 前言 实现FPS枪支不同武器效果&#xff0c;比如手枪&#xff0c;喷子&#xff0c;狙击枪&#xff0c…

ISCTF2023 Reverse方向 WP

文章目录 ReversecrackmeEasyRebabyReeasy_z3FloweyRSAeasy_flower_teamfx_rez3_revengeWHERE Reverse crackme 、 加了UPX壳&#xff0c;可以看到EP Section处UPX标识被修改了 用WinHex修改 之后UPX脱壳 得到flag。 EasyRe 逆向一下&#xff0c;先逆序&#xff0c;再做一些…

机器人行业数据闭环实践:从对象存储到 JuiceFS

JuiceFS 社区聚集了来自各行各业的前沿科技用户。本次分享的案例来源于刻行&#xff0c;一家商用服务机器人领域科技企业。 商用服务机器人指的是我们日常生活中常见的清洁机器人、送餐机器人、仓库机器人等。刻行采用 JuiceFS 来弥补对象存储性能不足等问题。 值得一提的是&am…

godot 报错Unable to initialize Vulkan video driver解决

版本 godot 4.2.1 现象 godot4.2.1 默认使用vulkan驱动&#xff0c;如果再不支持vulkan驱动的主机上&#xff0c;进入引擎编辑器将报错如下 解决 启动参数添加 –rendering-driver opengl3 即可进入引擎编辑器 此时运行项目仍然会报错无法初始化驱动 在项目设置中配置编…

编译Sqlite3记录

下载源文件&#xff1a; 下载地址&#xff1a;SQLite Download Page 打开QtCreator创建新的工程&#xff0c;选择纯C工程&#xff0c;将main.c删除&#xff0c;将下载的源码解压后的文件复制到并添加到工程中&#xff0c;其中的文件包括&#xff1a;sqlite3ext.h、sqlite3.h、…

Android多进程和跨进程通讯方式

前言 我们经常开发过程中经常会听到线程和进程&#xff0c;在讲述Android进程多进程前我打算先简单梳理一下这俩者。 了解什么是进程与线程 进程&#xff1a; 系统中正在运行的一个应用程序&#xff0c;某个程序一旦运行就是一个进程&#xff0c;是资源分配的最小单位&#…

自动化测试 (二) Web自动化测试原理

目前市面上有很多Web UI自动化测试框架&#xff0c;比如WatiN, Selinimu,WebDriver&#xff0c;还有VS2010中的Coded UI等等. 这些框架都可以操作Web中的控件&#xff0c;模拟用户输入&#xff0c;点击等操作&#xff0c;实现Web自动化测试。其实这些工具的原理都一样&#xf…

element-ui样式(一)

1.去掉表格横线 HTML表格标签&#xff1a; table&#xff1a;定义表格&#xff0c;生成的表格在一对<table></table>中&#xff1b; <th>&#xff1a;定义表格的表头&#xff0c;一般是表头中的内容会被加黑&#xff08;table head&#xff09;&#xff1b;…

MySQL 系列:注意 ORDER 和 LIMIT 联合使用的陷阱

文章目录 前言背后的原因ORDER BY 排序列存在相同值时返回顺序是不固定的LIMIT 和 ORDER BY 联合使用时的行为ORDER BY 或 GROUP BY 和 LIMIT 联合使用优化器默认使用有序索引 如何解决其它说明个人简介 前言 不知道大家在在分页查询中有没有遇到过这个问题&#xff0c;分页查…

通俗易懂:插入排序算法全解析(C++)

插入排序算法是一种简单直观的排序算法&#xff0c;它的原理就像我们玩扑克牌时整理手中的牌一样。下面我将用通俗易懂的方式来解释插入排序算法的工作原理。 假设我们手上有一副无序的扑克牌&#xff0c;我们的目标是将它们从小到大排列起来。插入排序算法的思想是&#xff0…

0基础学习VR全景平台篇第127篇:什么是VR全景/720全景漫游?

“全景”作为一种表现宽阔视野的手法&#xff0c;在很久之前就得到了普遍的认同。北宋年间&#xff0c;由张择端绘制的《清明上河图》就是一幅著名的全景画。摄影术出现后&#xff0c;全景摄影也随之而生。 到今天&#xff0c;全景拍摄不再被专业摄影师所独享&#xff0c;广大…

leetcode--3. 无重复字符的最长子串[滑动窗口\哈希表 c++]

原题 &#xff1a; 3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 最长子串可以用滑动窗口解决&#xff0c;无重复字符可以使用哈希表解决。 算法原理&#xff1a; 滑动窗口哈希表 哈希表作为一个数组存放每个字符出现的次数。 …

06进程间关系-学习笔记

Orphan Process孤儿进程 父进程先于子进程退出&#xff0c;子进程失去托管&#xff0c;这种子进程统称为孤儿进程 失效进程&#xff08;孤儿进程&#xff09;&#xff1a;导致内存泄漏&#xff0c;影响新进程的创建孤儿进程的危害不可预测&#xff0c;如果一个孤儿进程持续的申…