MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它可以存储多种数据结构,类似json的bson,可以存储复杂数据类型。

它最大的特点就是支持的查询语言非常强大,其语法类似面向对象的方式,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

  在传统关系型数据库一般由:数据库(database),表(table),数据记录(record)三个概念层次组成,而MongoDB是由 数据库(database),集合(collection),文档对象(document)三个层级组成。

MongoDB中集合对应了关系型数据库中的表,但是集合中没有列、行、约束关系的概念,体现了它模式自由的特点,存储数据结构的自由。MongDB中存储的一条记录就是一个文档,是一个数据结构(类似ElasticSearch),

由字段和值组成。MongoDB文档与JSON对象类似。字段的值有可能包括其它文档、数组以及文档数组。

  MongoDB适合对大量或者无固定格式的数据进行存储,比如:日志、缓存、文本数据等,对事务的支持比较弱,不适合多文档(多表)级联查询。

下面介绍一下MongoDB的增删改查:

  Spring Boot对各种流行的数据源都进行了封装,当然也包括了mongodb,下面给大家介绍如何在spring boot中使用mongodb:

1、pom包配置

引入spring-boot-starter-data-mongodb包

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  5. </dependency>
  6. </dependencies>

2、在application.properties中添加配置

  1. spring.data.mongodb.uri=mongodb://user:pass@localhost:27017/test
  1. 若是本地连接:spring.data.mongodb.uri=mongodb://localhost:27017/test

多个IP集群可以采用以下配置:

  1. spring.data.mongodb.uri=mongodb://user:pwd@ip1:port1,ip2:port2/database

2、创建数据实体

  1. public class UserEntity implements Serializable {
  2. private static final long serialVersionUID = -3258839839160856613L;
  3. private Long id;
  4. private String userName;
  5. private String passWord;
  6.  
  7. //getter、setter省略
  8. }

3、创建实体dao的增删改查操作

dao层实现了UserEntity对象的增删改查

  1. @Component
  2. public class UserDaoImpl implements UserDao {
  3.  
  4. @Autowired
  5. private MongoTemplate mongoTemplate;
  6.  
  7. /**
  8. * 创建对象
  9. * @param user
  10. */
  11. @Override
  12. public void saveUser(UserEntity user) {
  13. mongoTemplate.save(user);
  14. }
  15.  
  16. /**
  17. * 根据用户名查询对象
  18. * @param userName
  19. * @return
  20. */
  21. @Override
  22. public UserEntity findUserByUserName(String userName) {
  23. Query query=new Query(Criteria.where("userName").is(userName));
  24. UserEntity user = mongoTemplate.findOne(query , UserEntity.class);
  25. return user;
  26. }
  27.  
  28. /**
  29. * 更新对象
  30. * @param user
  31. */
  32. @Override
  33. public void updateUser(UserEntity user) {
  34. Query query=new Query(Criteria.where("id").is(user.getId()));
  35. Update update= new Update().set("userName", user.getUserName()).set("passWord", user.getPassWord());
  36. //更新查询返回结果集的第一条
  37. mongoTemplate.updateFirst(query,update,UserEntity.class);
  38. //更新查询返回结果集的所有
  39. // mongoTemplate.updateMulti(query,update,UserEntity.class);
  40. }
  41.  
  42. /**
  43. * 删除对象
  44. * @param id
  45. */
  46. @Override
  47. public void deleteUserById(Long id) {
  48. Query query=new Query(Criteria.where("id").is(id));
  49. mongoTemplate.remove(query,UserEntity.class);
  50. }
  51. }

4、对应的测试方法

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class UserDaoTest {
  4.  
  5. @Autowired
  6. private UserDao userDao;
  7.  
  8. @Test
  9. public void testSaveUser() throws Exception {
  10. UserEntity user=new UserEntity();
  11. user.setId(2l);
  12. user.setUserName("小明");
  13. user.setPassWord("fffooo123");
  14. userDao.saveUser(user);
  15. }
  16.  
  17. @Test
  18. public void findUserByUserName(){
  19. UserEntity user= userDao.findUserByUserName("小明");
  20. System.out.println("user is "+user);
  21. }
  22.  
  23. @Test
  24. public void updateUser(){
  25. UserEntity user=new UserEntity();
  26. user.setId(2l);
  27. user.setUserName("天空");
  28. user.setPassWord("fffxxxx");
  29. userDao.updateUser(user);
  30. }
  31.  
  32. @Test
  33. public void deleteUserById(){
  34. userDao.deleteUserById(1l);
  35. }
  36.  
  37. }

5、查验结果

可以使用工具mongoVUE工具来连接后直接图形化展示查看,也可以登录服务器用命令来查看

1.登录mongos

bin/mongo -host localhost -port 20000

2、切换到test库

use test

3、查询userEntity集合数据

db.userEntity.find()

根据3查询的结果来观察测试用例的执行是否正确。

到此springboot对应mongodb的增删改查功能已经全部实现。

多数据源mongodb的使用

在多mongodb数据源的情况下,我们换种更优雅的方式来实现

1、pom包配置

添加lombok和spring-boot-autoconfigure包引用

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.projectlombok</groupId>
  7. <artifactId>lombok</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-autoconfigure</artifactId>
  12. <version>RELEASE</version>
  13. </dependency>
  • Lombok - 是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。简单试了以下这个工具还挺好玩的,加上注解我们就不用手动写 getter\setter、构建方式类似的代码了。

  • spring-boot-autoconfigure - 就是spring boot的自动化配置

2、配置文件使用YAML的形式添加两条数据源,如下:

  1. mongodb:
  2. primary:
  3. host: 192.168.9.60
  4. port: 20000
  5. database: test
  6. secondary:
  7. host: 192.168.9.60
  8. port: 20000
  9. database: test1

3、配置两个库的数据源

封装读取以mongodb开头的两个配置文件

  1. @Data
  2. @ConfigurationProperties(prefix = "mongodb")
  3. public class MultipleMongoProperties {
  4.  
  5. private MongoProperties primary = new MongoProperties();
  6. private MongoProperties secondary = new MongoProperties();
  7. }

配置不同包路径下使用不同的数据源

第一个库的封装

  1. @Configuration
  2. @EnableMongoRepositories(basePackages = "com.neo.model.repository.primary",
  3. mongoTemplateRef = PrimaryMongoConfig.MONGO_TEMPLATE)
  4. public class PrimaryMongoConfig {
  5.  
  6. protected static final String MONGO_TEMPLATE = "primaryMongoTemplate";
  7. }

第二个库的封装

  1. @Configuration
  2. @EnableMongoRepositories(basePackages = "com.neo.model.repository.secondary",
  3. mongoTemplateRef = SecondaryMongoConfig.MONGO_TEMPLATE)
  4. public class SecondaryMongoConfig {
  5.  
  6. protected static final String MONGO_TEMPLATE = "secondaryMongoTemplate";
  7. }

读取对应的配置信息并且构造对应的MongoTemplate

  1. @Configuration
  2. public class MultipleMongoConfig {
  3.  
  4. @Autowired
  5. private MultipleMongoProperties mongoProperties;
  6.  
  7. @Primary
  8. @Bean(name = PrimaryMongoConfig.MONGO_TEMPLATE)
  9. public MongoTemplate primaryMongoTemplate() throws Exception {
  10. return new MongoTemplate(primaryFactory(this.mongoProperties.getPrimary()));
  11. }
  12.  
  13. @Bean
  14. @Qualifier(SecondaryMongoConfig.MONGO_TEMPLATE)
  15. public MongoTemplate secondaryMongoTemplate() throws Exception {
  16. return new MongoTemplate(secondaryFactory(this.mongoProperties.getSecondary()));
  17. }
  18.  
  19. @Bean
  20. @Primary
  21. public MongoDbFactory primaryFactory(MongoProperties mongo) throws Exception {
  22. return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
  23. mongo.getDatabase());
  24. }
  25.  
  26. @Bean
  27. public MongoDbFactory secondaryFactory(MongoProperties mongo) throws Exception {
  28. return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
  29. mongo.getDatabase());
  30. }
  31. }

至此,两个库的配置信息已经完成。

4、创建两个库分别对应的对象和Repository

借助lombok来构建对象

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. @Document(collection = "first_mongo")
  5. public class PrimaryMongoObject {
  6.  
  7. @Id
  8. private String id;
  9.  
  10. private String value;
  11.  
  12. @Override
  13. public String toString() {
  14. return "PrimaryMongoObject{" + "id='" + id + '\'' + ", value='" + value + '\''
  15. + '}';
  16. }
  17. }

对应的Repository

  1. public interface PrimaryRepository extends MongoRepository<PrimaryMongoObject, String> {
  2. }

继承了 MongoRepository 会默认实现很多基本的增删改查,省了很多自己写dao层的代码

5、最后测试

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class MuliDatabaseTest {
  4.  
  5. @Autowired
  6. private PrimaryRepository primaryRepository;
  7.  
  8. @Autowired
  9. private SecondaryRepository secondaryRepository;
  10.  
  11. @Test
  12. public void TestSave() {
  13.  
  14. System.out.println("************************************************************");
  15. System.out.println("测试开始");
  16. System.out.println("************************************************************");
  17.  
  18. this.primaryRepository
  19. .save(new PrimaryMongoObject(null, "第一个库的对象"));
  20.  
  21. this.secondaryRepository
  22. .save(new SecondaryMongoObject(null, "第二个库的对象"));
  23.  
  24. List<PrimaryMongoObject> primaries = this.primaryRepository.findAll();
  25. for (PrimaryMongoObject primary : primaries) {
  26. System.out.println(primary.toString());
  27. }
  28.  
  29. List<SecondaryMongoObject> secondaries = this.secondaryRepository.findAll();
  30.  
  31. for (SecondaryMongoObject secondary : secondaries) {
  32. System.out.println(secondary.toString());
  33. }
  34.  
  35. System.out.println("************************************************************");
  36. System.out.println("测试完成");
  37. System.out.println("************************************************************");
  38. }
  39.  
  40. }

码云地址:https://gitee.com/ityouknow/spring-boot-examples

本文转载自:http://www.ityouknow.com/

SpringBoot结合MongoDB入门的更多相关文章

  1. SpringBoot+SpringData 整合入门

    SpringData概述 SpringData :Spring的一个子项目.用于简化数据库访问,支持NoSQL和关系数据存储.其主要目标是使用数据库的访问变得方便快捷. SpringData 项目所支 ...

  2. 非关系型数据库MongoDB入门

    本文分为以下四块简单介绍非关系型数据库MongoDB:1.MongoDB简介.2.MongoDB和关系数据库对比.3.MongoDB基本概念.4.mongo shell的使用以及对MongoDB的增删 ...

  3. MongoDB 入门之基础 DCL

    此文章主要记录部分主要的 MongoDB 的 DCL 操作. MongoDB 默认不需要用户名和密码就可以用 mongodb.exe 登录 一.开启 MonogoDB 的权限模式 修改 MongoDB ...

  4. MongoDB入门三:MongoDB shell

    MongoDB shell MongDB shell是一个功能完备的Javascript解释器,可以运行Javascript程序.也可以用于连接MongoDB服务器,执行脚本,对数据库进行操作.类似于 ...

  5. MongoDB 入门之查询(find)

    MongoDB 入门之查询(find) 1. find 简介 (1)find的第一个参数决定了要返回哪些文档. 空的查询文档会匹配集合的全部内容.默认就是{}.结果将批量返回集合c中的所有文档. db ...

  6. MongoDB入门简介

    MongoDB入门简介 http://blog.csdn.net/lolinzhang/article/details/4353699 有关于MongoDB的资料现在较少,且大多为英文网站,以上内容大 ...

  7. mongodb入门教程二

    title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...

  8. mongodb入门教程

    title: mongodb入门教程 date: 2016-04-06 14:47:18 tags: --- 为什么要认识呢,因为这玩意就一傻逼 借用一下百科的介绍 MongoDB 是一个介于关系数据 ...

  9. MongoDb 入门教程

    MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的高性能数据存储解决方案,经常被用于非关系型数据的存储,能存储海量的数据. 常 ...

随机推荐

  1. POJ 3093 Margaritas on the River Walk(背包)

    题意 n个有体积的物品,问选取一些物品,且不能再继续选有多少方法? n<=1000 题解 以前的考试题.当时是A了,但发现是数据水,POJ上WA了. 把体积从小到大排序枚举没选的物品中体积最小的 ...

  2. apache源码编译安装

    源码安装apche 下载apache的源码包文件 访问http://mirror.bit.edu.cn/apache/httpd/,复制如下gz文件的链接地址,并使用wget下载到本地 wget -P ...

  3. Java 二进制,八进制,十进制,十六进制转换

    A.十进制转换其他 十进制转成二进制  Integer.toBinaryString(int i) 十进制转成八进制  Integer.toOctalString(int i) 十进制转成十六进制:  ...

  4. Qt之QTimer

    简述 QTimer类提供了重复和单次触发信号的定时器. QTimer类为定时器提供了一个高级别的编程接口.很容易使用:首先,创建一个QTimer,连接timeout()信号到适当的槽函数,并调用sta ...

  5. hdoj Let the Balloon Rise

     /*Let the Balloon Rise Problem Description Contest time again! How excited it is to see balloons ...

  6. 怎样实如今Windows下编写的代码,直接在Linux下编译

    方法一: 怎样实如今Windows7下编写Linux程序.写完程序以后.不用复制文件,直接在Linux(RHEL6.5)机器上编译最新的代码. 1.首先将Windows的代码目录设置为共享目录: 2. ...

  7. Struts2中Struts.xml的作用

    struts.xml 为Struts 2的核心配置文件.struts.xml文件主要负责管理应用中的Action映射,以及该Action包含的Result定义等.struts.xml中主要配置Stru ...

  8. rest_framework-权限-总结完结篇

    #权限#创建一个权限类 在view添加列表 class MyPermission(object): #message 表示权限决绝时返回的数据 message = "必须是SVIP" ...

  9. 继承—Monkey

    public class Monkey { public void Monkey(String s){ } public void speak(){ System.out.println(" ...

  10. asp.net 项目发布注意点

    在修改了某些代码后,要发布到服务器 这时候 ,在本地发布完把对应的文件复制到服务器上覆盖即可. 1.如果修改的是.cs  .asmx等文件,则需要覆盖其对应项目名称的.dll文件 2.如果修改的是.h ...