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. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-test</artifactId>
  8. <scope>test</scope>
  9. </dependency>
  1. 2. application.perproties/yml配置mongodb的连接地址
  1. spring.data.mongodb.uri=mongodb://127.0.0.1:27017/myMongoDB
  1. 3. 创建存储的User实体
  1. public class User {
  2. @Id
  3. private Long id;
  4. private String username;
  5. private Integer age;
  6. public User(Long id, String username, Integer age) {
  7. this.id = id;
  8. this.username = username;
  9. this.age = age;
  10. }
  11. @Override
  12. public String toString() {
  13. return "User{" +
  14. "id=" + id +
  15. ", username='" + username + '\'' +
  16. ", age=" + age +
  17. '}';
  18. }
  19. }
  1. 4. 实现User的数据访问对象
  1. public interface UserRepository extends MongoRepository<User, Long> {
  2. User findByUsername(String username);
  3. }
  1. 5. 测试
  1. @SpringBootTest
  2. @RunWith(SpringRunner.class)
  3. public class MongodbConnectionTestTest {
  4. @Autowired
  5. private UserRepository userRepository;
  6. @Autowired
  7. protected MongoTemplate mongoOperations;
  8. @Test
  9. public void test() throws Exception {
  10. // 创建三个User,并验证User总数
  11. userRepository.save(new User(1L, "didi", 30));
  12. userRepository.save(new User(2L, "mama", 40));
  13. userRepository.save(new User(3L, "kaka", 50));
  14. Assert.assertEquals(3, userRepository.findAll().size());
  15. // 删除一个User,再验证User总数
  16. User u = userRepository.findOne(1L);
  17. userRepository.delete(u);
  18. Assert.assertEquals(2, userRepository.findAll().size());
  19. // 删除一个User,再验证User总数
  20. u = userRepository.findByUsername("mama");
  21. userRepository.delete(u);
  22. Assert.assertEquals(1, userRepository.findAll().size());
  23. }
  24. @Test
  25. public void test1() throws Exception {
  26. List<User> users = mongoOperations.findAll(User.class);
  27. users.forEach(System.out::println);
  28. }
  29. }
  1. - springboot项目
  2. 1. 依赖
  3. ```xml
  4. <dependency>
  5. <groupId>org.springframework.data</groupId>
  6. <artifactId>spring-data-mongodb</artifactId>
  7. <version>1.3.5.RELEASE</version>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.mongodb</groupId>
  11. <artifactId>mongo-java-driver</artifactId>
  12. <version>2.14.2</version>
  13. </dependency>
  1. xml配置

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    4. xmlns="http://www.springframework.org/schema/beans"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    6. http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
    7. <mongo:mongo-client id="mongoClient" host="127.0.0.1" port="27017">
    8. <mongo:client-options
    9. connections-per-host="8"
    10. threads-allowed-to-block-for-connection-multiplier="4"
    11. connect-timeout="1000"
    12. max-wait-time="1500"
    13. socket-keep-alive="true"
    14. socket-timeout="1500"
    15. />
    16. </mongo:mongo-client>
    17. <mongo:db-factory id="mongoDbFactory"
    18. dbname="myMongoDB"
    19. mongo-ref="mongoClient"/>
    20. <mongo:template id="mongoTemplate" db-factory-ref="mongoDbFactory" write-concern="NORMAL"/>
    21. <mongo:repositories base-package="com.xxx.core.modules.*.repository"/>
    22. </beans>
  2. 创建存储的User实体

    1. public class User {
    2. @Id
    3. private Long id;
    4. private String username;
    5. private Integer age;
    6. public User(Long id, String username, Integer age) {
    7. this.id = id;
    8. this.username = username;
    9. this.age = age;
    10. }
    11. @Override
    12. public String toString() {
    13. return "User{" +
    14. "id=" + id +
    15. ", username='" + username + '\'' +
    16. ", age=" + age +
    17. '}';
    18. }
    19. }
  3. 实现User的数据访问对象
    1. public interface UserRepository extends MongoRepository<User, Long> {
    2. User findByUsername(String username);
    3. }
  4. 测试 ```

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

  1. @Id - 文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成。
  2. @Document - 把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。@Document(collection="mongodb") mongodb对应表
  3. @DBRef - 声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能,当你在本实例中修改了DERef对象里面的值时,单独保存本实例并不能保存DERef引用的对象,它要另外保存,如下面例子的PersonAccount
  4. @Indexed - 声明该字段需要索引,建索引可以大大的提高查询效率。
  5. @CompoundIndex - 复合索引的声明,建复合索引可以有效地提高多字段的查询效率。
  6. @GeoSpatialIndexed - 声明该字段为地理信息的索引。
  7. @Transient - 映射忽略的字段,该字段不会保存到mongodb
  8. @PersistenceConstructor - 声明构造函数,作用是把从数据库取出的数据实例化为对象。该构造函数传入的值为从DBObject中取出的数据