优秀的编程知识分享平台

网站首页 > 技术文章 正文

Java,SpringBoot,WebFlux,增、删、改、查(CRUD),代码案例

nanyue 2024-08-20 17:33:18 技术文章 5 ℃

WebFlux

WebFlux是Spring推出响应式编程的一部分(web端),响应式编程是异步非阻塞的,一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式。

参考:WebFlux,基于Reactive Streams响应式编程

代码案例

pom.xml

<!-- 统一版本配置 -->
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <spring-boot.version>2.3.9.RELEASE</spring-boot.version>
</properties>

<!-- 声明SpringBoot依赖版本 -->
<dependencyManagement>
    <dependencies>
        <!--spring-boot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

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

controller类:

package com.what21.demo.controller;

import com.what21.demo.handler.IUserHandler;
import com.what21.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
@RequestMapping(value = "/user")
public class UserController {

    @Autowired
    private IUserHandler userHandler;

    @GetMapping()
    public Flux<User> findAllUser() {
        return userHandler.findUsers();
    }

    @GetMapping(value = "/{id}")
    public Mono<User> findUserById(@PathVariable("id") Long id) {
        return userHandler.findUserById(id);
    }

    @PostMapping()
    public Mono<Long> saveUser(@RequestBody User city) {
        return userHandler.saveUser(city);
    }

    @PutMapping()
    public Mono<Long> modifyUser(@RequestBody User city) {
        return userHandler.modifyUser(city);
    }

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

}

model类:

package com.what21.demo.model;

import lombok.Data;

@Data
public class User {

    // ID
    private Long id;

    // 登录名
    private String username;

    // 姓名
    private String name;

    // 描述
    private String description;

}

handler

package com.what21.demo.handler;

import com.what21.demo.model.User;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public interface IUserHandler {

    // 查找所有
    Flux<User> findUsers();

    // 查找单个
    Mono<User> findUserById(Long id);

    // 保存操作
    Mono<Long> saveUser(User city);

    // 修改操作
    Mono<Long> modifyUser(User city);

    // 删除操作
    Mono<Long> deleteUser(Long id);

}
package com.what21.demo.handler;

import com.what21.demo.model.User;
import com.what21.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@Component
public class UserHandlerImpl implements IUserHandler {

    private final UserRepository cityRepository;

    @Autowired
    public UserHandlerImpl(UserRepository cityRepository) {
        this.cityRepository = cityRepository;
    }

    @Override
    public Flux<User> findUsers() {
        return Flux.fromIterable(cityRepository.findSubjects());
    }

    public Mono<User> findUserById(Long id) {
        return Mono.justOrEmpty(cityRepository.findSubjectById(id));
    }

    public Mono<Long> saveUser(User city) {
        return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.saveSubject(city)));
    }

    public Mono<Long> modifyUser(User city) {
        return Mono.create(cityMonoSink -> cityMonoSink.success(cityRepository.updateSubject(city)));
    }

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

}

repository

package com.what21.demo.repository;

import com.what21.demo.model.User;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;

@Repository("userRepository")
public class UserRepository {

    private ConcurrentMap<Long, User> repositoryMap = new ConcurrentHashMap<>();

    private static final AtomicLong idGenerator = new AtomicLong(0);

    public UserRepository() {
        User user1 = new User();
        user1.setId(new Date().getTime());
        user1.setUsername("zhangsan");
        user1.setName("张三");
        user1.setDescription("路人甲");
        this.repositoryMap.put(user1.getId(), user1);
        User user2 = new User();
        user2.setId(new Date().getTime());
        user2.setUsername("lisi");
        user2.setName("李四");
        user2.setDescription("路人乙");
        this.repositoryMap.put(user2.getId(), user2);
    }

    public Collection<User> findSubjects() {
        return repositoryMap.values();
    }

    public User findSubjectById(Long id) {
        return repositoryMap.get(id);
    }

    public Long saveSubject(User city) {
        Long id = idGenerator.incrementAndGet();
        city.setId(id);
        repositoryMap.put(id, city);
        return id;
    }

    public Long updateSubject(User city) {
        repositoryMap.put(city.getId(), city);
        return city.getId();
    }

    public Long deleteSubject(Long id) {
        repositoryMap.remove(id);
        return id;
    }

}

启动类:

package com.what21.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

配置

server:
  port: 9999

访问:

http://192.168.3.50:9999/user

Tags:

最近发表
标签列表