SpringBootWebFlux学习笔记(四)--整合 MongoDB

需求

对城市(City)进行管理实现 CRUD 操作。

项目结构

├── pom.xml
├── src
│    └── main
│        ├── java
│        │     └── org
│        │         └── spring
│        │             └── springboot
│        │                 ├── Application.java
│        │                 ├── dao
│        │                 │    └── CityRepository.java
│        │                 ├── domain
│        │                 │    └── City.java
│        │                 ├── handler
│        │                 │    └── CityHandler.java
│        │                 └── webflux
│        │                     └── controller
│        │                         └── CityWebFluxController.java
│        └── resources
│            └── application.properties
└── target

项目详情

新增依赖

在 pom.xml 配置新的依赖:

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-webflux</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>io.projectreactor</groupId>
		<artifactId>reactor-test</artifactId>
		<scope>test</scope>
	</dependency>
	<!--新增依赖:Spring Boot 响应式 MongoDB 依赖-->
	<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
    </dependency>
</dependencies>

配置 application.yaml

在 application.yaml 配置 MongoDB 连接配置

spring:  
  application:  
    name: web-flux-demo  
  data:  
    mongodb:  
      host: localhost  
      database: test-db  
      authentication-database: admin  
      auto-index-creation: true  
      port: 27017  
      username: mongo  
      password: mongo

对象

/**
 * 城市实体类
 *
 */
public class City {

    /**
     * 城市编号
     */
    private Long id;

    /**
     * 省份编号
     */
    private Long provinceId;

    /**
     * 城市名称
     */
    private String cityName;
    /**
     * 描述
     */
    private String description;

	// Getter and Setter
}

MongoDB 数据访问层

@Repository
public interface CityRepository extends ReactiveMongoRepository<City, Long> {

}

CityRepository 接口只要继承 ReactiveMongoRepository 类即可,默认会提供很多实现,比如 CRUD 和列表查询参数相关的实现。

处理器类

编写城市处理器类 CityHandler。代码如下:

@Component
public class CityHandler {

    private final CityRepository cityRepository;

    @Autowired
    public CityHandler(CityRepository cityRepository) {
        this.cityRepository = cityRepository;
    }

    public Mono<City> save(City city) {
        return cityRepository.save(city);
    }

    public Mono<City> findCityById(Long id) {

        return cityRepository.findById(id);
    }

    public Flux<City> findAllCity() {

        return cityRepository.findAll();
    }

    public Mono<City> modifyCity(City city) {

        return cityRepository.save(city);
    }

    public Mono<Long> deleteCity(Long id) {
        cityRepository.deleteById(id);
        return Mono.create(cityMonoSink -> cityMonoSink.success(id));
    }
}

控制器类

@RestController
@RequestMapping(value = "/city")
public class CityWebFluxController {

    @Autowired
    private CityHandler cityHandler;

    @GetMapping(value = "/{id}")
    public Mono<City> findCityById(@PathVariable("id") Long id) {
        return cityHandler.findCityById(id);
    }

    @GetMapping()
    public Flux<City> findAllCity() {
        return cityHandler.findAllCity();
    }

    @PostMapping()
    public Mono<City> saveCity(@RequestBody City city) {
        return cityHandler.save(city);
    }

    @PutMapping()
    public Mono<City> modifyCity(@RequestBody City city) {
        return cityHandler.modifyCity(city);
    }

    @DeleteMapping(value = "/{id}")
    public Mono<Long> deleteCity(@PathVariable("id") Long id) {
        return cityHandler.deleteCity(id);
    }
}

启动运行项目

mvn clean install
mvn springboot:run

测试项目

新增城市信息:

POST http://127.0.0.1:8080/city
{
    "id" :1,
    "provinceId":3,
    "cityName":"温岭"
}


获取城市信息列表:

GET http://127.0.0.1:8080/city
#output
{
    "id": 1,
    "provinceId": 3,
    "cityName": "温岭"
}

在 mongodb 验证数据是否新增成功。

db.city.find().pretty();
#output
{
  _id: 1,
  provinceId: 3,
  cityName: '温岭',
  _class: 'com.example.web_flux_demo.City'
}
posted @ 2024-10-25 21:16  Jacob-Chen  阅读(21)  评论(0)    收藏  举报