spring boot 集成mongodb

news2024/11/26 8:24:24

引入依赖

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

配置db: 

spring:
  data:
    mongodb:
      host: 127.0.0.1
      database: dev-picker-db
      authentication-database: dev-picker-db
      port: 27017

在实体类上添加 @Document 并指定集合名称  @Document(collection = "customer")


import com.person.common.utils.UUIDUitl;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.Date;

@AllArgsConstructor
@Data
@Document(collection = "customer")
public class Customer {
    @Id
    private String id;
    @Indexed /**索引列**/
    private String realName;
    private String mobile;
    private Address address;
    private Date createdTime;
    private Boolean member;

    public Customer() {
        id = UUIDUitl.generateLowerString(32);
        realName = "Han";
        mobile = "13770655999";
        address = new Address();
        createdTime = new Date();
    }
    
    public static class Address {
        private String aliasName;
        private String province;
        private String city;
        private String detail;

        public Address() {
            aliasName = "Home";
            province = "JiangSu";
            city = "NanJing";
            detail = "1865";
        }
    }
    public static Customer form(String realName, String mobile, Address address) {
        Customer customer = new Customer();
        customer.realName = realName;
        customer.mobile = mobile;
        customer.address = address;
        return customer;
    }

    public static Customer form(String realName, String mobile, Address address, Boolean isMember) {
        Customer customer = new Customer();
        customer.realName = realName;
        customer.mobile = mobile;
        customer.address = address;
        customer.member = isMember;
        return customer;
    }
    

}

编写测试类 


import com.bmyg.api.mongo.Customer;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RequestMapping("/uncontrol/mongo")
@RestController
public class MongoDBController {

    @Resource
    private MongoTemplate mongoTemplate;


    @GetMapping("/test")
    public String getMongoDBName() {
        Customer customer = new Customer();
        mongoTemplate.insert(customer);
        return mongoTemplate.getDb().getName();
    }

}

结果:

其他查询:

package com.test.api;

import com.alibaba.fastjson.JSON;
import com.test.api.mongo.Customer;
import com.test.api.mongo.CustomerRepository;
import com.test.api.mongo.CustomerVo;
import com.test.api.mongo.PageResult;
import com.mongodb.client.ListIndexesIterable;
import org.bson.Document;
import org.springframework.beans.BeanUtils;
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 org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

@RequestMapping("/uncontrol/mongo")
@RestController
public class MongoDBController {

    @Resource
    private MongoTemplate mongoTemplate;

    @Resource
    private CustomerRepository customerRepository;



    //给customer集合的某个字段创建索引
    @GetMapping("/crtIdx")
    public String createIndex(@RequestParam String key) {
        Index index = new Index(key, Sort.Direction.ASC);
        mongoTemplate.indexOps("customer").ensureIndex(index);
        return "ok";
    }


    //获取所有集合
    @GetMapping("/coll")
    public Set<String> index() {
        return mongoTemplate.getCollectionNames();
    }

    //插入
    @GetMapping("/insert")
    public String insert() {
        Customer customer = new Customer();
        mongoTemplate.insert(customer);
        return mongoTemplate.getDb().getName();
    }

    //查询
    @PostMapping("/query")
    public String query(@RequestBody Customer cus) {

        //查询所有
        List<Customer> result = mongoTemplate.findAll(Customer.class);
        System.out.println("查询所有" + JSON.toJSONString(result));

        //通过ID 查询
        Customer byId = mongoTemplate.findById(cus.getId(), Customer.class);
        System.out.println("通过ID 查询" + JSON.toJSONString(byId));
        Query query = new Query(Criteria.where("realName").is(cus.getRealName()));


        //条件-精确查询,返回第一条数据,没有条件 依旧会查询数据,但是返回第一条
        Customer findOne = mongoTemplate.findOne(query, Customer.class);
        System.out.println("条件-精确查询,返回第一条数据" + JSON.toJSONString(findOne));


        //条件-精确查询,返回所有数据---没有条件 依旧会查询数据,返回所有
        List<Customer> findList = mongoTemplate.find(query, Customer.class);
        System.out.println("条件-精确查询,返回所有数据" + JSON.toJSONString(findList));

        return JSON.toJSONString(result);
    }

    //删除
    @PostMapping("/del")
    public String del(@RequestBody Customer cus) {
        Query query = new Query(Criteria.where("realName").is(cus.getRealName()));
        mongoTemplate.remove(query, Customer.class);
        return mongoTemplate.getDb().getName();
    }

    //查询所有索引
    @PostMapping("/all-idx")
    public String getIndexAll() {
        // 获取集合中所有列表---import org.bson.Document;
        ListIndexesIterable<Document> indexList =
                mongoTemplate.getCollection("customer").listIndexes();
        StringBuilder sb = new StringBuilder();
        // 获取集合中全部索引信息
        for (Document document : indexList) {
            sb.append(document + "/r/n");
        }
        return sb.toString();
    }


    //模糊查询
    @PostMapping("/like-query")
    public String likequery(@RequestBody Customer cus) {
        //模糊查询
        Query queryLike = new Query(Criteria.where("realName").regex(".*" + cus.getRealName() + ".*"));
        List<Customer> queryLikeResult = mongoTemplate.find(queryLike, Customer.class);
        System.out.println(queryLikeResult);
        return JSON.toJSONString(queryLikeResult);
    }


    //多条件查询 and
    @PostMapping("/query-and")
    public String manyMatchAnd(@RequestBody Customer cus) {
        //多条件查询
        Criteria criteriaUserName = Criteria.where("realName").is(cus.getRealName());
        Criteria criteriaPassWord = Criteria.where("mobile").is(cus.getMobile());
        // 创建条件对象,将上面条件进行 AND 关联
        Criteria criteria = new Criteria().andOperator(criteriaUserName, criteriaPassWord);
        Query queryLike = new Query(criteria);
        List<Customer> queryLikeResult = mongoTemplate.find(queryLike, Customer.class);
        return JSON.toJSONString(queryLikeResult);
    }

    //多条件查询 or
    @PostMapping("/query-or")
    public String manyMatchOr(@RequestBody Customer cus) {
        Criteria criteriaUserName = Criteria.where("realName").is(cus.getRealName());
        Criteria criteriaPassWord = Criteria.where("mobile").is(cus.getMobile());
        // 创建条件对象,将上面条件进行 OR 关联
        Criteria criteria = new Criteria().orOperator(criteriaUserName, criteriaPassWord);
        Query queryor = new Query(criteria);
        List<Customer> queryLikeResult = mongoTemplate.find(queryor, Customer.class);
        return JSON.toJSONString(queryLikeResult);
    }

    //多条件查询 in
    @PostMapping("/query-in")
    public String findByInCondition() {
        // 设置查询条件参数
        List<String> names = Arrays.asList("Ma", "liu", "li");
        // 创建条件-- 创建条件,in 后面是list 集合
        Criteria criteria = Criteria.where("realName").in(names);
        // 创建查询对象,然后将条件对象添加到其中
        Query queryIn = new Query(criteria);
        List<Customer> result = mongoTemplate.find(queryIn, Customer.class);
        return JSON.toJSONString(result);
    }

    
    //根据【逻辑运算符】查询集合中的文档数据
    @PostMapping("/query-gt")
    public String findByGt() {
        int min = 20;
        int max = 35;
        Criteria criteria = Criteria.where("age").gt(min).lte(max);
        // 创建查询对象,然后将条件对象添加到其中
        Query queryGt = new Query(criteria);
        List<Customer> result = mongoTemplate.find(queryGt, Customer.class);
        return JSON.toJSONString(result);
    }




    //根据【正则表达式】查询集合中的文档数据
    @PostMapping("/query-regex")
    public String findByRegex() {
        String regex = "^张*";
        Criteria criteria = Criteria.where("realName").regex(regex);
        // 创建查询对象,然后将条件对象添加到其中
        Query queryRegex = new Query(criteria);
        List<Customer> result = mongoTemplate.find(queryRegex, Customer.class);
        return JSON.toJSONString(result);
    }

    //更新
    @PostMapping("/update")
    public String update(@RequestBody Customer cus) {
        Query query = new Query(Criteria.where("mobile").is(cus.getMobile()));
        Update update = new Update().set("realName", cus.getRealName());
        mongoTemplate.updateMulti(query, update, Customer.class);
        return mongoTemplate.getDb().getName();
    }
    
    // 分页查询---逻辑没问题 序列化有问题!!!!!!!!!!!!!!!!!
    @PostMapping("/query-page")
    public PageResult<Customer> queryPage(@RequestBody CustomerVo customerVo) {
        Customer cus = new Customer();
        BeanUtils.copyProperties(customerVo, cus);
        Query queryLike = new Query(Criteria.where("realName").regex(".*" + cus.getRealName() + ".*"));
        long total = mongoTemplate.count(queryLike, Customer.class);
        Integer skip = (customerVo.getPageNo() - 1) * customerVo.getPageSize();
        queryLike.skip(skip).limit(customerVo.getPageSize());
        queryLike.with(Sort.by(Sort.Order.desc("createdTime")));
        List<Customer> findList = mongoTemplate.find(queryLike, Customer.class);
        return PageResult.pageResult(customerVo.getPageNo(), customerVo.getPageSize(), (int) total, findList);
    }


}

其他:


import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.person.common.utils.UUIDUitl;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.Date;

@AllArgsConstructor
@Data
@Document(collection = "customer")
public class Customer {
    @Id
    private String id;
    @Indexed
    private String realName;
    private String mobile;
    @JsonIgnoreProperties(ignoreUnknown = true)
    private Address address;
    private Date createdTime;
    private Boolean member;
    private int age;

    public Customer() {
        id = UUIDUitl.generateLowerString(32);
        realName = "Han";
        mobile = "13770655999";
        address = new Address();
        createdTime = new Date();
        age = 18;
    }

    public static class Address {
        private String aliasName;
        private String province;
        private String city;
        private String detail;

        public Address() {
            aliasName = "Home";
            province = "JiangSu";
            city = "NanJing";
            detail = "1865";
        }
    }

    public static Customer form(String realName, String mobile, Address address) {
        Customer customer = new Customer();
        customer.realName = realName;
        customer.mobile = mobile;
        customer.address = address;
        return customer;
    }

    public static Customer form(String realName, String mobile, Address address, Boolean isMember) {
        Customer customer = new Customer();
        customer.realName = realName;
        customer.mobile = mobile;
        customer.address = address;
        customer.member = isMember;
        return customer;
    }


}

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.Date;

/**
 *
 * @version JDK 11
 * @className CustomerVo
 * @description TODO
 */

@AllArgsConstructor
@Data
public class CustomerVo {

    private String id;
    private String realName;
    private String mobile;

    private Date createdTime;
    private Boolean member;
    private int age;
    private Integer pageNo;
    private Integer pageSize;


}

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotNull;
import java.io.Serializable;


@Data
@ApiModel
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
public class PageQuery implements Serializable {

    @ApiModelProperty(value = "页码,默认1", example = "1")
    @NotNull(message = "页码不能为空")
    @Range(min = 1, message = "页码不正确")
    protected Integer pageNo = 1;

    @ApiModelProperty(value = "每页条数, 默认10", example = "10")
    @NotNull(message = "每页条数不能为空")
    protected Integer pageSize = 10;

    /**
     * 偏移
     */
    @ApiModelProperty(hidden = true)
    protected Integer offset;

    public Integer getOffset() {
        return (getPageNo() - 1) * getPageSize();
    }

    public Integer getPageNo() {
        return pageNo == null ? 1 : pageNo;
    }

    public Integer getPageSize() {
        return pageSize == null ? 10 : pageSize;
    }
}

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

@Data
@ApiModel(description = "分页数据返回模型")
public class PageResult<T> implements Serializable {
    @ApiModelProperty(value = "当前页 - 和PageQuery保持统一")
    private Integer pageNo;

    @Deprecated
    @ApiModelProperty(value = "当前页", hidden = true)
    private Integer page;

    @ApiModelProperty(value = "每页条数")
    private Integer pageSize;

    @ApiModelProperty(value = "总记录数")
    private Integer total;

    @ApiModelProperty(value = "查询数据")
    private List<T> list;

    public Integer getPageNo() {
        return pageNo;
    }

    public void setPageNo(Integer pageNo) {
        this.pageNo = pageNo;
        this.page = pageNo;
    }

    @Deprecated
    public Integer getPage() {
        return page;
    }

    @Deprecated
    public void setPage(Integer page) {
        this.page = page;
        this.pageNo = page;
    }

    public static <T> PageResult<T> pageResult(Integer page, Integer pageSize, Integer total, List<T> list) {
        PageResult<T> pageResult = new PageResult<T>();
        pageResult.setPage(page);
        pageResult.setPageNo(page);
        pageResult.setPageSize(pageSize);
        pageResult.setList(list);
        pageResult.setTotal(total);
        return pageResult;
    }

    public static <T> PageResult<T> pageResult(PageQuery query, Integer total, List<T> list) {

        return pageResult(query.getPageNo(), query.getPageSize(), total, list);
    }

    public static <T> PageResult<T> pageResult(PageQuery query, long total, List<T> list) {

        return pageResult(query.getPageNo(), query.getPageSize(), (int) total, list);
    }

    //    public static <T> PageResult<T> pageResultLimit( PageQuery query, long total, List<T> list ) {
//        if (total>10000L){
//            total=10000L;
//        }
//        return pageResult(query.getPageNo(), query.getPageSize(), (int) total, list);
//    }
    public static <T> PageResult<T> empty(PageQuery query) {
        return pageResult(query, 0, Collections.emptyList());
    }

    /**
     * 获取总页数
     *
     * @return 总页数
     */
    @JsonIgnore
    @ApiModelProperty(hidden = true)
    public Integer getPages() {
        if (getPageSize() == 0) {
            return 0;
        }
        int pages = getTotal() / getPageSize();
        if (getTotal() % getPageSize() != 0) {
            pages++;
        }
        return pages;
    }

}

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

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

相关文章

【C++高阶(一)】继承

目录 一、继承的概念 1.继承的基本概念 2.继承的定义和语法 3.继承基类成员访问方式的变化 ​编辑 4.总结 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 1.派生类中的默认构造函数 2.派生类中的拷贝构造函数 3.派生类中的移动构造函数…

Kubeadm安装部署k8s集群、踩坑日常

背景 ​ Docker是一个非常流行的容器化平台&#xff0c;它可以让我们方便构建、打包、发布和运行容器化应用程序。但是&#xff0c;在生产环境中&#xff0c;我们可能需要处理成百上千个容器&#xff0c;需要更好的管理这些容器&#xff0c;这就是Kubernetes(K8S)的用武之地。…

vue15:记事本vue指令案例

效果图&#xff1a; vue指令 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>帅临记事本</…

prometheusgrafananode_export搭建监控平台

一、环境要求 1、docker安装docker环境 2、docker安装prometheus 3、docker安装grafana 4、node-exportor(安装在被测服务器上) 5、我的服务器是Ubuntu 二、docker 安装prometheus 1、下载Prometheus镜像 docker pull prom/prometheus 2、检查端口是否被占用 安装netstat命…

24款奔驰S450升级原厂后排娱乐系统 主动氛围灯有哪些功能

24款奔驰S400豪华升级原厂主动氛围灯与后排娱乐系统&#xff1a;画蛇添足还是锦上添花&#xff1f; 在当今汽车市场竞争激烈的环境下&#xff0c;汽车制造商们为了满足消费者的多元化需求&#xff0c;不断推出各种升级配置和豪华版本。24款奔驰S400豪华版作为奔驰S级的一款重要…

碌时刻必备!微信自动回复让你告别消息堆积

在忙碌的时候&#xff0c;我们往往会面临消息堆积如山的情况。无法及时回复消息不仅容易造成交流障碍&#xff0c;还可能错过重要的机会。 但是现在&#xff0c;有一个神奇的工具——个微管理系统&#xff0c;可以帮助我们轻松应对这个问题 &#xff0c;实现微信自动回复。 首…

AIGC-风格迁移-style Injection in Diffusion-CVPR2024HighLight-论文精度

Style Injection in Diffusion: A Training-free Approach for Adapting Large-scale Diffusion Models for Style Transfer-CVPR2024HighLight 代码&#xff1a;https://github.com/jiwoogit/StyleID 论文&#xff1a;https://jiwoogit.github.io/StyleID_site/ 为了解决风格迁…

WXSS模板样式-全局样式和局部样式

一、WXSS 1.WXSS WXSS(WeiXin Style Sheets)是一套样式语言&#xff0c;用于美化WXML的组件样式&#xff0c;类似于网页开发中的CSS 2.WXSS和CSS的关系 WXSS具有CSS大部分特性&#xff0c;同时&#xff0c;WXSS还对CSS进行了扩充以及修改&#xff0c;以适应微信小程序的开发…

详解 Spring MVC(Spring MVC 简介)

什么是 Spring MVC&#xff1f; Spring MVC 是 Spring 框架提供的一个基于 MVC 模式的轻量级 Web 框架&#xff0c;是 Spring 为表示层开发提供的一整套完整的解决方案&#xff0c;Spring MVC 使用了 MVC 架构模式&#xff0c;将 Web 层职责解耦&#xff0c;基于请求驱动模型&…

26计算机操作系统408考研-操作系统进程与线程篇章(三)

操作系统进程与线程篇章 ` 文章目录 操作系统进程与线程篇章前言一、进程概念进程控制块进程创建进程终止进程的阻塞和唤醒进程唤醒进程挂起和激活线程多线程线程实现与线程模型总结互斥和同步并发原理硬件同步信号量机制信号量的应用管程经典同步问题消息传递前言 一、进程概…

Qt 科目一考试系统(有源码)

项目源码和资源&#xff1a;科目一考试系统: qt实现科目一考试系统 一.项目概述 该项目是一个基于Qt框架开发的在线考试系统&#xff0c;主要实现了考试题目的随机抽取、考试时间限制、成绩统计等功能。用户可以通过界面操作进行考试&#xff0c;并查看自己的考试成绩。 二.技…

清理安卓手机广告

保存脚本另存为 Fuck_AD.sh&#xff0c;在手机执行后体验效果。 echo ""echo " " echo " - 开始执行清理广告库文件" sleep 3files(/data/app/*/*/lib/arm64/libpangleflipped.so/data/app/*/*/lib/arm64/libzeus_direct_dex.so/data/app/*/*/l…

力扣--哈希表13.罗马数字转整数

首先我们可以知道&#xff0c;一个整数&#xff0c;最多由2个罗马数字组成。 思路分析 这个方法能够正确将罗马数字转换为阿拉伯数字的原因在于它遵循了罗马数字的规则&#xff0c;并且对这些规则进行了正确的编码和处理。 罗马数字规则 罗马数字由以下字符组成&#xff1a…

第八届能源、环境与材料科学国际学术会议(EEMS 2024)

文章目录 一、重要信息二、大会简介三、委员会四、征稿主题五、论文出版六、会议议程七、出版信息八、征稿编辑 一、重要信息 会议官网&#xff1a;http://ic-eems.com主办方&#xff1a;常州大学大会时间&#xff1a;2024年06月7-9日大会地点&#xff1a;新加坡 Holiday Inn …

langchian进阶二:LCEL表达式,轻松进行chain的组装

LangChain表达式语言-LCEL&#xff0c;是一种声明式的方式&#xff0c;可以轻松地将链条组合在一起。 你会在这些情况下使用到LCEL表达式: 流式支持 当你用LCEL构建你的链时&#xff0c;你可以得到最佳的首次到令牌的时间(输出的第一块内容出来之前的时间)。对于一些链&#…

C语言.数据结构.顺序表

1.顺序表的概念及结构 1.1线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;…

创建FreeRTOS工程

创建STM32CubeMX工程 配置时钟 配置FreeRTOS 生成Keil MDK的工程 打开工程 结尾 这就是我们用STM32CubeMX创建的最基本的一个FreeRTOS的工程。可以看到&#xff0c;这个与我们使用stm32开发的裸机程序有相同的地方&#xff0c;也有不同的地方&#xff0c;我们可以发现&am…

Redis 哨兵机制的工作原理——Java全栈知识(22)

Redis 哨兵机制的工作原理 在之前的文章我们讲到了 Redis 的三种集群架构&#xff1a;跳转文章&#xff1a;Redis集群模式 接下来我们详细讲哨兵机制的作用以及实现原理 以下是 Redis 哨兵的结构图 1、Redis 哨兵的作用 哨兵的作用如下&#xff1a; 1、监控&#xff0c;2、…

Mysql基础(七)DQL之select 语句(二)

一 select 语句续 WHERE子句后面跟着的是一个或多个条件,用于指定需要检索的行COUNT(): 多少条数据 where 11 和 count(1) 与 count(*) count(1)、count(*)和count(指定字段)之间的区别 ① order by 排序 mysql 之数据排序扩展 1、使用 order by 语句来实现排序2、排序可…

数据迁移利器登场!Elasticdumpv6.110震撼发布,助你轻松搬迁大数据!

简介 Elasticdump 是一个用于导出和导入 Elasticsearch 数据的工具。它能够从一个 Elasticsearch 集群读取数据并写入到另一个 Elasticsearch 集群、文件系统或其他数据存储&#xff08;例如 S3&#xff09;。这个工具非常有用&#xff0c;特别是在进行数据迁移、备份和恢复操作…