1.简介

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

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

2.运行环境

开发工具:intellij idea

JDK版本:1.8

项目管理工具:Maven 4.0.0

3.Maven Plugin管理

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6.  
  7. <groupId>com.goku</groupId>
  8. <artifactId>spring-boot-mongodb</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10.  
  11. <parent>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-parent</artifactId>
  14. <version>1.5.6.RELEASE</version>
  15. </parent>
  16.  
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-web</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-test</artifactId>
  25. <scope>test</scope>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-devtools</artifactId>
  30. <optional>true</optional>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-data-mongodb</artifactId>
  35. </dependency>
  36. </dependencies>
  37.  
  38. <build>
  39. <plugins>
  40. <plugin>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-maven-plugin</artifactId>
  43. <configuration>
  44. <fork>true</fork>
  45. </configuration>
  46. </plugin>
  47. </plugins>
  48. </build>
  49.  
  50. </project>

4.application.properties编写

  1. spring.data.mongodb.uri= mongodb://localhost:27017/goku_db1

5.DemoApplication启动类编写

  1. package com.goku.demo;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.boot.web.servlet.ServletComponentScan;
  6.  
  7. /**
  8. * Created by nbfujx on 2017/11/20.
  9. */
  10. // Spring Boot 应用的标识
  11. @SpringBootApplication
  12. @ServletComponentScan
  13. public class DemoApplication {
  14.  
  15. public static void main(String[] args) {
  16. // 程序启动入口
  17. // 启动嵌入式的 Tomcat 并初始化 Spring 环境及其各 Spring 组件
  18. SpringApplication.run(DemoApplication.class,args);
  19. }
  20. }

6.User编写

  1. package com.goku.demo.model;
  2.  
  3. import org.springframework.data.annotation.Id;
  4.  
  5. import java.io.Serializable;
  6.  
  7. /**
  8. * Created by nbfujx on 2017-12-07.
  9. */
  10. public class User implements Serializable {
  11.  
  12. private static final long serialVersionUID = -1L;
  13.  
  14. @Id
  15. private Long id;
  16. private String username;
  17. private Integer age;
  18.  
  19. public User(Long id, String username, Integer age) {
  20. this.id = id;
  21. this.username = username;
  22. this.age = age;
  23. }
  24.  
  25. public Long getId() {
  26. return id;
  27. }
  28.  
  29. public void setId(Long id) {
  30. this.id = id;
  31. }
  32.  
  33. public String getUsername() {
  34. return username;
  35. }
  36.  
  37. public void setUsername(String username) {
  38. this.username = username;
  39. }
  40.  
  41. public Integer getAge() {
  42. return age;
  43. }
  44.  
  45. public void setAge(Integer age) {
  46. this.age = age;
  47. }
  48.  
  49. @Override
  50. public String toString()
  51. {
  52. return "\"User:{\"id\":\""+id+"\",\"username\":\""+username+"\",\"age\":\""+age+"\"}\"";
  53. }
  54. }

7.UserRepository编写

与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个对象的增删改查,要使用Repository的功能,先继承MongoRepository<T, TD>接口,其中T为仓库保存的bean类,TD为该bean的唯一标识的类型,一般为ObjectId。之后在service中注入该接口就可以使用,无需实现里面的方法,spring会根据定义的规则自动生成。

但是MongoRepository实现了的只是最基本的增删改查的功能,要想增加额外的查询方法,可以按照以下规则定义接口的方法。自定义查询方法,格式为“findBy+字段名+方法后缀”,方法传进的参数即字段的值,此外还支持分页查询,通过传进一个Pageable对象,返回Page集合。

下面是支持的查询类型,每三条数据分别对应:(方法后缀,方法例子,mongodb原生查询语句)

  1. package com.goku.demo.repository;
  2.  
  3. import com.goku.demo.model.User;
  4. import org.springframework.data.domain.Page;
  5. import org.springframework.data.domain.Pageable;
  6. import org.springframework.data.mongodb.repository.MongoRepository;
  7. import org.springframework.data.mongodb.repository.Query;
  8.  
  9. import java.util.List;
  10.  
  11. /**
  12. * Created by nbfujx on 2017-12-08.
  13. */
  14. public interface UserRepository extends MongoRepository<User, Long> {
  15.  
  16. /**
  17. * Like(模糊查询)
  18. * {"username" : name} ( name as regex)
  19. * */
  20. List<User> findByUsernameLike(String username);
  21.  
  22. /**
  23. * Like(模糊查询)
  24. * {"username" : name}
  25. * */
  26. List<User> findByUsername(String username);
  27.  
  28. /**
  29. * GreaterThan(大于)
  30. * {"age" : {"$gt" : age}}
  31. * */
  32. List<User> findByAgeGreaterThan(int age);
  33. /**
  34. * LessThan(小于)
  35. * {"age" : {"$lt" : age}}
  36. * */
  37. List<User> findByAgeLessThan(int age);
  38. /**
  39. * Between(在...之间)
  40. * {{"age" : {"$gt" : from, "$lt" : to}}
  41. * */
  42. List<User> findByAgeBetween(int from, int to);
  43.  
  44. /**
  45. * IsNotNull, NotNull(是否非空)
  46. * {"username" : {"$ne" : null}}
  47. * */
  48. List<User> findByUsernameNotNull();
  49.  
  50. /**
  51. * IsNull, Null(是否为空)
  52. * {"username" : null}
  53. * */
  54. List<User> findByUsernameNull();
  55.  
  56. /**
  57. * Not(不包含)
  58. * {"username" : {"$ne" : name}}
  59. * */
  60. List<User> findByUsernameNot(String name);
  61.  
  62. /**
  63. * Near(查询地理位置相近的)
  64. * {"location" : {"$near" : [x,y]}}
  65. * */
  66. // findByLocationNear(Point point)
  67.  
  68. /**
  69. * Within(在地理位置范围内的)
  70. * {"location" : {"$within" : {"$center" : [ [x, y], distance]}}}
  71. * */
  72. //findByLocationWithin(Circle circle)
  73.  
  74. /**
  75. * Within(在地理位置范围内的)
  76. * {"location" : {"$within" : {"$box" : [ [x1, y1], x2, y2]}}}
  77. * */
  78. // findByLocationWithin(Box box)
  79.  
  80. }

尽管以上查询功能已经很丰富,但如果还不能满足使用情况的话可以用一下方法---基于mongodb原本查询语句的查询方式。

  1. @Query("{\"username\":{\"$regex\":?0}, \"age\": ?1}")
  2. Page<User> findByNameAndAgeRange(String name,int age,Pageable page);
  3.  
  4. @Query(value="{\"username\":{\"$regex\":?0},\"age\":{\"$gte\":?1,\"$lte\": ?2}}")
  5. Page<User> findByNameAndAgeRange2(String name,int ageFrom,int ageTo,Pageable page);
  6.  
  7. @Query(value="{\"username\":{\"$regex\":?0},\"age\":{\"$gte\":?1,\"$lte\": ?2}}",fields="{\"username\" : 1, \"age\" : 1}")
  8. Page<User> findByNameAndAgeRange3(String name,int ageFrom,int ageTo,Pageable page);

8.UserRepositoryTest测试编写

  1. package test.com.goku.repository;
  2.  
  3. import com.goku.demo.DemoApplication;
  4. import com.goku.demo.model.User;
  5. import com.goku.demo.repository.UserRepository;
  6. import org.junit.Assert;
  7. import org.junit.Before;
  8. import org.junit.Test;
  9. import org.junit.runner.RunWith;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.boot.test.context.SpringBootTest;
  14. import org.springframework.data.domain.Page;
  15. import org.springframework.data.domain.PageRequest;
  16. import org.springframework.data.domain.Pageable;
  17. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  18.  
  19. import java.util.List;
  20.  
  21. /**
  22. * Created by nbfujx on 2017-12-08.
  23. */
  24. @RunWith(SpringJUnit4ClassRunner.class)
  25. @SpringBootTest(classes = DemoApplication.class)
  26. public class UserRepositoryTest {
  27.  
  28. private final Logger logger = LoggerFactory.getLogger(getClass());
  29.  
  30. @Autowired
  31. private UserRepository userRepository;
  32.  
  33. @Before
  34. public void setUp() {
  35. //userRepository.deleteAll();
  36. }
  37.  
  38. @Test
  39. public void test() throws Exception {
  40.  
  41. // 创建10个User,并验证User总数
  42. userRepository.save(new User(1L, "didi", 30));
  43. userRepository.save(new User(2L, "mama", 40));
  44. userRepository.save(new User(3L, "kaka", 50));
  45. userRepository.save(new User(4L, "didi2", 30));
  46. userRepository.save(new User(5L, "mama", 40));
  47. userRepository.save(new User(6L, "kaka2", 50));
  48. userRepository.save(new User(7L, "kaka", 50));
  49. userRepository.save(new User(8L, "kao", 50));
  50. userRepository.save(new User(9L, "ekakae", 50));
  51. userRepository.save(new User(10L, "kaka5", 50));
  52. userRepository.save(new User(11L, "", 50));
  53. userRepository.save(new User(12L, null, 50));
  54. this.logger.info(String.valueOf(userRepository.findAll().size()));
  55.  
  56. // 删除一个User,再验证User总数
  57. /*User u = userRepository.findOne(1L);
  58. this.logger.info(u.toString());
  59. userRepository.delete(u);
  60. this.logger.info(String.valueOf(userRepository.findAll().size()));
  61.  
  62. // 删除一个User,再验证User总数
  63. u = userRepository.findByUsername("mama").get(0);
  64. this.logger.info(u.toString());
  65. userRepository.delete(u);
  66. this.logger.info(String.valueOf(userRepository.findAll().size()));*/
  67.  
  68. }
  69.  
  70. @Test
  71. public void test2() throws Exception {
  72.  
  73. // 删除一个User,再验证User总数
  74. List<User> u1 = userRepository.findByUsernameLike("kaka");
  75. this.logger.info(u1.toString());
  76. List<User> u2 = userRepository.findByUsername("mama");
  77. this.logger.info(u2.toString());
  78. List<User> u3 = userRepository.findByAgeGreaterThan(40);
  79. this.logger.info(u3.toString());
  80. List<User> u4 = userRepository.findByAgeLessThan(40);
  81. this.logger.info(u4.toString());
  82. List<User> u5 = userRepository.findByAgeBetween(30,45);
  83. this.logger.info(u5.toString());
  84. List<User> u6 = userRepository.findByUsernameNotNull();
  85. this.logger.info(u6.toString());
  86. List<User> u7 = userRepository.findByUsernameNull();
  87. this.logger.info(u7.toString());
  88. List<User> u8 = userRepository.findByUsernameNot("kaka");
  89. this.logger.info(u8.toString());
  90.  
  91. }
  92.  
  93. @Test
  94. public void test3() throws Exception {
  95.  
  96. Pageable pageable = new PageRequest(0,10);
  97. Page<User> u1 = userRepository.findByNameAndAgeRange("kaka",50,pageable);
  98. this.logger.info(u1.toString());
  99. Page<User> u2 = userRepository.findByNameAndAgeRange2("kaka",0,50,pageable);
  100. this.logger.info(u2.toString());
  101. Page<User> u3 = userRepository.findByNameAndAgeRange3("kaka",0,50,pageable);
  102. this.logger.info(u3.toString());
  103.  
  104. }
  105. }

9.GITHUB地址

https://github.com/nbfujx/springBoot-learn-demo/tree/master/spring-boot-mongodb

spring-boot整合mongodb的案例的更多相关文章

  1. Spring boot整合Mongodb

    最近的项目用了Mongodb,网上的用法大多都是七零八落的没有一个统一性,自己大概整理了下,项目中的相关配置就不叙述了,由于spring boot的快捷开发方式,所以spring boot项目中要使用 ...

  2. spring boot 整合MongoDB

    参考     https://www.cnblogs.com/nbfujx/p/7999171.html

  3. spring boot整合quartz定时任务案例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...

  4. spring MVC 整合mongodb

    Spring Mongodb 目录 1 SPRING整合MONGODB 1 1.1 环境准备 1 1.2 包依赖 1 1.3 配置 2 2 案列 5 2.1 SPRING MVC整合MONGODB代码 ...

  5. Spring Kafka和Spring Boot整合实现消息发送与消费简单案例

    本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 先前我已经分享了Kafka的基本介绍与集群环境搭建方法.关于Kafka的 ...

  6. Spring Kafka整合Spring Boot创建生产者客户端案例

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 创建一个kafka-producer-master的maven工程.整个项目结构如下: ...

  7. Spring Boot 2.x 基础案例:整合Dubbo 2.7.3+Nacos1.1.3(配置中心)

    本文原创首发于公众号:Java技术干货 1.概述 本文将Nacos作为配置中心,实现配置外部化,动态更新.这样做的优点:不需要重启应用,便可以动态更新应用里的配置信息.在如今流行的微服务应用下,将应用 ...

  8. Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 预见未来最好的方式就是亲手创造未来 – <史蒂夫·乔布斯传> 』 运行环境: ...

  9. (转)Spring Boot (十四): Spring Boot 整合 Shiro-登录认证和权限管理

    http://www.ityouknow.com/springboot/2017/06/26/spring-boot-shiro.html 这篇文章我们来学习如何使用 Spring Boot 集成 A ...

  10. Spring Boot(十四):spring boot整合shiro-登录认证和权限管理

    Spring Boot(十四):spring boot整合shiro-登录认证和权限管理 使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉 ...

随机推荐

  1. windows下使用pycharm开发基于ansible api的python程序

    Window下python安装ansible,基于ansible api开发python程序 在windows下使用pycharm开发基于ansible api的python程序时,发现ansible ...

  2. jenkins持续集成、插件以及凭据

    Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. Jenkins功能包括: ...

  3. SEC5 - MySQL 查询语句--------------进阶1:基础查询

    # 进阶1:基础查询 /* 语法: select 查询列表 from 表名: 特点: 1.查询列表可以是:表中的字段.常量值.表达式.表达式.函数 2.查询的结果是一个虚拟的表格 如何执行:执行谁,请 ...

  4. 应用安全-Web安全-漏洞修复方案整理

    通过HTTP头部字段防御措施整理 X-Frame-Options #反劫持 X-XSS-Protection #开启浏览器防XSS功能 Set X-Frame-Options  CSP X-Conte ...

  5. JS中设置input的type="radio"默认选中

    html: <input id="Radio1" type="radio" value="男" name="st_Sex&q ...

  6. Linux-第二篇常用命令

    1.常用目录文件操作命令 cd:切换目录 格式:cd 目录 ls:显示文件和目录列表.可选参数: -l 列出文件的详细信息 -a 列出当前目录所有文件,包含隐藏文件 ll:查看目录接口,相当于是ls ...

  7. Struts2之动态方法调用

    1.感叹号 前台页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...

  8. LOJ 2234/BZOJ 3629 聪明的燕姿(数论+DFS)

    题面 传送门 分析 看到约数之和,我们首先想到约数和公式 若$ x=\prod_{i=1}^{n}p_i^{k_i} \(,则x的约数和为\) \prod_{i=1}^{n} \sum_{j=0}^{ ...

  9. python学习第十四天字典的del(),pop().popitem(),clear()删除方法

    字典的每个键值 key=>value 数据类型,字典的key是唯一的,Value可以一样 names={'玖乐公司网址':‘www.96net.com.cn’,"电池网":' ...

  10. 微信小程序(14)--上传图片公用组件(父子传参)

    这周整理了一下做微信小程序页面时遇到的一些问题,先说说常见的上传图片吧. 上传图片公用组件 首先要了解的是父子传参. 1.A组件为父组件,B组件为子组件,以下是A组件向B组件传参: 在A组件的json ...