SpringBoot整合MongoDB

  • 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支持跟中编程语言:RUBYPYTHONJAVAC++PHPC#
    • 安装简单
  • MongoDB语法:略
  • SpringBoot整合MongoDB
    • 集成简介:spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB;MongoTemplate操作灵活,MongoRepository操作简单,不够灵活
    • 添加相关依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> <version>2.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.2.1.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency>
  • 添加配置
spring.data.mongodb.uri=mongodb://Your IP:27017/your database
  • 创建与集合对应的实体类
@Data @Document("User") // 表示操作的是your database下的User集合 public class User { @Id private String id; private String name; private Integer age; }
  • 测试MongoTemplate访问MongoDB(CRUD)
@SpringBootTest public class MongoDBTest { @Autowired private MongoTemplate mongoTemplate; /** 新增 */ @Test public void insert() { User user = new User(); user.setName("xiansen"); user.setAge(18); User u = mongoTemplate.insert(user); System.out.println("user = " + u); } /** 查询所有记录 */ @Test public void findAll() { List<User> all = mongoTemplate.findAll(User.class); System.out.println("all = " + all); } /** ID查询 */ @Test public void findById() { User u = mongoTemplate.findById("rge8vcuxdfsfdfsdf", User.class); System.out.println("u = " + u); } /** 条件查询 */ @Test public void findUserList() { Query query = new Query(Criteria.where("name").is("xiansen").and("age").is(18)); List<User> users = mongoTemplate.find(query, User.class); System.out.println("users = " + users); } /** 模糊查询 */ @Test public void findUserListByLike() { String name = "xian"; 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> users = mongoTemplate.find(query, User.class); System.out.println("users = " + users); } /** 分页查询 */ @Test public void findPageUserList() { int current = 1; int limit = 3; String name = "xian"; 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)); // 查询的记录数 Long count = mongoTemplate.count(query, User.class); System.out.println("count = " + count); // 分页查询 List<User> users = mongoTemplate.find(query.skip((current-1)*limit).limit(limit), User.class); System.out.println("users = " + users); } /** 修改 */ @Test public void updateUser() { User u = mongoTemplate.findById("ds98h98sdhds6gt7u", User.class); u.setName("hello"); u.setAge(20); Query query = new Query(Criteria.where("_id").is(u.getId())); Update update = new Update(); update.set("name", u.getName()); update.set("age", u.getAge()); UpdateResult upsert = mongoTemplate.upsert(query, update, User.class); long modifiedCount = upsert.getModifiedCount(); // 影响的行数 System.out.println("modifiedCount = " + modifiedCount); } /** 删除 */ @Test public void deleteUser() { Query query = new Query(Criteria.where("_id").is("ds98h98sdhds6gt7u")); DeleteResult remove = mongoTemplate.remove(query, User.class); long deletedCount = remove.getDeletedCount(); // 影响的行数 System.out.println("deletedCount = " + deletedCount); } }
  • 相比于MongoTemplate,MongoRepository实现CRUD操作,还需要创建一个继承MongoRepository接口的接口,如
@Repository public interface UserRepository extends MongoRepository<User, String> {}
  • 测试MongoRepository访问MongoDB(CRUD)
@SpringBootTest public class MongoDBTest { @Autowired private UserRepository userRepository; /** 新增 */ @Test public void insert() { User user = new User(); user.setName("xiansen"); user.setAge(18); User u = userRepository.save(user); System.out.println("user = " + u); } /** 查询所有记录 */ @Test public void findAll() { List<User> all = userRepository.findAll(); System.out.println("all = " + all); } /** ID查询 */ @Test public void findById() { User u = userRepository.findById("rge8vcuxdfsfdfsdf").get(); System.out.println("u = " + u); } /** 条件查询 */ @Test public void findUserList() { User user = new User(); user.setName("xiansen"); user.setAge(18); Example<User> userExample = Example.of(user); List<User> users = userRepository.findAll(userExample); System.out.println("users = " + users); } /** 模糊查询 */ @Test public void findUserListByLike() { User user = new User(); user.setName("xian"); user.setAge(18); ExampleMatcher matcher = ExampleMatcher.matching() .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) // 表示模糊查询 .withIgnoreCase(true); // 忽略大小写 Example<User> userExample = Example.of(user, matcher); List<User> users = userRepository.findAll(userExample); System.out.println("users = " + users); } /** 分页查询 */ @Test public void findPageUserList() { // 分页设置参数 Pageable pageable = PageRequest.of(0, 3);// 0表示第一页 User user = new User(); user.setName("xiansen"); user.setAge(18); Example<User> userExample = Example.of(user); Page<User> page = userRepository.findAll(userExample, pageable); System.out.println("page = " + page); } /** 修改 */ @Test public void updateUser() { User u = userRepository.findById("ds98h98sdhds6gt7u").get(); u.setName("hello"); u.setAge(20); User user = userRepository.save(u); System.out.println("user = " + user); } /** 删除 */ @Test public void deleteUser() { userRepository.deleteById("ds98h98sdhds6gt7u"); } }

__EOF__

本文作者xsha_h
本文链接https://www.cnblogs.com/aitiknowledge/p/16529180.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   xsha_h  阅读(1144)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示