学习MongoDB(三)

社会主义新天地 提交于 2020-08-07 16:34:03

    今天我们来分享一下MongDB 整合SpringData 篇,小伙伴们准备好了吗?

一 . 环境搭建

   1. 创建项目

        1)创建maven项目

            

      2) 确定项目坐标(组、标识、版本)

      3)确定项目的位置

    4)项目不存在,创建项目

2. 配置项目

   1)  配置父项目

   因为小喵使用的是Spring Could ,因此需要导入一下坐标


    <!--1 确定spring boot的版本-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
    </parent>

    <!--2  确定版本-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <spring-cloud-release.version>Greenwich.RELEASE</spring-cloud-release.version>
    </properties>

    <!-- 3 锁定sprig cloud版本-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud-release.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- 4 确定spring cloud私有仓库-->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    然后,再依次创建Eureka注册中心、Zuul网关项目以及我们的Eureka客户端项目以及commonxiGlobalCorsConfig.java,因为需要和MongoDB数据库相连因此我们的客户端项目需要导入MongoDB的一些相关坐标.

 2) Eureka注册中心

---- pom.xml 文件中
 <dependencies>
        <!--web起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Eureka服务端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

--- application.yml 文件
#端口号
server:
  port: 10086
#服务名
spring:
  application:
    name: studenteureka
#注册地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka
    register-with-eureka: false #关闭注册自己
    fetch-registry: false       #关闭拉取列表

    创建SpringBoot 启动器

这样 Eureka注册中心就创建完成了,下面是我们的Zuul网关

   3) Zuul网关

--- pom.xml 文件中

    <dependencies>
        <!--网关依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <!--添加eureka客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>




--- application.yml 文件中

#端口号
server:
  port: 10010
#服务名
spring:
  application:
    name: studentzuul
#网关前缀
zuul:
  prefix: /api
#注册地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka

    创建SpringBoot启动类

同时因为是前后端分离开发,所以需要在我们的网关处使用跨域配置文件来完成跨域访问!

GlobalCorsConfig.java

package com.czxy.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;


/**  全局跨域配置类
 * Created by liangtong.
 */
@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1.添加CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        config.addAllowedOrigin("*");
        //是否发送Cookie信息
        config.setAllowCredentials(true);
        //放行哪些原始域(请求方式)
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("HEAD");
        config.addAllowedMethod("GET");     //get
        config.addAllowedMethod("PUT");     //put
        config.addAllowedMethod("POST");    //post
        config.addAllowedMethod("DELETE");  //delete
        config.addAllowedMethod("PATCH");
        config.addAllowedHeader("*");

        //2.添加映射路径
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);

        //3.返回新的CorsFilter.
        return new CorsFilter(configSource);
    }

}

    4) common 项目 

---pom.xml文件中

dependencies>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

      BaseResult :  封装返回结果的工具类

package com.czxy.vo;

import lombok.Getter;

import java.util.HashMap;
import java.util.Map;

/**
 * 返回结果实体类
 * 格式:
 {
 "code": 1,
 "message": "登录成功",
 "data": { }
 }
 }
 * Created by liangtong.
 */
@Getter
public class BaseResult<T> {

    //成功状态码
    public static final int OK = 1;
    //失败状态码
    public static final int ERROR = 0;

    //返回码
    private Integer code;
    //返回消息
    private String message;

    //存放数据
    private T data;
    //其他数据
    private Map<String,Object> other = new HashMap<>();

    public BaseResult() {

    }

    public BaseResult(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
    public BaseResult(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 快捷成功BaseResult对象
     * @param message
     * @return
     */
    public static BaseResult ok(String message){
        return new BaseResult(BaseResult.OK , message);
    }

    public static BaseResult ok(String message, Object data){
        return new BaseResult(BaseResult.OK , message, data );
    }

    /**
     * 快捷失败BaseResult对象
     * @param message
     * @return
     */
    public static BaseResult error(String message){
        return new BaseResult(BaseResult.ERROR , message);
    }

    /**
     * 自定义数据区域
     * @param key
     * @param msg
     * @return
     */
    public BaseResult append(String key , Object msg){
        other.put(key , msg);
        return this;
    }
}

    5) web 服务

--- pom.xml文件中

    <dependencies>
        <!--web起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Eureka客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>


        <!--测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!--mongodb  java
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.4.3</version>
        </dependency>-->
         
        <!-- mongoDb 整合 Spring data-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

        <!--common项目-->
        <dependency>
            <groupId>com.czxy</groupId>
            <artifactId>student_common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>


    </dependencies>


--- application.yml 文件中
#端口号
server:
  port: 9080
#服务名和数据源(连接池)
spring:
  application:
    name: studentweb
  data:
    mongodb:
      uri: mongodb://root:root@localhost:27017/demo
#注册地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:10086/eureka

            创建Spring Boot 启动类

   5. 1 ) JavaBean/POJO 的定义

  因为连接的是MongoDb数据库所以有些注解跟我么连接MySQL时是不一样的.

在MongDB中是这样的

  常见注解            描述                                             实例            
@Document   标注在实体类上,类似于MyBatis @Table                               
@Id

主键,不可重复,自带索引,可以在定义的列名上标注,需要自己生成并维护不重复的约束。

如果自己不设置@Id主键,mongo会自动生成一个唯一主键,并且插入时效率远高于自己设置主键。
 
@Field  代表一个字段,可以不加,不加的话默认以参数名为列名  
@Transeient  被该注解标注的,将不会被录入到数据库中  
@Indexed

声明该字段需要加索引,加索引后以该字段为条件检索将大大提高速度。

唯一索引的话是@Indexed(unique = true)

 

 

Student.java

package com.czxy.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

@Document(collection = "student2")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
        @Id
        private String id;

        @Field("name")
        private String name;

        @Field("password")
        private String password;

        @Field("age")
        private Integer age;

        @Field("edu")
        private  String edu;

        @Field("description")
        private String description;
        

}

    5.2) dao/Repository 的定义

Spring Data Mongodb提供一套快捷操作mongodb的方法。创建Dao,继承MongoRepository,并指定实体类型和主键类型。


注:id是MongDB自动生成的

  5.3) service 的定义

    Service的定义和我们平常定义的时候没有啥区别,需要在Service中注入Repository实例对象

    

    5.4) controller 的定义

        controller的定义和我们平常定义的时候也没有啥区别,需要在controller中注入Service实例对象

        如果是ResFul接口的话则需要使用 @RestController 注解

    


二 . 功能模块

    终于,要上我们的正题了,主菜要上桌了哦!

        二话不说,先上套增删改查尝尝鲜...

  1 ) 增

        --添加学生

    controller :

    /**
     * 添加学生
     * @param student
     * @return
     */
    @PostMapping("/addStudent")
    public BaseResult addStudent(@RequestBody Student student){
        //调用方法进行添加
        studentService.addStudent(student);

        //返回信息
        return BaseResult.ok("添加成功");
    }

    service :

    /**
     * 添加学生
     * @param student
     */
    public void addStudent(Student student) {
        //调用Repository进行添加操作
        studentRepository.insert(student);
    }

 2 ) 查

        --- 查询所有学生

 controller :

    /**
     * 查询所有学生信息
     * @return
     */
    @GetMapping("/findAll")
    public BaseResult findAll(){
        //调用方法进行查询
      List<Student> studentList = studentService.findAll();

        //返回结果
      return BaseResult.ok("查询成功",studentList);
    }

    service :

    /**
     * 查询所有学生
     * @return
     */
    public List<Student> findAll() {
            //调用Repository进行查询
        List<Student> studentList = studentRepository.findAll();
        return studentList;
    }

3) 改

    我们都知道,该分为两步分, 1. 先插询目标 2.再修改目标

    --- 查询目标

        获取到前端传递的唯一标识即 id  ,通过 id 查询指定目标,并返回

 controller :

    /**
     * 根据id查找学生
     * @return
     */
    @GetMapping("/findStudentById/{sid}")
    public BaseResult findStudentById(@PathVariable("sid")String sid){
        //调用方法进行id查询
        Student student =  studentService.findStudentById(sid);

        if (student!=null){
            //返回结果
            return BaseResult.ok("查询成功",student);
        }else {
            //返回结果
            return BaseResult.error("无法查询到该学生信息");
        }

    }

service :

    /**
     * 根据id查询学生
     * @param sid
     * @return
     */
    public Student findStudentById(String sid) {
            //调用Repository进行id查询操作
        Optional<Student> optional = studentRepository.findById(sid);
            //判断
        if (optional.isPresent()){
            //获取学生信息对象并返回
            Student student = optional.get();
            return student;
        }
        return null;
    }

    ---  更新/修改

         该步,也是我们常说的真正的修改,这里我们是根据 id 唯一标识 来进行修改

   controller:

    /**
     * 修改学生信息
     * @param student
     * @return
     */
    @PutMapping("/updateStudent")
    public BaseResult updateStudent(@RequestBody Student student){
        //调用方法进行修改
         studentService.updateStudent(student);

         //返回结果
        return BaseResult.ok("修改成功");
    }

 service:

   /**
     * 修改学生信息
     * @param student
     */
    public void updateStudent(Student student) {
            //调用Repository进行修改
         studentRepository.save(student);
    }

4) 删

    前端传递id,后台获取id 通过id进行删除

controller :

    /**
     * 删除学生
     * @param sid
     * @return
     */
    @DeleteMapping("/deleteStudent/{sid}")
    public BaseResult deleteStudent(@PathVariable("sid")String sid){
        //调用方法进行删除
        studentService.deleteStudent(sid);

        return BaseResult.ok("删除成功");
    }

service :

/**
 *删除学生
 * @param sid
 */
public void deleteStudent(String sid) {
    //调用Repository进行删除操作
    studentRepository.deleteById(sid);
}

5) 分页查询

    前端接收到分页信息,返回给后台,后台做出相应数据的返回

controller:

    /**
     * 查询所有学生信息(分页)
     * @return
     */
    @GetMapping("/findAllWithPage")
    public BaseResult findAllWithPage(Integer pageNum,Integer pageSize){

        //调用方法进行查询
        List<Student> studentList = studentService.findAllWithPage(pageNum, pageSize);
        //返回结果
        return BaseResult.ok("查询成功",studentList);
    }

   service :

    /**
     * 分页查询
     * @param pageNum
     * @param pageSize
     */
    public List<Student> findAllWithPage(Integer pageNum, Integer pageSize) {

            //调用Repository进行分页查询
        Page<Student> studentPage = studentRepository.findAll(PageRequest.of(pageNum, pageSize));

        // 处理分页数据
        // 1. 获取分页的内容
        List<Student> studentList = studentPage.getContent();
         // 返回查询结果
        return studentList;
    }

这就是小喵学习到的MongoDb整合Spring Data 的一些相关知识了

希望我们都在进步中~~

(^_^)~喵~!!

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!