栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot整合mongodb MongoTemplate和MongoRepository的用法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot整合mongodb MongoTemplate和MongoRepository的用法

前情

Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库。两者在分布式、微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合MongoDB的两种方法:MongoRepository和MongoTemplate。

1.MongoRepository

以Spring Date为中心的方法,基于所有Spring数据项目中众所周知的访问模式,提供更加灵活和复杂的api操作。

1.使用Spring Data MongoDb Repository可以使你不用写相关的查询组合语句,它会内部为我们实现这样的一个类。

2.只要你按规定定义好接口名就可以免去你写查询组合语句。

3.要有主键值才可以用save(有就更新,没有就插入)。所以就算没有ID也增加这个字段是好的。(id要是String才会自动为你生面ID号(保存时可以没有值),int 要你自己做惟一处理和输入值)

4.DATE不能作为主键使用。

Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法

public interface Repository { }
Spring Data可以让我们只定义接口,只要遵循 Spring Data的规范,就无需写实现类。
与继承 Repository 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClass 和 idClass 属性,两种方式没有区别。

Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:

Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类
CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法 
PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法 
MongoRepository: 继承 PagingAndSortingRepository,实现一组 mongodb规范相关的方法

自定义的 XxxxRepository 需要继承 MongoRepository,这样的 XxxxRepository 接口就具备了通用的数据访问控制层的能力(CURD的操作功能)。

public interface ResourceCommentRepository extends MongoRepository {

}
缺陷:

MongoRepository的缺点是不够灵活,MongoTemplate可以用来补充,对mongodb本身熟悉的话,你会发现使用MongoTemplate更加游刃有余,它更加接近原生的mongodb命令。

2.MongoTemplate(跟Mybatis类似)

MongoTemplate 遵循Spring中的标准模板模式,并为底层持久性引擎提供准备就绪的基本API。如果开发者没有提供MongoTemplate,默认会注册一个MongoTemplate进入Spring容器,所以开发者可以直接使用MongoTemplate。
MongoTemplate是数据库和代码之间的接口,对数据库的操作都在它里面。
MongoTemplate核心操作类:Criteria和Query

Criteria类:封装所有的语句,以方法的形式查询。
Query类:将语句进行封装或者添加排序之类的操作。
.MongoTemplate实现了interface MongoOperations。
.MongoDB documents和domain classes之间的映射关系是通过实现了MongoConverter这个interface的类来实现的。

.MongoTemplate提供了非常多的操作MongoDB的方法。 它是线程安全的,可以在多线程的情况下使用。

.MongoTemplate实现了MongoOperations接口, 此接口定义了众多的操作方法如"find", "findAndModify", "findOne", "insert", "remove", "save", "update" and "updateMulti"等。
.MongoTemplate转换domain object为DBObject,缺省转换类为MongoMappingConverter,并提供了Query, Criteria, and Update等流式API。
springboot整合mongodb 项目准备 项目结构:

准备测试数据
db.getCollection('newUser').save({"name":"lgn","age":"22"})

启动MongoDB实例

查看前面的文章。

引入相关依赖

主要的依赖为Web和MongoDB的starter,把下面代码加入到pom.xml中即可:


  org.springframework.boot
  spring-boot-starter-data-mongodb


  org.springframework.boot
  spring-boot-starter-web

配置数据库连接信息

与配置MySQL或Oracle一样,MongoDB也需要配置连接信息,配置在application.properties中如下:

spring:
  data:
    mongodb:
      uri: mongodb://lgn:123456@192.168.8.150:27017/runoob
创建数据模型实体

创建NewUser类如下:

package com.fhbean.springboot.mongodb.entity;
import org.springframework.data.annotation.Id;
import java.util.Date;

public class NewUser {
    @Id
    private String userId;
    private String name;
    private Integer age;
    private Date createTime = new Date();

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}

不需要在MongoDB中创建对应的Collections(表),当通过Web应用新增时会自动创建。

方式1:MongoRepository 定义数据访问层UserRepository
package com.fhbean.springboot.mongodb.reposistory;

import org.springframework.data.mongodb.repository.MongoRepository;
import com.fhbean.springboot.mongodb.entity.NewUser;


public interface UserRepository extends MongoRepository {

}

实现Controller
package com.fhbean.springboot.mongodb.controller;
import com.fhbean.springboot.mongodb.reposistory.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.fhbean.springboot.mongodb.entity.NewUser;
import java.util.List;


@RestController
@RequestMapping("/userRepository")
public class UserRepositoryController {
    @Autowired
    private final UserRepository userRepository;

    public UserRepositoryController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @GetMapping("/getAllUsers")
    public List getAllUsers() {
        return userRepository.findAll();
    }

    @GetMapping("/{userId}")
    public NewUser getByUserId(@PathVariable String userId) {
        return userRepository.findById(userId).orElse(new NewUser());
    }

    @PostMapping("")
    public NewUser addNewUser(@RequestBody NewUser user) {
        return userRepository.save(user);
    }

    @DeleteMapping("/{userId}")
    public String delete(@PathVariable String userId) {
        NewUser user = new NewUser();
        user.setUserId(userId);
        userRepository.deleteById(userId);
        return "deleted: " + userId;
    }

    @PutMapping("")
    public NewUser update(@RequestBody NewUser user) {
        return userRepository.save(user);
    }
}

测试


方式2:MongoTemplate 定义数据访问层UserDAL

先定义接口为:

package com.fhbean.springboot.mongodb.service;

import com.fhbean.springboot.mongodb.entity.NewUser;

import java.util.List;


public interface UserDAL {
    List findAll();

    NewUser findById(String userId);

    NewUser save(NewUser user);

    void deleteById(String userId);
}

然后实现该接口如下:

package com.fhbean.springboot.mongodb.service.impl;
import com.fhbean.springboot.mongodb.entity.NewUser;
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 java.util.List;

import com.fhbean.springboot.mongodb.service.UserDAL;
import org.springframework.stereotype.Repository;


@Repository
public class UserDALImpl implements UserDAL {

    @Autowired
    private MongoTemplate template;

    @Override
    public List findAll() {
        return template.findAll(NewUser.class);
    }

    @Override
    public NewUser findById(String userId) {
        return template.findById(userId,NewUser.class);
    }

    @Override
    public NewUser save(NewUser user) {
        template.save(user);
        return user;
    }

    @Override
    public void deleteById(String userId) {
        Query query = new Query();
        query.addCriteria(Criteria.where("userId").is(userId));
        template.remove(query, NewUser.class);
    }
}

实现另一个Controller
package com.fhbean.springboot.mongodb.controller;

import com.fhbean.springboot.mongodb.entity.NewUser;
import com.fhbean.springboot.mongodb.service.UserDAL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;


@RestController
@RequestMapping("/userTemplate")
public class UserTemplateController {
    @Autowired
    private final UserDAL userDAL;

    public UserTemplateController(UserDAL userDAL) {
        this.userDAL = userDAL;
    }


    @GetMapping("")
    public List getAllUsers() {
        return userDAL.findAll();
    }

    @GetMapping("/{userId}")
    public NewUser getByUserId(@PathVariable String userId) {
        return userDAL.findById(userId);
    }

    @PostMapping("/addNewUser")
    @ResponseBody
    public NewUser addNewUser(@RequestBody NewUser user) {
        return userDAL.save(user);
    }

    @DeleteMapping("/{userId}")
    public String delete(@PathVariable String userId) {
        NewUser user = new NewUser();
        user.setUserId(userId);
        userDAL.deleteById(userId);
        return "deleted: " + userId;
    }

    @PutMapping("")
    public NewUser update(@RequestBody NewUser user) {
        return userDAL.save(user);
    }
}

测试

![在这里插入图片描述](https://img-blog.csdnimg.cn/92b593c5bda4422bb2d138f299577b57.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oq5

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/272297.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号