springwebflux mysql_Spring WebFlux (1): r2dbc+mysql+springdoc 创建 RESTful api

随着响应式编程在网络编程中使用越发的普及,mysql等一系列的关系型数据库也在r2dbc等包的帮助下支持响应式。虽然响应式跟原来的sevlet的写法区别比较大,但是spring尽量保持原来的风格,编写control层和service层的方法跟原来基本相同,略有区别就是controller返回的Mono或是Flux。特别是对crud的支持,跟原来的jpa基本相同。

例子:

1、创建table

在mysql数据库中创建一个命名为mydb的数据库,然后创建一个命名为employee的表用于测试, 字段内容如下:

id

name: 员工姓名

age:员工年龄

salary:员工薪酬

CREATE DATABASE IF NOT EXISTS mydb;

USE mydb;

DROP TABLE IF EXISTS `employee`;

CREATE TABLE `employee` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`name` varchar(100) NOT NULL,

`age` int(11) NOT NULL,

`salary` bigint(20) NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `name` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

BEGIN;

INSERT INTO `employee` VALUES ('1', 'ffzs', '20', '110000'), ('2', 'dz', '30', '2000000');

COMMIT;

f696703e6cb6138b78290addd5d71644.png

2、创建spring项目

使用gradle维护项目,使用的支持:

dependencies {

implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'

implementation 'org.springframework.boot:spring-boot-starter-webflux'

compileOnly 'org.projectlombok:lombok'

runtimeOnly 'dev.miku:r2dbc-mysql'

runtimeOnly 'mysql:mysql-connector-java'

annotationProcessor 'org.projectlombok:lombok'

testImplementation('org.springframework.boot:spring-boot-starter-test') {

exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'

}

testImplementation 'io.projectreactor:reactor-test'

}

3、编写配置文件

主要配置mysql的链接,r2dbc链接的url跟jdbc的略有不同,需要注意

application.yml

spring:

r2dbc:

url: r2dbcs:mysql://localhost:3306/mydb?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8

username: root

password: 123zxc

4、编写model类

Employee.class

import lombok.*;

import org.springframework.data.annotation.Id;

import org.springframework.data.relational.core.mapping.Table;

@Data

@AllArgsConstructor

@NoArgsConstructor

@Builder

@With

@Table("employee")

public class Employee {

@Id

private long id;

private String name;

private long age;

private long salary;

}

5、 dao层编写

跟jpa使用基本相同,不过这里继承的事响应式的crud类ReactiveCrudRepository

public interface EmployeeDao extends ReactiveCrudRepository {

Flux findByName(String name);

}

6、service层编写

编写了常见的增删改查的功能

跟之前的不同之处是这里返回的值为Reactor的对象Flux或Mono

@Service

@RequiredArgsConstructor

public class EmployeeService {

private final EmployeeDao employeeDao;

public Flux findAll () {

return employeeDao.findAll();

}

public Mono findById (long id) {

return employeeDao.findById(id);

}

public Flux findByName (String name) {

return employeeDao.findByName(name);

}

public Mono save (Employee employee) {

return employeeDao.save(employee);

}

public Mono update (Employee employee) {

return findById(employee.getId())

.map(em -> employee.withId(em.getId()))

.flatMap(employeeDao::save)

.then();

}

public Mono delete (Employee employee) {

return employeeDao.delete(employee);

}

public Mono deleteById (long id) {

return employeeDao.deleteById(id);

}

}

7、controller层编写

应用RESTful api 特点,一个路由可以有get,post,put,delete四种功能

跟service层对应实现增删改查的功能

@RestController

@RequiredArgsConstructor

@RequestMapping("employee")

@Slf4j

public class EmployeeController {

private final EmployeeService employeeService;

@GetMapping

public Flux findAll() {

return employeeService.findAll();

}

@GetMapping (path = "{id}")

public Mono findById(@PathVariable("id") long id) {

return employeeService.findById(id);

}

@GetMapping ("find")

public Flux findByName(@RequestParam("name") String name) {

return employeeService.findByName(name);

}

@PostMapping

@ResponseStatus(HttpStatus.CREATED)

public Mono save(@RequestBody Employee employee) {

return employeeService.save(employee);

}

@PutMapping

@ResponseStatus(HttpStatus.NO_CONTENT)

public Mono update (@RequestBody Employee employee) {

return employeeService.update(employee);

}

@DeleteMapping

@ResponseStatus(HttpStatus.NO_CONTENT)

public Mono delete (@RequestBody Employee employee) {

return employeeService.delete(employee);

}

@DeleteMapping(path = "{id}")

@ResponseStatus(HttpStatus.NO_CONTENT)

public Mono deleteById (@PathVariable long id) {

return employeeService.deleteById(id);

}

}

8、测试

项目集成springdoc的openapi(可以理解为swagger)进行api接口测试,添加依赖:

implementation 'org.springdoc:springdoc-openapi-webflux-ui:1.4.1'

不用做任何修改直接运行项目即可, 成功启动:

056c7bcd1e2fa644e3f93dd5bc5a3b01.png

访问swagger测试页面 http://localhost:8080/swagger-ui.html,就会完成跳转到测试页面:

9c6d7e395f3b372d649dcd37cbff28ba.png

代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用r2dbc+mysql+springboot创建表需要以下步骤: 1. 配置MySQL连接信息,包括数据库名称、用户名、密码和MySQL的URL等。 2. 创建一个Java Bean,用于表示表中的字段和数据类型。例如,如果要创建一个名为person的表,可以在Java中创建一个名为Person的类,该类包含与表中字段对应的属性。 3. 创建一个Repository接口,用于定义插入、查询、更新和删除数据等操作。在接口中通过SQL语句进行定义,例如使用@Query注解定义插入数据的SQL语句。 4. 在Spring Boot应用程序启动时,使用Spring的自动化配置功能自动创建表。可以通过在应用程序的配置文件中添加spring.jpa.hibernate.ddl-auto属性来控制表的创建方式,例如可以将该属性设置为create或update等选项。 下面是一个简单的示例代码,用于创建一个名为person的表: 1. 在application.properties中添加MySQL数据库连接配置信息: ``` spring.r2dbc.url=r2dbc:mysql://localhost:3306/testdb spring.r2dbc.username=testuser spring.r2dbc.password=testpass ``` 2. 创建一个Person类,在其中定义表中的字段和数据类型: ```java @Data public class Person { private Long id; private String firstName; private String lastName; } ``` 3. 创建一个PersonRepository接口,在其中定义对person表的操作: ```java public interface PersonRepository extends ReactiveCrudRepository<Person, Long> { @Query("INSERT INTO person (first_name, last_name) VALUES (:firstName, :lastName)") Mono<Void> insert(@Param("firstName") String firstName, @Param("lastName") String lastName); @Query("SELECT * FROM person WHERE id = :id") Mono<Person> findById(@Param("id") Long id); } ``` 4. 在启动类中添加@EnableR2dbcRepositories注解,开启R2DBC仓库的自动化配置: ```java @SpringBootApplication @EnableR2dbcRepositories public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 5. 启动应用程序,Spring Boot将自动创建名为person的表。如果表已经存在,则不会进行任何操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值