SpringBoot整合MongoDB

打印 上一主题 下一主题

主题 906|帖子 906|积分 2718


  • NoSQL(Not Only SQL),即反SQL运动或者是不仅仅SQL,指的是非关系型的数据库,是一项全新的数据库革命运动,是一种全新的思维注入
  • NoSQL优点

    • 数据库高并发读写
    • 海量数据高效率存储和访问
    • 数据库高扩展性和高可用性

  • NoSQL缺点

    • 数据库事务一致性需求
    • 数据库的写实时性和读实时性需求
    • 复杂的SQL查询,特别是夺标关联查询的需求

  • MongoDB概述

    • 由C++语言编写,是一个基于分布式文件存储的开源数据库系统;在高负载的情况下,添加更多的节点,可以保证服务器性能
    • MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案;将数据存储为一个文档,数据结构由键值对组成。MongoDB文档类似于JSON对象字段值可以包含其他问你当、数组及文档数组

  • MongoDB特点

    • MongoDB是一个面向文档存储的数据库,操作起来比较简单和容易
    • MongoDB记录总可以设置任何属性的索引
    • 可以通过本地后者网络创建数据镜像,这使得MongoDB有更强的扩展性
    • 如果负载的增减(需要跟多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上,这就是所谓的分片
    • MongoDB支持丰富的查询表达式,查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象和数组
    • MongoDB使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段
    • MongoDB中的Map/reduce主要是用来对数据进行批量处理和聚合操作
    • Map和Reduce

      • Map函数调用emit(key, value)便利集合中所有的记录,将key域value传给Reduce函数进行处理
      • Map和Reduce函数是使用JavaScript编写的,把那个可以通过db.runCommand或mapreduce命令来执行MapReduce操作

    • GridFS是MongoDB中的一个内置功能,可以用于存放大量的小文件
    • MongoDB允许在服务端执行脚本,可以用JavaScript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可
    • MongoDB支持跟中编程语言:RUBY、PYTHON、JAVA、C++、PHP、C#
    • 安装简单

  • MongoDB语法:略
  • SpringBoot整合MongoDB

    • 集成简介:spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB;MongoTemplate操作灵活,MongoRepository操作简单,不够灵活
    • 添加相关依赖

  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4.     <version>2.2.1.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.springframework.boot</groupId>
  8.     <artifactId>spring-boot-starter-web</artifactId>
  9.     <version>2.2.1.RELEASE</version>
  10. </dependency>
  11. <dependency>
  12.     <groupId>org.projectlombok</groupId>
  13.     <artifactId>lombok</artifactId>
  14.     <version>1.18.10</version>
  15. </dependency>
  16. <dependency>
  17.     <groupId>joda-time</groupId>
  18.     <artifactId>joda-time</artifactId>
  19.     <version>2.10.1</version>
  20. </dependency>
  21. <dependency>
  22.     <groupId>org.springframework.boot</groupId>
  23.     <artifactId>spring-boot-starter-test</artifactId>
  24.     <scope>test</scope>
  25.     <exclusions>
  26.         <exclusion>
  27.             <groupId>org.junit.vintage</groupId>
  28.             <artifactId>junit-vintage-engine</artifactId>
  29.         </exclusion>
  30.     </exclusions>
  31. </dependency>
复制代码

  • 添加配置
  1. spring.data.mongodb.uri=mongodb://Your IP:27017/your database
复制代码

  • 创建与集合对应的实体类
  1. @Data
  2. @Document("User")   // 表示操作的是your database下的User集合
  3. public class User {
  4.     @Id
  5.     private String id;
  6.     private String name;
  7.     private Integer age;
  8. }
复制代码

  • 测试MongoTemplate访问MongoDB(CRUD)
  1. @SpringBootTest
  2. public class MongoDBTest {
  3.     @Autowired
  4.     private MongoTemplate mongoTemplate;
  5.     /** 新增 */
  6.     @Test
  7.     public void insert() {
  8.         User user = new User();
  9.         user.setName("xiansen");
  10.         user.setAge(18);
  11.         User u = mongoTemplate.insert(user);
  12.         System.out.println("user = " + u);
  13.     }
  14.     /** 查询所有记录 */
  15.     @Test
  16.     public void findAll() {
  17.         List<User> all = mongoTemplate.findAll(User.class);
  18.         System.out.println("all = " + all);
  19.     }
  20.     /** ID查询 */
  21.     @Test
  22.     public void findById() {
  23.         User u = mongoTemplate.findById("rge8vcuxdfsfdfsdf", User.class);
  24.         System.out.println("u = " + u);
  25.     }
  26.     /** 条件查询 */
  27.     @Test
  28.     public void findUserList() {
  29.         Query query = new Query(Criteria.where("name").is("xiansen").and("age").is(18));
  30.         List<User> users = mongoTemplate.find(query, User.class);
  31.         System.out.println("users = " + users);
  32.     }
  33.     /** 模糊查询 */
  34.     @Test
  35.     public void findUserListByLike() {
  36.         String name = "xian";
  37.         String regex = String.format("%s%s%s", "^.*", name, ".*$");
  38.         Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);  // 大小写敏感
  39.         Query query = new Query(Criteria.where("name").regex(pattern));   // 使用正则表达式实现模糊查询
  40.         List<User> users = mongoTemplate.find(query, User.class);
  41.         System.out.println("users = " + users);
  42.     }
  43.     /** 分页查询 */
  44.     @Test
  45.     public void findPageUserList() {
  46.         int current = 1;
  47.         int limit = 3;
  48.         String name = "xian";
  49.         String regex = String.format("%s%s%s", "^.*", name, ".*$");
  50.         Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);  // 大小写敏感
  51.         Query query = new Query(Criteria.where("name").regex(pattern));
  52.         // 查询的记录数
  53.         Long count = mongoTemplate.count(query, User.class);
  54.         System.out.println("count = " + count);
  55.         // 分页查询
  56.         List<User> users = mongoTemplate.find(query.skip((current-1)*limit).limit(limit), User.class);
  57.         System.out.println("users = " + users);
  58.     }
  59.     /** 修改 */
  60.     @Test
  61.     public void updateUser() {
  62.         User u = mongoTemplate.findById("ds98h98sdhds6gt7u", User.class);
  63.         u.setName("hello");
  64.         u.setAge(20);
  65.         Query query = new Query(Criteria.where("_id").is(u.getId()));
  66.         Update update = new Update();
  67.         update.set("name", u.getName());
  68.         update.set("age", u.getAge());
  69.         UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
  70.         long modifiedCount = upsert.getModifiedCount();  // 影响的行数
  71.         System.out.println("modifiedCount = " + modifiedCount);
  72.     }
  73.     /** 删除 */
  74.     @Test
  75.     public void deleteUser() {
  76.         Query query = new Query(Criteria.where("_id").is("ds98h98sdhds6gt7u"));
  77.         DeleteResult remove = mongoTemplate.remove(query, User.class);
  78.         long deletedCount = remove.getDeletedCount();  // 影响的行数
  79.         System.out.println("deletedCount = " + deletedCount);
  80.     }
  81. }
复制代码

  • 相比于MongoTemplate,MongoRepository实现CRUD操作,还需要创建一个继承MongoRepository接口的接口,如
  1. @Repository
  2. public interface UserRepository extends MongoRepository<User, String> {}
复制代码

  • 测试MongoRepository访问MongoDB(CRUD)
  1. @SpringBootTest
  2. public class MongoDBTest {
  3.     @Autowired
  4.     private UserRepository userRepository;
  5.     /** 新增 */
  6.     @Test
  7.     public void insert() {
  8.         User user = new User();
  9.         user.setName("xiansen");
  10.         user.setAge(18);
  11.         User u = userRepository.save(user);
  12.         System.out.println("user = " + u);
  13.     }
  14.     /** 查询所有记录 */
  15.     @Test
  16.     public void findAll() {
  17.         List<User> all = userRepository.findAll();
  18.         System.out.println("all = " + all);
  19.     }
  20.     /** ID查询 */
  21.     @Test
  22.     public void findById() {
  23.         User u = userRepository.findById("rge8vcuxdfsfdfsdf").get();
  24.         System.out.println("u = " + u);
  25.     }
  26.     /** 条件查询 */
  27.     @Test
  28.     public void findUserList() {
  29.         User user = new User();
  30.         user.setName("xiansen");
  31.         user.setAge(18);
  32.         Example<User> userExample = Example.of(user);
  33.         List<User> users = userRepository.findAll(userExample);
  34.         System.out.println("users = " + users);
  35.     }
  36.     /** 模糊查询 */
  37.     @Test
  38.     public void findUserListByLike() {
  39.         User user = new User();
  40.         user.setName("xian");
  41.         user.setAge(18);
  42.         ExampleMatcher matcher = ExampleMatcher.matching()
  43.                 .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)    // 表示模糊查询
  44.                 .withIgnoreCase(true);   // 忽略大小写
  45.         Example<User> userExample = Example.of(user, matcher);
  46.         List<User> users = userRepository.findAll(userExample);
  47.         System.out.println("users = " + users);
  48.     }
  49.     /** 分页查询 */
  50.     @Test
  51.     public void findPageUserList() {
  52.         // 分页设置参数
  53.         Pageable pageable = PageRequest.of(0, 3);// 0表示第一页
  54.         User user = new User();
  55.         user.setName("xiansen");
  56.         user.setAge(18);
  57.         Example<User> userExample = Example.of(user);
  58.         Page<User> page = userRepository.findAll(userExample, pageable);
  59.         System.out.println("page = " + page);
  60.     }
  61.     /** 修改 */
  62.     @Test
  63.     public void updateUser() {
  64.         User u = userRepository.findById("ds98h98sdhds6gt7u").get();
  65.         u.setName("hello");
  66.         u.setAge(20);
  67.         User user = userRepository.save(u);
  68.         System.out.println("user = " + user);
  69.     }
  70.     /** 删除 */
  71.     @Test
  72.     public void deleteUser() {
  73.         userRepository.deleteById("ds98h98sdhds6gt7u");
  74.     }
  75. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表