Java:SpringBoot项目中MongoTemplate的新增、删除、更新、查询操作

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: Java:SpringBoot项目中MongoTemplate的新增、删除、更新、查询操作

目录

项目结构

$ tree -I target
.
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── demo
    │   │               ├── Application.java
    │   │               ├── config
    │   │               │   └── MongoConfiguration.java
    │   │               └── entity
    │   │                   └── UserData.java
    │   └── resources
    │       └── application.yml
    └── test
        └── java
            └── com
                └── example
                    └── demo
                        └── MongoTemplateTest.java

引入mongodb依赖

依赖

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

完整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.7.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mongodb-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</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>
    </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>

配置mongodb连接参数

application.yml

spring:
  data:
    mongodb:
       uri: 'mongodb://127.0.0.1:27017/data'

插入数据-默认

定义实体类

package com.example.demo.entity;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
@Data
@Document(collection = "user")
public class UserData {
    private String name;
    private Integer age;
    private Date birthday;
}

插入数据

package com.example.demo;
import com.example.demo.entity.UserData;
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;
import java.util.Date;
@SpringBootTest
public class MongoTest {
    @Autowired
    private MongoTemplate mongoTemplate;
    @Test
    public void testInsert(){
        UserData userData = new UserData();
        userData.setAge(20);
        userData.setName("Tom");
        userData.setBirthday(new Date(2000, 10, 01));
        mongoTemplate.insert(userData);
    }
}

查询数据

db.getCollection('user').find({})
{
    "_id" : ObjectId("63c4ff1625a0156daca425dc"),
    "name" : "Tom",
    "age" : 20,
    "birthday" : Date(60931152000000),
    "_class" : "com.example.demo.entity.UserData"
}

插入数据-自定义

默认插入方式,发现存在几个问题:

  1. 多了一个_class字段,通过自定义配置类解决
  2. 时间字段也不是我想要的,直接存字符串
  3. _id 是ObjectId对象,直接自定义存一个uuid字符串

定义配置类

package com.example.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoDatabaseFactorySupport;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import javax.annotation.Resource;
@Configuration
public class MongoConfiguration {
    @Resource
    private MongoDatabaseFactorySupport mongoDatabaseFactorySupport;
    @Resource
    private MappingMongoConverter mappingMongoConverter;
    @Bean
    public MongoTemplate mongoTemplate() {
        mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
        MongoTemplate mongoTemplate = new MongoTemplate(mongoDatabaseFactorySupport, mappingMongoConverter);
        return mongoTemplate;
    }
}

修改实体类

package com.example.demo.entity;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
@Data
@Document(collection = "user")
public class UserData {
    @Field("_id")
    private String docId;
    private String name;
    private Integer age;
    // private Date birthday;
    private String birthday;
}

插入数据

package com.example.demo;
import com.example.demo.entity.UserData;
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;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@SpringBootTest
public class MongoTest {
    @Autowired
    private MongoTemplate mongoTemplate;
    @Test
    public void testInsert() {
        UserData userData = new UserData();
        userData.setDocId(UUID.randomUUID().toString());
        userData.setAge(20);
        userData.setName("Tom");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date birthday = new Date(2000 - 1900, 10 - 1, 1);
        userData.setBirthday(simpleDateFormat.format(birthday));
        mongoTemplate.insert(userData);
    }
}

查看插入的数据

{
    "_id" : "08f23d0b-76ff-4d62-ac52-4fc68ceeac20",
    "name" : "Tom",
    "age" : 20,
    "birthday" : "2000-10-01 00:00:00"
}

根据ID获取数据

{
    "_id" : "08f23d0b-76ff-4d62-ac52-4fc68ceeac20",
    "name" : "Tom",
    "age" : 20,
    "birthday" : "2000-10-01 00:00:00"
}
// select * from user where id = ? limit 1
String docId = "08f23d0b-76ff-4d62-ac52-4fc68ceeac20";
UserData userData = mongoTemplate.findById(docId, UserData.class);
System.out.println(userData);
// UserData(docId=08f23d0b-76ff-4d62-ac52-4fc68ceeac20, name=Tom, age=20, birthday=2000-10-01 00:00:00)

按照ID移除

// delete from user where id = ?
String docId = "08f23d0b-76ff-4d62-ac52-4fc68ceeac20";
Query query = new Query(Criteria.where("_id").is(docId));
DeleteResult deleteResult = mongoTemplate.remove(query, UserData.class);
System.out.println(deleteResult.getDeletedCount());
// 1

查询-条件-排序-分页

// select * from user
// where age > 18
// order by age desc
// limit 1 offset 0
Query query = new Query(Criteria.where("age").gt(18));
query.with(Sort.by(Sort.Direction.DESC, "age"));
query.skip(0).limit(3);
// 查询数量
long count = mongoTemplate.count(query, UserData.class);
System.out.println(count);
// 2
// 查询列表
List<UserData> userDataList = mongoTemplate.find(query, UserData.class);
for (UserData userData : userDataList) {
    System.out.println(userData);
}
// UserData(docId=08f23d0b-76ff-4d62-ac52-4fc68ceeac21, name=Jack, age=21, birthday=2000-10-02 00:00:00)
// UserData(docId=08f23d0b-76ff-4d62-ac52-4fc68ceeac20, name=Tom, age=20, birthday=2000-10-01 00:00:00)

更新部分字段

String docId = "08f23d0b-76ff-4d62-ac52-4fc68ceeac21";
Query query = new Query(Criteria.where("_id").is(docId));
Update update = new Update();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
update.set("birthday", simpleDateFormat.format(new Date()));
UpdateResult updateResult = mongoTemplate.updateFirst(query, update, UserData.class);
System.out.println(updateResult.getModifiedCount());
// 1
// 更新前
{
    "_id" : "08f23d0b-76ff-4d62-ac52-4fc68ceeac21",
    "name" : "Jack",
    "age" : 21,
    "birthday" : "2000-10-02 00:00:00"
}
// 更新后
{
    "_id" : "08f23d0b-76ff-4d62-ac52-4fc68ceeac21",
    "name" : "Jack",
    "age" : 21,
    "birthday" : "2023-01-16 17:07:23"
}

全文档更新

String docId = "08f23d0b-76ff-4d62-ac52-4fc68ceeac21";
Query query = new Query(Criteria.where("_id").is(docId));
UserData userData = new UserData();
userData.setDocId(docId);
userData.setName("jack");
Document document = (Document)mongoTemplate.getConverter().convertToMongoType(userData);
Update update = Update.fromDocument(document);
UpdateResult updateResult = mongoTemplate.updateFirst(query, update, UserData.class);
System.out.println(updateResult.getModifiedCount());
// 1
// 更新前
{
    "_id" : "08f23d0b-76ff-4d62-ac52-4fc68ceeac21",
    "name" : "Jack",
    "age" : 21,
    "birthday" : "2023-01-16 17:07:23"
}
// 更新后
{
    "_id" : "08f23d0b-76ff-4d62-ac52-4fc68ceeac21",
    "name" : "jack"
}

完整代码

package com.example.demo;
import com.example.demo.entity.UserData;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.bson.Document;
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.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.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@SpringBootTest
public class MongoTest {
    @Autowired
    private MongoTemplate mongoTemplate;
    /**
     * 插入数据
     */
    @Test
    public void testInsert() {
        UserData userData = new UserData();
        userData.setDocId(UUID.randomUUID().toString());
        userData.setAge(20);
        userData.setName("Tom");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date birthday = new Date(2000 - 1900, 10 - 1, 1);
        userData.setBirthday(simpleDateFormat.format(birthday));
        mongoTemplate.insert(userData);
    }
    /**
     * 按id查询
     */
    @Test
    public void testFindById() {
        // select * from user where id = ? limit 1
        String docId = "08f23d0b-76ff-4d62-ac52-4fc68ceeac20";
        UserData userData = mongoTemplate.findById(docId, UserData.class);
        System.out.println(userData);
        // UserData(docId=08f23d0b-76ff-4d62-ac52-4fc68ceeac20, name=Tom, age=20, birthday=2000-10-01 00:00:00)
    }
    /**
     * 按照id移除
     */
    @Test
    public void testRemove() {
        // delete from user where id = ?
        String docId = "08f23d0b-76ff-4d62-ac52-4fc68ceeac20";
        Query query = new Query(Criteria.where("_id").is(docId));
        DeleteResult deleteResult = mongoTemplate.remove(query, UserData.class);
        System.out.println(deleteResult.getDeletedCount());
        // 1
    }
    /**
     * 查询-条件-排序-分页
     */
    @Test
    public void testFind() {
        // select * from user
        // where age > 18
        // order by age desc
        // limit 1 offset 0
        Query query = new Query(Criteria.where("age").gt(18));
        query.with(Sort.by(Sort.Direction.DESC, "age"));
        query.skip(0).limit(3);
        // 查询数量
        long count = mongoTemplate.count(query, UserData.class);
        System.out.println(count);
        // 2
        // 查询列表
        List<UserData> userDataList = mongoTemplate.find(query, UserData.class);
        for (UserData userData : userDataList) {
            System.out.println(userData);
        }
        // UserData(docId=08f23d0b-76ff-4d62-ac52-4fc68ceeac21, name=Jack, age=21, birthday=2000-10-02 00:00:00)
        // UserData(docId=08f23d0b-76ff-4d62-ac52-4fc68ceeac20, name=Tom, age=20, birthday=2000-10-01 00:00:00)
    }
    /**
     * 更新部分字段
     */
    @Test
    public void testUpdate() {
        String docId = "08f23d0b-76ff-4d62-ac52-4fc68ceeac21";
        Query query = new Query(Criteria.where("_id").is(docId));
        Update update = new Update();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        update.set("birthday", simpleDateFormat.format(new Date()));
        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, UserData.class);
        System.out.println(updateResult.getModifiedCount());
        // 1
    }
    /**
     * 全文档更新
     */
    @Test
    public void testUpdateDocument() {
        String docId = "08f23d0b-76ff-4d62-ac52-4fc68ceeac21";
        Query query = new Query(Criteria.where("_id").is(docId));
        UserData userData = new UserData();
        userData.setDocId(docId);
        userData.setName("jack");
        Document document = (Document)mongoTemplate.getConverter().convertToMongoType(userData);
        Update update = Update.fromDocument(document);
        UpdateResult updateResult = mongoTemplate.updateFirst(query, update, UserData.class);
        System.out.println(updateResult.getModifiedCount());
        // 1
    }
}

参考

SpringBoot V2.7.5整合MongoDB V6.0.0图文详解

SpringBoot 整合 MongoDB 实现数据的增删改查!


相关文章
|
25天前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
218 1
|
2月前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
594 1
|
2月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
353 63
|
23天前
|
IDE 安全 Java
Lombok 在企业级 Java 项目中的隐性成本:便利背后的取舍之道
Lombok虽能简化Java代码,但其“魔法”特性易破坏封装、影响可维护性,隐藏调试难题,且与JPA等框架存在兼容风险。企业级项目应优先考虑IDE生成、Java Records或MapStruct等更透明、稳健的替代方案,平衡开发效率与系统长期稳定性。
115 1
|
25天前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
3月前
|
Java 测试技术 Spring
简单学Spring Boot | 博客项目的测试
本内容介绍了基于Spring Boot的博客项目测试实践,重点在于通过测试驱动开发(TDD)优化服务层代码,提升代码质量和功能可靠性。案例详细展示了如何为PostService类编写测试用例、运行测试并根据反馈优化功能代码,包括两次优化过程。通过TDD流程,确保每项功能经过严格验证,增强代码可维护性与系统稳定性。
164 0
|
3月前
|
存储 Java 数据库连接
简单学Spring Boot | 博客项目的三层架构重构
本案例通过采用三层架构(数据访问层、业务逻辑层、表现层)重构项目,解决了集中式开发导致的代码臃肿问题。各层职责清晰,结合依赖注入实现解耦,提升了系统的可维护性、可测试性和可扩展性,为后续接入真实数据库奠定基础。
290 0
|
3月前
|
安全 JavaScript Java
java Web 项目完整案例实操指南包含从搭建到部署的详细步骤及热门长尾关键词解析的实操指南
本项目为一个完整的JavaWeb应用案例,采用Spring Boot 3、Vue 3、MySQL、Redis等最新技术栈,涵盖前后端分离架构设计、RESTful API开发、JWT安全认证、Docker容器化部署等内容,适合掌握企业级Web项目全流程开发与部署。
167 0
|
前端开发 JavaScript 关系型数据库
前后端分离 -- SpringBoot + Vue实战项目 部署至阿里云服务器
前后端分离 -- SpringBoot + Vue实战项目 部署至阿里云服务器
3839 2
前后端分离 -- SpringBoot + Vue实战项目 部署至阿里云服务器
|
Java Maven
springboot项目打jar包后,如何部署到服务器
springboot项目打jar包后,如何部署到服务器
895 1

热门文章

最新文章