本文标题为《让Mongo在Spring中跑起来》,旨在Spring中如何成功连接MongoDB并对其进行增删改查等操作,由于笔者也是刚接触,对其中的一些原由也不甚了解,若有错误之处,敬请指正。

  习惯了MySQL在Spring中整合时填写各种各样的连接参数,本来只想做一件简单的数据库插入查询而已,翻遍整个互联网通篇都是复制粘贴抄袭的配置,连接数的多少,超时时间的多少等等。

  SprintBoot的出现,秉持**约定大于配置**的目标,可以使你免去许多配置的烦脑,“约定”即是大多数人都这么做,你这么做估计也没问题,反正就是能跑起来,你要用高级特性也可以也支持自定义配置。所以本文采用SpringBoot力求达到零XML配置。
  不得不说,Spring如今已经成为Java EE事实上的标准,可以说Spring出品必属精品,其中与数据库打交道的部分,Spring也替我们做好了封装,本文操作MongoDB的API不需要自己再在mongo-driver的基础上再封装一层,而是直接使用Spring提供的spring-data-mongo模块,这个模块加上SpringBoot的结合,淋漓尽致地展现了什么叫做“约定大于配置”。
  为了便于注入Bean,我们在maven中引入了以下两个包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
  SprintBoot的版本号为2.0.2.RELEASE。
  为了验证是否能对MongoDB进行操作,我们还需要再引入Spring的单元测试包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

  起初我想着,这应该需要配置MongoDB的地址、用户名、密码什么的吧,所以我起初写了一个配置类,企图使用@Configuration的方式来配置MongoDB连接,后来发现,引入了spring-data-mongo在我们启动SpringBoot时,已经为我们创建好了一个默认的MongoDB连接,不需要我们再去重复的配置(当然如果需要更高级的自定义配置也是可以自己配置的),只需要按照格式即可在启动完成SpringBoot时,自动创建MongoDB连接。

  在application.properties中配置以下:
spring.data.mongodb.uri=mongodb://okevin:123456@localhost:27017/recommended
  即可通过SpringBoot自动为我们创建MongoDB连接,在代码中直接引用MongoTemplate类。

  我们先通过MongoDB可视化管理Robo 3T连入对应的数据库,并在数据库中新创建一个MongoDB集合“user”,在代码中需要我们创建一个与之对应的Java实体类User:

 package com.mongo.domain;

 import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field; import java.io.Serializable; /**
* @author OKevin
* @description: MongoDB实体映射类
* @date 2019-01-06 12:10
*/
@Data
@ToString
//以上两个注解使用的是lombok,可减少代码中getter/setter代码
@Document(collection = "user")
public class User implements Serializable { private static final long serialVersionUID = 5094995541812833015L;
/**
* 主键使用此注解
*/
@Id
private String id; /**
* 字段使用此注解
*/
@Field
private String name;
}
  User实体类对应MongoDB数据库中的collection集合。
  接下来就是操作MongoDB数据库中user集合的一些增删改查具体逻辑,很简单只需要在类中注入MongoTemplate类即可。
 package com.mongo.dao;

 import com.mongo.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component; import java.util.List; /**
* @author OKevin
* @description: 数据层操作类
* @date 2019-01-06 19:52
*/
@Component
public class UserDao { @Autowired
private MongoTemplate mongoTemplate; /**
* 保存用户
* @param user 返回保存的用户
*/
public void saveUser(User user) {
mongoTemplate.save(user);
} /**
* 根据名字查询用户
* @param name 名字
* @return 用户
*/
public List<User> findUserByName(String name) {
Query query = new Query(Criteria.where("name").is(name));
List<User> users = mongoTemplate.find(query, User.class);
return users;
} /**
* 更新用户
* @param user 待更新的用户
*/
public void updateUser(User user) {
Query query = new Query(Criteria.where("id").is(user.getId()));
Update update = new Update().set("name", user.getName());
mongoTemplate.updateFirst(query, update, User.class);
} /**
* 根据MongoDB的_id删除用户
* @param Id _id
*/
public void deleteUserById(String Id) {
Query query = new Query(Criteria.where("id").is(Id));
mongoTemplate.remove(query, User.class);
}
}
  最后是单元测试的代码:
 package com.mongo;

 import com.mongo.dao.UserDao;
import com.mongo.domain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner; import java.util.List; @RunWith(SpringRunner.class)
@SpringBootTest
public class SpringDataMongoDemoApplicationTests { @Autowired
private UserDao userDao; @Test
public void contextLoads() {
} @Test
public void testSaveUser() {
User user = new User();
user.setName("test");
userDao.saveUser(user);
} @Test
public void testFindUserByName() {
String name = "test";
List<User> users = userDao.findUserByName(name);
System.out.println(users);
} @Test
public void testUpdateUser() {
String id = "5c31f93f91ffb269a774b860";
User user = new User();
user.setId(id);
user.setName("test2");
userDao.updateUser(user);
} @Test
public void testDeleteUserById() {
String id = "5c31f93f91ffb269a774b860";
userDao.deleteUserById(id);
}
}
  执行单元测试运行正常,回到Robo 3T也发现执行成功。

  由此可见对于基本的一些操作,大可不必在Spring中配置一些MongoDB的连接,只需要一句配置提供地址、用户名、密码即可,软件开发在学习特别是在初学的过程,让一切先跑起来再说。

  本文涉及到的完整代码已上传至GitHub:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/%E8%AE%A9Mongo%E5%9C%A8Spring%E4%B8%AD%E8%B7%91%E8%B5%B7%E6%9D%A5/spring-data-mongo-demo

这是一个能给程序员加buff的公众号 

让Mongo在Spring中跑起来的更多相关文章

  1. spring中使用mockito

    1 mockito介绍和入门 官方:https://github.com/mockito/mockito 入门: 5分钟了解Mockito http://liuzhijun.iteye.com/blo ...

  2. Spring中给Bean注入集合

    Spring中如果一个Bean里含有集合元素,需要给Bean里的集合元素注入元素时,可以采用如下方法,一个是构造器注入,一个是setter注入 JavaBean源代码: import java.uti ...

  3. 使用Spring中的PropertyPlaceholderConfigurer读取文件

    目录 一. 简介 二. XML 方式 三. Java 编码方式 一. 简介 大型项目中,我们往往会对我们的系统的配置信息进行统一管理,一般做法是将配置信息配置与一个cfg.properties 的文件 ...

  4. Spring中重要的注解

    现在大部分的Spring项目都会用到注解.使用注解来替换xml,一行简单的注解就可以解决很多事情.但是你真的懂其中的原理吗. 本文翻译于 https://docs.spring.io/spring-f ...

  5. 一文教会你如何在 Spring 中进行集成测试,太赞了

    不得不说,测试真的是太重要了!但并不是所有的开发者都这样认为,这种感觉在我回到洛阳后尤其强烈.竟然有团队成员不经测试就把代码提交到代码库,并且是会报错的那种,我天呐,遇到这种队友我也是醉了. 我之前是 ...

  6. 简说Spring中的资源加载

    声明: 本文若有 任何纰漏.错误,请不吝指正!谢谢! 问题描述 遇到一个关于资源加载的问题,因此简单的记录一下,对Spring资源加载也做一个记录. 问题起因是使用了@PropertySource来进 ...

  7. 一起来踩踩 Spring 中这个循环依赖的坑

    1. 前言 2. 典型场景 3. 什么是依赖 4. 什么是依赖调解 5. 为什么要依赖注入 6. Spring的依赖注入模型 7. 非典型问题 参考资料 1. 前言 这两天工作遇到了一个挺有意思的Sp ...

  8. Velocity初探小结--Velocity在spring中的配置和使用

    最近正在做的项目前端使用了Velocity进行View层的数据渲染,之前没有接触过,草草过了一遍,就上手开始写,现在又回头细致的看了一遍,做个笔记. velocity是一种基于java的模板引擎技术, ...

  9. Spring中Bean的作用域、生命周期

                                   Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...

随机推荐

  1. barrel_shift

    barrel_shift的目的就是在一个bus中根据idx动态选择一部分数据输出如: *dw-:]; -:];// 0~132 *dw-:]; 上面就要求从256的数据单元中选择124个数据单元输出, ...

  2. Object-C 编程问题汇总

    Object-C 编程问题汇总 Cocopods 安装时遇见的问题: error: RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, ...

  3. JavaSSM框架面试

    一.Spring面试题 1.Spring 在ssm中起什么作用? Spring:轻量级框架 作用:Bean工厂,用来管理Bean的生命周期和框架集成. 两大核心: 1.IOC/DI(控制反转/依赖注入 ...

  4. The algorithm learning of sort which include Bubblesort,Insertsort,Quicksort and Mergesort.

    Notice : these algorithms achieved by Java. So,let's going to it. firstly, what is Bubblesort? why w ...

  5. MySQL 使用自增ID主键和UUID 作为主键的优劣比较详细过程(从百万到千万表记录测试)

    测试缘由 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说mysql不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了拿 ...

  6. Linux下源码安装并配置Nginx

    实验环境 一台最小化安装的CentOS 7.3 虚拟机 安装nginx 安装nginx依赖包 yum install -y pcre-devel zlib-devel openssl-devel wg ...

  7. data自定义属性获取方法和设置

    <!--原生获取方法--> <div data-id="id=1"></div> <script> //js原生获取方法 var i ...

  8. [Swift]LeetCode412. Fizz Buzz

    Write a program that outputs the string representation of numbers from 1 to n. But for multiples of ...

  9. [Swift]LeetCode572. 另一个树的子树 | Subtree of Another Tree

    Given two non-empty binary trees s and t, check whether tree t has exactly the same structure and no ...

  10. Python——day12 nonlcoal关键字、装饰器(开放封闭原则、函数被装饰、最终写法)

    一.nonlocal关键字 1.作用:将L与E(E中的名字需要提前定义)的名字统一 2.应用场景:如果想在被嵌套的函数中修改外部函数变量(名字)的值 def outer(): num=10 print ...