实战
前言
在昨日整理的是一些只是在mongodb内部实现的操作,但是想要实现在外部,那就要想在后台以接口的方式给到前台,今天简单的做一些整合操作
ResultFul风格
ResultFul是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
就是为了不同的前端和后端进行信息交互,Resultful API是一种比较流行的一种API规范。结构清晰符合标准,易于理解、扩展方便,便于前端开发者进行区分访问接口资源。
我在之前的几篇文章中都有使用到过,在不同的操作下可使用如下
名称 | 作用 |
---|---|
GET | 获取资源,一般用于查询操作 |
POST | 创建资源,一般用于添加操作 |
PUT | 更新资源,一般用于修改操作 |
DELETE | 删除资源,一般用于删除资源 |
添加依赖
Swagger2
因为我比较喜欢使用Swagger做测试,所以我在Maven中引入了这个依赖,在之前我有写过一篇如何使用Swagger的文章,可以参考,链接我也直接放至如下
Swagger参考链接: https://blog.youkuaiyun.com/UncleFujii/article/details/112935134
<!--Swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.4.0</version>
</dependency>
mongodb
<!--mongodb-->
<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>
结构
因为只是一个测试,所以结构上没做正式开发这么规范,结构如下
配置文件(properties)
server.port=8080
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.database=testdb
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
实体层
用于放一些实体属性,对应的则是Mongodb内的字段
/**
* @Author uncletj
* @Date 2021/4/13 17:15
* @Version SpringBoot 2.2.2
* @projectName
*/
public class User {
private String id; //id
private String name; //名称
private String gender; //性别
private int age; //年龄
private String hobby; //兴趣爱好
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
}
配置层
这个层次用来放Swageer的配置类,源码如下
import com.google.common.collect.Sets;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @Author uncletj
* @Date 2021-04-14 11:38
* @Version SpringBoot 2.2.2
* @projectName
*/
@Configuration//配置类
@EnableSwagger2//开启Swagger2的自动配置
public class SwaggerConfig {
@Bean
public Docket createRestApi(){
return new Docket(DocumentationType.SWAGGER_2)
//协议,http或https
.protocols(Sets.newHashSet("http"))
.apiInfo(apiInfo())
.select()
//controller扫描路径
.apis(RequestHandlerSelectors.basePackage("com.mongodb.demo.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("测试接口文档")
.version("1.0")
.description("测试接口")
.build();
}
}
业务层(Service)
这个用来实现一下业务操作,我就直接没去自己创建一些接口来实现了,而是直接写了一下方式做实现,具体如下:
import com.mongodb.client.result.UpdateResult;
import com.mongodb.demo.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
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.Service;
import java.util.List;
/**
* @Author uncletj
* @Date 2021/4/14 10:07
* @Version SpringBoot 2.2.2
* @projectName
*/
@Service
public class UserService {
@Autowired
private MongoOperations mongoOperations;
/**
* insert存在则不做处理,不存在则插入
* @param user
*/
public void insert(User user){
mongoOperations.insert(user);
}
/**
* 根据userid删除文档
* @param id
*/
public void remove(String id){
Query query = new Query();
query.addCriteria(Criteria.where("id").is(id));
mongoOperations.remove(query,User.class);
}
/**
* 根据id更新文档
* @param user
* @return
*/
public UpdateResult update(User user){
Query query = new Query();
query.addCriteria(Criteria.where("id").is(user.getId()));
Update update = new Update();
update.set("name",user.getName());
update.set("age",user.getAge());
update.set("gender",user.getGender());
update.set("hobby",user.getHobby());
//只修改第一个数据
return mongoOperations.updateFirst(query, update,User.class);
}
/**
* 查询所有
* @return
*/
public List<User>getByList(){
return mongoOperations.findAll(User.class);
}
/**
* 单条件查询,find查询所有
* @param id
* @return
*/
public List<User> findByUid(String id){
Query query = new Query();
query.addCriteria(Criteria.where("id").is(id));
return mongoOperations.find(query,User.class);
}
}
控制层(Controller)
这个层次用于实现业务操作,并给出api接口让外部进行一系列操作,具体实现如下
import com.mongodb.demo.pojo.User;
import com.mongodb.demo.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @Author uncletj
* @Date 2021/4/13 17:18
* @Version SpringBoot 2.2.2
* @projectName
*/
@RestController
@RequestMapping("/user")
@Api(description = "测试接口")
public class UserController {
@Autowired
private UserService userService;
/**
* 添加用户
* @param user
* @return
*/
@PostMapping("save")
@ApiOperation(value = "添加用户")
public String save(@RequestBody User user) {
userService.insert(user);
return "SSUCCESS";
}
/**
* 根据id删除用户
* @param id
* @return
*/
@DeleteMapping("delete")
@ApiOperation(value = "根据id删除用户")
@ApiImplicitParam(name = "id",value = "id",dataType = "String",paramType = "query")
public String deleteByuserid(String id) {
userService.remove(id);
return "SSUCCESS";
}
/**
* 获取所有数据
* @return
*/
@GetMapping("/list")
public List<User> getByList(){
return userService.getByList();
}
/**
* 单条件查询
* @param id
* @return
*/
@GetMapping("findById")
@ApiOperation(value = "单条件查询")
@ApiImplicitParam(name = "id",value = "id",dataType = "String",paramType = "query")
public List<User> findByuserid(String id) {
return userService.findByUid(id);
}
/**
* 根据id更新文档
* @param user
* @return
*/
@PutMapping("update")
@ApiOperation(value = "根据id更新文档")
public String updateByusserid(@RequestBody User user) {
userService.update(user);
return "SSUCCESS";
}
}
测试
具体实现上面的代码已能够实现一些简单操作,下面在进行一轮测试展示
list
获取所有数据信息
add
创建数据信息
findById
根据Id查询单条数据信息,既然刚刚添加了一条信息,那么就根据id看是否能把刚刚这条信息查询出来
update
修改一般是根据id去修改一条数据信息,刚刚添加的数据也是已经被查询出来了,那试试能不能把这条数据修改一遍
修改完之后在去查询一下所有的数据,看修改的数据是否成功
刚刚修改了这两个属性的信息,说明更新成功