文档数据库-MongoDB

本文详细介绍了如何在SpringBoot项目中配置并使用MongoDB,包括配置步骤、用户POJO设计、Controller与Service层的实现,以及使用MongoTemplate进行CRUD操作的示例。
摘要由CSDN通过智能技术生成

目录

1.配置MongoDB

2.使用MongoTemplate实例

2.1 用户POJO

2.2 Controller

2.3使用MongoTemplate操作文档


Redis的执行速度远超关系型数据库,可以极大地提高系统的性能,但是它有一些致命的缺陷,其中最为严重的就是计算功能十分有限,例如,在一个10万数据量的List中,我只需要满足特定条件的元素,这时我们需要先把元素取出,然后通过条件去筛选得到我们想要的数据,这显然存在比较大的问题。当然,我们可以通过Lua脚本去完善,只是这样对于开发者的工作量就大大地增加了。

对于那些需要缓存而且经常需要统计、分析和查询的数据,对于Redis这样简单的NoSQL显然就不是那么便捷了,这时我们可以采用MongoDB数据库。对于那些需要统计,按条件查询和分析的数据,它提供了支持。

MongoDB是由C++语言编写的一种NoSQL,是一个基于分布式文件存储的开源数据库系统。在负载高时可以添加更多的节点,以保证服务器的性能,MongoDB的目的是为Web应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值对组成。MongoDB文档类似于JSON数据集,所以很容易转化为Java POJO对象或者JavaScript对象。

1.配置MongoDB

首先需要引入MongoDB的starter:

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

然后安装MongoDB,安装的地址为:https://blog.csdn.net/heshengfu1211/article/details/94218337

MongoDB配置信息如下:

spring.data.mongodb.host=192.168.0.1
spring.data.mongodb.database=test
spring.data.mongodb.username=mongod
spring.data.mongodb.password=test
spring.data.mongodb.port=27017

有了上述配置信息之后,SpringBoot会自动为我们创建关于MongoDB的Spring Bean,自动创建的Bean信息如下:

2.使用MongoTemplate实例

我们主要使用MongoTemplate实例进行操作数据,SpringBoot会根据配置自动生成这个对象,所以我们不需要自己去创建。

2.1 用户POJO

UserDO代码如下:

package com.martin.config.mongodb;

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

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

/**
 * @author: martin
 * @date: 2020/2/4
 */
//标识为MongoDB
@Document
@Data
public class UserDO implements Serializable {
    //MongoDB文档编号,主键
    @Id
    private Long id;
    //在MongoDB中使用user_name保存属性
    @Field("user_name")
    private String userName;
    //角色列表
    private List<Role> roles;
}

文档被标识为@Document,这说明它将作为MongoDB的文档存在,@id注解则将对应的字段设置为主键,@Field注解将属性userName与MongoDB中的user_name属性对应起来。

Role代码如下:

package com.martin.config.mongodb;

import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.io.Serializable;

/**
 * @author: martin
 * @date: 2020/2/4
 */
@Document
@Data
public class Role implements Serializable {
    private Long id;
    @Field("role_name")
    private String roleName;
    private String note;
}

这里继续使用@Document注解,标明Role是一个单独的MongoDB文档。如果我们只是在UserDO中使用角色,没有别的使用场景,也可以不使用@Document注解。

2.2 Controller

用户控制器的实例代码如下:

package com.martin.config.controller;

import com.martin.config.mongodb.UserDO;
import com.martin.config.service.MongoUserService;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * @author: martin
 * @date: 2020/2/4
 */
@Controller
@RequestMapping("/mongo")
public class UserController {
    @Autowired
    private MongoUserService userService;

    @RequestMapping("/save")
    @ResponseBody
    public UserDO saveUser(@RequestBody UserDO user) {
        userService.saveUser(user);
        return user;
    }

    @RequestMapping("/get")
    @ResponseBody
    public UserDO getUser(Long id) {
        return userService.getUser(id);
    }

    @RequestMapping("/find")
    @ResponseBody
    public List<UserDO> findUsers(String userName, String note, Integer skip, Integer limit) {
        return userService.findUser(userName, note, skip, limit);
    }

    @RequestMapping("/update")
    @ResponseBody
    public UpdateResult updateUser(Long id, String userName, String note) {
        return userService.updateUser(id, userName, note);
    }

    @RequestMapping("/delete")
    @ResponseBody
    public DeleteResult deleteResult(Long id) {
        return userService.deleteUser(id);
    }


}

这里引入了MongoUserService接口,下面我们讨论一下该接口的具体实现。

2.3使用MongoTemplate操作文档

首先定义用户服务接口MongoUserService,代码如下:

package com.martin.config.service;

import com.martin.config.mongodb.UserDO;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;

import java.util.List;

/**
 * @author: martin
 * @date: 2020/2/4
 */
public interface MongoUserService {
    void saveUser(UserDO userDO);

    DeleteResult deleteUser(Long id);

    /**
     * 查询用户
     *
     * @param userName 用户名称
     * @param note     备注
     * @param skip     跳过用户个数
     * @param limit    限制返回用户个数
     * @return
     */
    List<UserDO> findUser(String userName, String note, int skip, int limit);

    /**
     * 更新用户部分属性
     *
     * @param id       用户编号
     * @param userName 用户名称
     * @param note     备注
     * @return
     */
    UpdateResult updateUser(Long id, String userName, String note);

    UserDO getUser(Long id);
}

方法的含义比较简单,包含了增删改查等功能。

实现类MongoUserServiceImpl的实例代码如下:

package com.martin.config.service.impl;

import com.martin.config.mongodb.UserDO;
import com.martin.config.service.MongoUserService;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
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.stereotype.Service;

import java.util.List;

/**
 * @author: martin
 * @date: 2020/2/4
 */
@Service
public class MongoUserServiceImpl implements MongoUserService {
    //注入mongoTemplate
    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public void saveUser(UserDO userDO) {
        mongoTemplate.save(userDO);
    }

    @Override
    public DeleteResult deleteUser(Long id) {
        //构建id相等的条件
        Criteria criteriaId = Criteria.where("id").is(id);
        //查询对象
        Query queryId = Query.query(criteriaId);
        //删除用户
        return mongoTemplate.remove(queryId, UserDO.class);
    }

    @Override
    public List<UserDO> findUser(String userName, String note, int skip, int limit) {
        //将用户名称和备注设置为模糊查询准则
        Criteria criteria = Criteria.where("userName").regex(userName).and("note").regex(note);
        //构建查询条件,并设置分页跳过前skip个,至多返回limit个
        Query query = Query.query(criteria).limit(limit).skip(skip);

        return mongoTemplate.find(query, UserDO.class);
    }

    @Override
    public UpdateResult updateUser(Long id, String userName, String note) {
        //确定更新的对象
        Criteria criteriaId = Criteria.where("id").is(id);
        Query query = Query.query(criteriaId);
        //定义更新对象
        Update update = Update.update("userName", userName);
        update.set("note", note);

        return mongoTemplate.updateMulti(query, update, UserDO.class);
    }

    @Override
    public UserDO getUser(Long id) {
        return mongoTemplate.findById(id, UserDO.class);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值