今天我们来分享一下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 的一些相关知识了
希望我们都在进步中~~
(^_^)~喵~!!
来源:oschina
链接:https://my.oschina.net/u/4232197/blog/4314921