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 实现数据的增删改查!


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
12天前
|
Java 应用服务中间件
SpringBoot获取项目文件的绝对路径和相对路径
SpringBoot获取项目文件的绝对路径和相对路径
48 1
SpringBoot获取项目文件的绝对路径和相对路径
|
1天前
|
Java Android开发
Eclipse 创建 Java 项目
Eclipse 创建 Java 项目
11 4
|
3天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
11 2
|
7天前
|
分布式计算 关系型数据库 MySQL
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型
SpringBoot项目中mysql字段映射使用JSONObject和JSONArray类型 图像处理 光通信 分布式计算 算法语言 信息技术 计算机应用
27 8
|
8天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
37 9
|
6天前
|
SQL Java 数据库连接
从理论到实践:Hibernate与JPA在Java项目中的实际应用
本文介绍了Java持久层框架Hibernate和JPA的基本概念及其在具体项目中的应用。通过一个在线书店系统的实例,展示了如何使用@Entity注解定义实体类、通过Spring Data JPA定义仓库接口、在服务层调用方法进行数据库操作,以及使用JPQL编写自定义查询和管理事务。这些技术不仅简化了数据库操作,还显著提升了开发效率。
17 3
|
9天前
|
前端开发 Java 数据库
如何实现一个项目,小白做项目-java
本教程涵盖了从数据库到AJAX的多个知识点,并详细介绍了项目实现过程,包括静态页面分析、数据库创建、项目结构搭建、JSP转换及各层代码编写。最后,通过通用分页和优化Servlet来提升代码质量。
23 1
|
13天前
|
监控 前端开发 Java
Java SpringBoot –性能分析与调优
Java SpringBoot –性能分析与调优
|
14天前
|
JavaScript 前端开发 Java
SpringBoot项目的html页面使用axios进行get post请求
SpringBoot项目的html页面使用axios进行get post请求
37 2
|
14天前
|
前端开发 Java Spring
SpringBoot项目thymeleaf页面支持词条国际化切换
SpringBoot项目thymeleaf页面支持词条国际化切换
42 2