zoukankan      html  css  js  c++  java
  • 让Mongo在Spring中跑起来

    本文标题为《让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:

     1 package com.mongo.domain;
     2 
     3 import lombok.Data;
     4 import lombok.ToString;
     5 import org.springframework.data.annotation.Id;
     6 import org.springframework.data.mongodb.core.mapping.Document;
     7 import org.springframework.data.mongodb.core.mapping.Field;
     8 
     9 import java.io.Serializable;
    10 
    11 /**
    12  * @author OKevin
    13  * @description: MongoDB实体映射类
    14  * @date 2019-01-06 12:10
    15  */
    16 @Data
    17 @ToString
    18 //以上两个注解使用的是lombok,可减少代码中getter/setter代码
    19 @Document(collection = "user") 
    20 public class User implements Serializable {
    21 
    22     private static final long serialVersionUID = 5094995541812833015L;
    23     /**
    24      * 主键使用此注解
    25      */
    26     @Id
    27     private String id;
    28 
    29     /**
    30      * 字段使用此注解
    31      */
    32     @Field
    33     private String name;
    34 }
      User实体类对应MongoDB数据库中的collection集合。
      接下来就是操作MongoDB数据库中user集合的一些增删改查具体逻辑,很简单只需要在类中注入MongoTemplate类即可。
     1 package com.mongo.dao;
     2 
     3 import com.mongo.domain.User;
     4 import org.springframework.beans.factory.annotation.Autowired;
     5 import org.springframework.data.mongodb.core.MongoTemplate;
     6 import org.springframework.data.mongodb.core.query.Criteria;
     7 import org.springframework.data.mongodb.core.query.Query;
     8 import org.springframework.data.mongodb.core.query.Update;
     9 import org.springframework.stereotype.Component;
    10 
    11 import java.util.List;
    12 
    13 /**
    14  * @author OKevin
    15  * @description: 数据层操作类
    16  * @date 2019-01-06 19:52
    17  */
    18 @Component
    19 public class UserDao {
    20 
    21     @Autowired
    22     private MongoTemplate mongoTemplate;
    23 
    24     /**
    25      * 保存用户
    26      * @param user 返回保存的用户
    27      */
    28     public void saveUser(User user) {
    29         mongoTemplate.save(user);
    30     }
    31 
    32     /**
    33      * 根据名字查询用户
    34      * @param name 名字
    35      * @return 用户
    36      */
    37     public List<User> findUserByName(String name) {
    38         Query query = new Query(Criteria.where("name").is(name));
    39         List<User> users = mongoTemplate.find(query, User.class);
    40         return users;
    41     }
    42 
    43     /**
    44      * 更新用户
    45      * @param user 待更新的用户
    46      */
    47     public void updateUser(User user) {
    48         Query query = new Query(Criteria.where("id").is(user.getId()));
    49         Update update = new Update().set("name", user.getName());
    50         mongoTemplate.updateFirst(query, update, User.class);
    51     }
    52 
    53     /**
    54      * 根据MongoDB的_id删除用户
    55      * @param Id _id
    56      */
    57     public void deleteUserById(String Id) {
    58         Query query = new Query(Criteria.where("id").is(Id));
    59         mongoTemplate.remove(query, User.class);
    60     }
    61 }
      最后是单元测试的代码:
     1 package com.mongo;
     2 
     3 import com.mongo.dao.UserDao;
     4 import com.mongo.domain.User;
     5 import org.junit.Test;
     6 import org.junit.runner.RunWith;
     7 import org.springframework.beans.factory.annotation.Autowired;
     8 import org.springframework.boot.test.context.SpringBootTest;
     9 import org.springframework.context.annotation.ComponentScan;
    10 import org.springframework.test.context.ContextConfiguration;
    11 import org.springframework.test.context.junit4.SpringRunner;
    12 
    13 import java.util.List;
    14 
    15 @RunWith(SpringRunner.class)
    16 @SpringBootTest
    17 public class SpringDataMongoDemoApplicationTests {
    18 
    19     @Autowired
    20     private UserDao userDao;
    21 
    22     @Test
    23     public void contextLoads() {
    24     }
    25 
    26     @Test
    27     public void testSaveUser() {
    28         User user = new User();
    29         user.setName("test");
    30         userDao.saveUser(user);
    31     }
    32 
    33     @Test
    34     public void testFindUserByName() {
    35         String name = "test";
    36         List<User> users = userDao.findUserByName(name);
    37         System.out.println(users);
    38     }
    39 
    40     @Test
    41     public void testUpdateUser() {
    42         String id = "5c31f93f91ffb269a774b860";
    43         User user = new User();
    44         user.setId(id);
    45         user.setName("test2");
    46         userDao.updateUser(user);
    47     }
    48 
    49     @Test
    50     public void testDeleteUserById() {
    51         String id = "5c31f93f91ffb269a774b860";
    52         userDao.deleteUserById(id);
    53     }
    54 }
      执行单元测试运行正常,回到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的公众号 

  • 相关阅读:
    phpstudy apache 服务无法启动
    Nginx+keepalived实现负载均衡高可用配置
    Linux系统下zookeeper客户端命令使用
    JVM探究之 —— 类文件结构(脑图)
    JVM探究之 —— 类加载器-双亲委派模型
    Centos7 配置静态IP并使用xshell远程连接
    JVM探究之 —— 类加载过程
    JVM探究之 —— 垃圾回收(二)
    避免git clone和push时每次都需要输入用户名和密码
    jsch配置sftp服务器ssh免密登录
  • 原文地址:https://www.cnblogs.com/yulinfeng/p/10230832.html
Copyright © 2011-2022 走看看