[Java基础篇]Spring Boot整合MongoDB

2022-04-14 14:43:50 浏览数 (1)

[Java基础篇]Spring Boot整合MongoDB

  • ✨博主介绍
  • 前言
    • MongoDB
      • CAP定理(CAP theorem)
      • NoSQL 的优点/缺点
      • NoSQL 数据库分类
  • MongoDB整合Spring Boot
    • 在pom.xml添加坐标
    • 添加MyUser实体类
  • MongoDB常用方法
  • MongoDB添加方法
  • MongoDB查询方法

前言

MongoDB

NoSQL = Not Only ),意即“NoSQL”。

在现代的计算系统上每天网络上都会产生大量的数据量。

1970 年 EFCodd 提出的关系模型的论文“Arelational model of data for large shared databases”,这部分数据有很大一部分关系数据库管理系统(RDBMS)来。简单。

应用非常证明,关系模式适合于客户服务器应用程序,通过范围的利益,今天它是数据在网络和商务应用的目标技术。

NoSQL是全新地的某人性运动早期提出,发展至09年趋势越发高涨。NoSQL的拥护者们覆盖使用2个数据库就关系型的数据存储,相对于铺天数据库的关系型应用,是一种全新的思想的注入。

CAP定理(CAP theorem)

在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer’s theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
  • 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:

  • CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
  • CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
  • AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

NoSQL 的优点/缺点

优点:

  • 高可扩展性
  • 计算计算
  • 标记
  • 架构的,半数据数据
  • 没有复杂的关系

缺点:

  • 没有标准化
  • 有限的查询功能(取消)
  • 最终一致是不喜欢的程序

NoSQL 数据库分类

类型

代表部分

特点

列存储

Hbase Cassandra Hypertable

顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。

文档存储

MongoDB CouchDB

文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能。

key-value存储

Tokyo Cabinet / Tyrant Berkeley DB MemcacheDB Redis

可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)

图存储

Neo4J FlockDB

图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。

对象存储

db4o Versant

通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。

xml数据库

Berkeley DB XML BaseX

高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。

MongoDB整合Spring Boot

在pom.xml添加坐标

代码语言:javascript复制
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>

在application文件添加mongodb的配置

代码语言:javascript复制
spring.data.mongodb.uri=mongodb://106.75.148.160:27017/test

添加MyUser实体类

代码语言:javascript复制
@Data
@Document("MyUser")
public class MyUser {

 @Id
 private String id;
 private String name;
 private Integer age;
 private String email;
 private String createDate;
}

MongoDB常用方法

mongoTemplate.findAll(MyUser.class)查询User文档的全部数据

mongoTemplate.findById(<id>, MyUser.class)查询User文档id为id的数据

mongoTemplate.find(query, MyUser.class)根据query内的查询条件查询

mongoTemplate.upsert(query, update, MyUser.class)修改

mongoTemplate.remove(query, MyUser.class)删除

mongoTemplate.insert(User)新增

MongoDB添加方法

代码语言:javascript复制
@RequestMapping("testMongoDBAdd")
public String testMongoDBAdd(){
    MyUser myUser = new MyUser();
    myUser.setAge(22);
    myUser.setEmail("123456789@qq.com");
    myUser.setName("苏州程序大白");

    mongoTemplate.insert(myUser);

    return "添加成功";
}

MongoDB查询方法

Query对象

  • 1、创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)。
  • 2、 精准条件:criteria.and(“key”).is(“条件”)模糊条件:criteria.and(“key”).regex(“条件”)。
  • 3、封装条件:query.addCriteria(criteria)。
  • 4、大于(创建新的criteria):Criteria gt = Criteria.where(“key”).gt(“条件”)小于(创建新的criteria):Criteria lt = Criteria.where(“key”).lt(“条件”)。
  • 5、Query.addCriteria(new Criteria().andOperator(gt,lt))。
  • 6、一个query中只能有一个andOperator()。其参数也可以是Criteria数组。
  • 7、排序 :query.with(new Sort(Sort.Direction.ASC, “age”). and(new Sort(Sort.Direction.DESC, “date”)))。
  • 查询方法
代码语言:javascript复制
@RequestMapping("testMongoDBfindAll")
public String  testMongoDBfindAll(){


    List<MTest> mTests = mongoTemplate.findAll( MTest.class);

    System.out.println("mTests=" mTests);
    return "查询成功";
}
  • 根据ID查询
代码语言:javascript复制
@RequestMapping("testMongoDBfindById")
public String  testMongoDBfindById(){


    MyUser myUser = mongoTemplate.findById("", MyUser.class);

    System.out.println("myUser=" myUser);
    return "查询成功";
}
  • 条件查询
代码语言:javascript复制
@RequestMapping("testMongoDBCriteria")
public String  testMongoDBCriteria(){

    Query query = new Query();

    Criteria criteria = Criteria.where("name").is("苏州程序大白");
    query.addCriteria(criteria);

    List<MyUser> myUsers = mongoTemplate.find(query, MyUser.class);

    System.out.println("mTests=" myUsers);
    return "查询成功";
}
  • 模糊查询
代码语言:javascript复制
//模糊查询

public void findUsersLikeName() {
    String name = "est";
    String regex = String.format("%s%s%s", "^.*", name, ".*$");
    Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    Query query = new Query(Criteria.where("name").regex(pattern));
    List<User> userList = mongoTemplate.find(query, User.class);
    System.out.println(userList);
}
  • 分页查询
代码语言:javascript复制
//分页查询
public void findUsersPage() {
    String name = "est";
    int pageNo = 1;
    int pageSize = 10;

    Query query = new Query();
    String regex = String.format("%s%s%s", "^.*", name, ".*$");
    Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
    query.addCriteria(Criteria.where("name").regex(pattern));
    int totalCount = (int) mongoTemplate.count(query, User.class);
    List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);

    Map<String, Object> pageMap = new HashMap<>();
    pageMap.put("list", userList);
    pageMap.put("totalCount",totalCount);
    System.out.println(pageMap);
}
  • 修改方法
代码语言:javascript复制
//修改
@RequestMapping("updateMyUser")
public String updateMyUser() {

    MyUser MyUser = mongoTemplate.findById("5ffbfa2ac290f356edf9b5aa", MyUser.class);
    MyUser.setName("test_1");
    MyUser.setAge(25);
    MyUser.setEmail("123456789@qq.com");
    Query query = new Query(Criteria.where("_id").is(MyUser.getId()));
    Update update = new Update();
    update.set("name", MyUser.getName());
    update.set("age", MyUser.getAge());
    update.set("email", MyUser.getEmail());
    UpdateResult result = mongoTemplate.upsert(query, update, MyUser.class);
    long count = result.getModifiedCount();

    return "修改用户" count;
}
  • 删除方法
代码语言:javascript复制
//删除操作
@RequestMapping("TestMongoDBDelete")
public void TestMongoDBDelete() {
    Query query =
    new Query(Criteria.where("_id").is("5ff45642ac290f356edf9b5aa"));
    DeleteResult result = mongoTemplate.remove(query, MyUser.class);
    long count = result.getDeletedCount();
    System.out.println(count);
}

0 人点赞