概要

  • MongoDB是什么
  • NoSql是什么
  • 为什么要使用NoSql
  • MongoDB的特点
  • Spring整合MongoDB
    • springboot项目
    • 非springboot项目
  • 相关实体类注解的解释

MongoDB简介

1.MongoDB是什么

  • MongoDB是使用C++编写,开源的,面向文档的NoSql(Not Only SQL)数据库

2.NoSql是什么

  • NoSql(not only sql)是非关系型数据库的统称,常见的NoSql有Redis,MongoDB,Hbase,Cassandra等

3.为什么要使用NoSql

为了解决常规数据库以下问题

  • 高并发下读写压力大
  • 海量数据的高效存储和访问
  • 数据库的高可用和高拓展性

4.MongoDB的特点

  • 高性能易于使用,易于拓展
  • 面向集合存储
  • 支持动态查询,支持索引
  • 支持分片

5.Spring整合MongoDB

  • springboot项目

    1. 依赖

      1
      2
      3
      4
      5
      6
      7
      8
      9
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-mongodb</artifactId>
      </dependency>
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      </dependency>
    2. 在application.perproties/yml配置mongodb的连接地址

      1
      spring.data.mongodb.uri=mongodb://127.0.0.1:27017/myMongoDB
    3. 创建存储的User实体

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      public class User {
      @Id
      private Long id;
      private String username;
      private Integer age;

      public User(Long id, String username, Integer age) {
      this.id = id;
      this.username = username;
      this.age = age;
      }

      @Override
      public String toString() {
      return "User{" +
      "id=" + id +
      ", username='" + username + '\'' +
      ", age=" + age +
      '}';
      }
      }
    4. 实现User的数据访问对象

      1
      2
      3
      public interface UserRepository extends MongoRepository<User, Long> {
      User findByUsername(String username);
      }
    5. 测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class MongodbConnectionTestTest {
    @Autowired
    private UserRepository userRepository;

    @Autowired
    protected MongoTemplate mongoOperations;

    @Test
    public void test() throws Exception {
    // 创建三个User,并验证User总数
    userRepository.save(new User(1L, "didi", 30));
    userRepository.save(new User(2L, "mama", 40));
    userRepository.save(new User(3L, "kaka", 50));
    Assert.assertEquals(3, userRepository.findAll().size());
    // 删除一个User,再验证User总数
    User u = userRepository.findOne(1L);
    userRepository.delete(u);
    Assert.assertEquals(2, userRepository.findAll().size());
    // 删除一个User,再验证User总数
    u = userRepository.findByUsername("mama");
    userRepository.delete(u);
    Assert.assertEquals(1, userRepository.findAll().size());
    }

    @Test
    public void test1() throws Exception {
    List<User> users = mongoOperations.findAll(User.class);
    users.forEach(System.out::println);
    }
    }
    • 非springboot项目
    1. 依赖
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-mongodb</artifactId>
      <version>1.3.5.RELEASE</version>
      </dependency>
      <dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongo-java-driver</artifactId>
      <version>2.14.2</version>
      </dependency>
    2. xml配置
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:mongo="http://www.springframework.org/schema/data/mongo"
      xmlns="http://www.springframework.org/schema/beans"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
      http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">

      <mongo:mongo-client id="mongoClient" host="127.0.0.1" port="27017">

      <mongo:client-options
      connections-per-host="8"
      threads-allowed-to-block-for-connection-multiplier="4"
      connect-timeout="1000"
      max-wait-time="1500"
      socket-keep-alive="true"
      socket-timeout="1500"
      />
      </mongo:mongo-client>

      <mongo:db-factory id="mongoDbFactory"
      dbname="myMongoDB"
      mongo-ref="mongoClient"/>

      <mongo:template id="mongoTemplate" db-factory-ref="mongoDbFactory" write-concern="NORMAL"/>
      <mongo:repositories base-package="com.xxx.core.modules.*.repository"/>
      </beans>
    3. 创建存储的User实体
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
        public class User {
      @Id
      private Long id;
      private String username;
      private Integer age;

      public User(Long id, String username, Integer age) {
      this.id = id;
      this.username = username;
      this.age = age;
      }

      @Override
      public String toString() {
      return "User{" +
      "id=" + id +
      ", username='" + username + '\'' +
      ", age=" + age +
      '}';
      }
      }
    4. 实现User的数据访问对象
      1
      2
      3
      public interface UserRepository extends MongoRepository<User, Long> {
      User findByUsername(String username);
      }
    5. 测试

6.相关实体类注解的解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Id - 文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成。

@Document - 把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。@Document(collection="mongodb") mongodb对应表

@DBRef - 声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能,当你在本实例中修改了DERef对象里面的值时,单独保存本实例并不能保存DERef引用的对象,它要另外保存,如下面例子的Person和Account。

@Indexed - 声明该字段需要索引,建索引可以大大的提高查询效率。

@CompoundIndex - 复合索引的声明,建复合索引可以有效地提高多字段的查询效率。

@GeoSpatialIndexed - 声明该字段为地理信息的索引。

@Transient - 映射忽略的字段,该字段不会保存到mongodb。

@PersistenceConstructor - 声明构造函数,作用是把从数据库取出的数据实例化为对象。该构造函数传入的值为从DBObject中取出的数据