美文网首页
SpringBoot 2.X 整合MongoDB案例

SpringBoot 2.X 整合MongoDB案例

作者: kaixingdeshui | 来源:发表于2020-11-27 11:46 被阅读0次

SpringBoot 2.X 整合MongoDB案例

官方文档介绍

https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.reactive
image.png

官方各个版本说明:


image.png
简介

Mongodb是为快速开发互联网Web应用而构建的数据库系统,其 数据模型 和 持久化策略 就是为了构建高读/写吞吐量和高自动灾备伸缩性的系统。
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

优点
  • 文档结构的存储方式,能够更便捷的获取数据
  • 内置GridFS,支持大容量的存储
  • 海量数据下,性能优越
  • 动态查询
  • 全索引支持,扩展到内部对象和内嵌数组
  • 查询记录分析
  • 快速,就地更新
  • 高效存储二进制大对象 (比如照片和视频)
  • 复制(复制集)和支持自动故障恢复
  • 内置 Auto- Sharding 自动分片支持云级扩展性,分片简单
  • MapReduce 支持复杂聚合
缺点
  • 不支持事务操作
  • MongoDB 占用空间过大 (不过这个确定对于目前快速下跌的硬盘价格来说,也不算什么缺点了)
  • MongoDB没有如MySQL那样成熟的维护工具
  • 无法进行关联表查询,不适用于关系多的数据
  • 复杂聚合操作通过mapreduce创建,速度慢
  • 模式自由,自由灵活的文件存储格式带来的数据错
  • MongoDB 在你删除记录后不会在文件系统回收空间。除非你删掉数据库。但是空间没有被浪费

Spring Data Mongodb

Spring Data Mongodb是Spring提供的一种以Spring Data风格来操作数据存储的方式,它可以避免编写大量的样板代码。

Mongodb 常用的注解

注解 解析
@Id 用于标记id字段,没有标记此字段的实体也会自动生成id字段,但是我们无法通过实体来获取id。id建议使用ObjectId类型来创建
@Document 用于标记此实体类是mongodb集合映射类
@DBRef 用于指定与其他集合的级联关系,但是需要注意的是并不会自动创建级联集合
@Indexed 用于标记为某一字段创建索引
@CompoundIndex 用于创建复合索引
@TextIndexed: 用于标记为某一字段创建全文索引
@Language 指定documen语言
@Transient: 被该注解标注的,将不会被录入到数据库中。只作为普通的javaBean属性
@Field: 用于指定某一个字段映射到数据库中的名称
image.png

MongoTemplate

使用MongoTemplate结合SortCriteriaQueryUpdate以及分页Pageable类灵活地进行对mongodb数据库进行增删改查。

query方法
//根据查询条件查询
 public <T> List<T> find(Query query, Class<T> entityClass){}
 //根据查询条件查询返回一条记录
 public <T> <T>findOne(Query query, Class<T> entityClass){}
//根据查询条件查询返回一条记录
public <T> T findById(Object id, Class<T> entityClass) {}
 //查询该collection所有记录
 public <T> List<T> findAll(Class<T> entityClass){}
// 根据查询条件 返回记录数
public long count(Query query, Class<?> entityClass) {}
insert方法
//新增一条记录
 public <T> T insert(T objectToSave){}
 //在collectionName中新增一条记录
 public <T> T insert(T objectToSave, String collectionName) {}
 //
 public <T> T save(T objectToSave){}
//批量插入
public <T> Collection<T> insert(Collection<? extends T> batchToSave, Class<?> entityClass) {}
public <T> Collection<T> insertAll(Collection<? extends T> objectsToSave) {}

remove方法
//根据Object删除
 public DeleteResult remove(Object object) {}
 //根据查询条件进行删除
 public DeleteResult remove(Query query, Class<?> entityClass){}
update方法:
 //
 public UpdateResult upsert(Query query, Update update, Class<?> entityClass) {}
 //更新查询出来的第一条记录
public UpdateResult updateFirst(Query query, Update update, String collectionName) {}
public UpdateResult updateFirst(Query query, Update update, Class<?> entityClass) {}

Sort查询排序类

Sort类常用方法
org.springframework.data.domain.Sort

//构造方法创建一个排序。direction为排序方向的枚举类型,properties为排序字段数组
Sort(Sort.Direction direction, String... properties)
//多个排序条件链接
and(Sort sort)
//返回升序排列对象
ascending()    
//返回降序排列对象
descending()  
image.png

Criteria查询条件类

类似于SQL的where,常用方法:
org.springframework.data.mongodb.core.query.Criteria

//声明定义查询条件,且为静态方法
where(String key)
//与操作
and(String key)
//正则表达式,即可为模糊查询
regex(String re)
//包含
in(Object... o)    
//大于
gt(Object o)
//大于等于
gte(Object o)
//等于
is(Object o)
//小于
lt(Object o)
//小于等于
lte(Object o) 
//非
not()
//创建与操作
andOperator(Criteria... criteria) 
image.png
Query查询对象

具有查询的全部信息,其中包括筛选条件、排序、返回数量等。常用的方法;
org.springframework.data.mongodb.core.query.Query

//定义查询对象,静态方法
query(CriteriaDefinition criteriaDefinition)
//在本次查询添加一个CriteriaDefinition查询条件
addCriteria(CriteriaDefinition criteriaDefinition)
//添加一个Sort排序对象
with(Sort sort)
//添加一个Pageable分页对象、通常情况下,分页和排序一起使用。
with(Pageable pageable)
image.png

第二种方式:继承MongoRepository<T, ID> 接口 实现CRUD操作

image.png

先创建一个实体对象

public class Person {
  private String id;
  private String name;
  private int age;
...get set方法
}

继承MongoRepository接口

public interface UserRepository extends MongoRepository<User,String> {
    //按提示写
    User findByName();

}

Spring Boot 整合 MongoDB 示例

1.pom导入依赖

  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.18.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

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

  1. application.yml配置
server:
  port: 8080
#
spring:
  data:
    # mongodb
    mongodb:
      #mongodb 连接地址
      host: localhost
      # 端口号
      port: 27017
      #mongodb的连接的数据库
      database: mall-port
      #默认没有账号密码
      username: root
      password: root

3.MongodbService

@Service
public class MongodbService {
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 新增文档
     *
     * @param userDTO
     * @return
     */
    public UserDTO insert(UserDTO userDTO) {
        //insert方法并不提供级联类的保存,所以级联类需要先自己先保存
        return mongoTemplate.insert(userDTO);
    }

    public UserDTO save(UserDTO userDTO) {
        Sort sort = new Sort(Sort.Direction.DESC, "name");
        userDTO = mongoTemplate.findOne(Query.query(Criteria.where("")).with(sort), UserDTO.class);
        return mongoTemplate.save(userDTO);
    }

    /**
     * 删除文档
     * NOTE:remove方法不支持级联删除所以要单独删除子数据
     * @param name
     */
    public void remove(String name) {
        //根据名字查询数据并删除
        UserDTO userDTO = mongoTemplate.findOne(Query.query(Criteria.where("name").is(name)), UserDTO.class);
        //remove方法不支持级联删除所以要单独删除子数据
        List<AddressDTO> addressList = userDTO.getAddressList();
        for (AddressDTO addressDTO : addressList) {
            mongoTemplate.remove(addressDTO);
        }
        //删除主数据
        mongoTemplate.remove(userDTO);
    }

    /**
     * 更新文档
     * @param userDTO
     */
    public void update(UserDTO userDTO) {        mongoTemplate.updateFirst(Query.query(Criteria.where("name").is(userDTO.getName())), Update.update("age", userDTO.getAge()), UserDTO.class);
    }

    /**
     * 查询文档
     * @param name
     */
    public void find(String name) {
        Sort sort = new Sort(Sort.Direction.DESC, "name");
        List<UserDTO> userDTOS = mongoTemplate.find(Query.query(Criteria.where("name").is(name)), UserDTO.class);
        //基于sort排序使用findOne查询最新一条记录
        UserDTO userDTO = mongoTemplate.findOne(Query.query(Criteria.where("name").is(name)).with(sort), UserDTO.class);
        //模糊查询
        List<UserDTO> userDTOList = mongoTemplate.find(Query.query(Criteria.where("name").is(name).regex(name)).with(sort), UserDTO.class);
        //分页查询
        Pageable pageable = PageRequest.of(3, 20, sort);
        List<UserDTO> userDTOPageableList = mongoTemplate.find(Query.query(Criteria.where("name").is(name)).with(pageable), UserDTO.class);
        //总数
        long conut = mongoTemplate.count(Query.query(Criteria.where("name").is(name)), UserDTO.class);
        Page<UserDTO> page = new PageImpl(userDTOPageableList, pageable, conut);
    }
}

连接MongoDB遇到的一些问题

连接 MongoDB 用户名密码

在安装目录下,创建用户名密码

show dbs // 显示所有的数据库
use admin // 切换到admin
db.createUser({user:'root',pwd:'root',roles:['userAdminAnyDatabase']})//添加用户
db.auth('root','root')

再切换数据库,添加用户,
use test
db.createUser({user:'root',pwd:'root',roles:['readWrite']})//添加用户角色
db.auth('root','root') //给角色root权限
image.png
image.png

相关文章

网友评论

      本文标题:SpringBoot 2.X 整合MongoDB案例

      本文链接:https://www.haomeiwen.com/subject/ldfxwktx.html