diff --git a/pom.xml b/pom.xml index f994ff3..869de78 100644 --- a/pom.xml +++ b/pom.xml @@ -58,18 +58,21 @@ - + - com.mysql - mysql-connector-j - 9.2.0 + org.springframework.boot + spring-boot-starter-data-r2dbc - org.springframework.boot - spring-boot-starter-data-jpa + dev.miku + r2dbc-mysql + 0.8.2.RELEASE + + + org.hibernate.reactive + hibernate-reactive-core + 2.3.1.Final - - org.springframework.boot diff --git a/src/main/java/com/ai/reactive/securityApp/api/SqlController.java b/src/main/java/com/ai/reactive/securityApp/api/SqlController.java index 077cbc5..9b31fa5 100644 --- a/src/main/java/com/ai/reactive/securityApp/api/SqlController.java +++ b/src/main/java/com/ai/reactive/securityApp/api/SqlController.java @@ -10,9 +10,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.FileSystemResource; -import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; +// import org.springframework.data.domain.Pageable; // No longer used directly in method return types, but PageRequest is import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -25,11 +24,11 @@ import org.springframework.web.server.WebSession; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import reactor.core.scheduler.Schedulers; +// import reactor.core.scheduler.Schedulers; // No longer needed import java.io.File; import java.time.Duration; -import java.util.List; +// import java.util.List; // No longer returning Mono> @RestController @RequestMapping(path = "/mysql", produces = MediaType.APPLICATION_JSON_VALUE) @@ -42,22 +41,18 @@ public class SqlController { @PostMapping(path = "/page", consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.CREATED) - public Mono> page(@RequestBody @Valid UserParam userParam) { + public Flux page(@RequestBody @Valid UserParam userParam) { - PageRequest pageRequest = PageRequest.of(0, 10); + PageRequest pageRequest = PageRequest.of(0, 10); // Assuming UserParam doesn't carry page/size or using defaults - - return Mono.defer(() -> Mono.just(userRepository.findByNameLike(userParam.getUserId(), pageRequest))) - .subscribeOn(Schedulers.boundedElastic()); + return userRepository.findByNameLike(userParam.getUserId(), pageRequest); } @PostMapping(path = "/list", consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.CREATED) - public Mono> list(@RequestBody @Valid UserParam userParam) { - + public Flux list(@RequestBody @Valid UserParam userParam) { - return Mono.defer(() -> Mono.just(userRepository.findEntity(userParam.getUserId()))) - .subscribeOn(Schedulers.boundedElastic()); + return userRepository.findEntity(userParam.getUserId()); } @PostMapping(value = "/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE) diff --git a/src/main/java/com/ai/reactive/securityApp/repository/UserRepository.java b/src/main/java/com/ai/reactive/securityApp/repository/UserRepository.java index 195fc14..472794a 100644 --- a/src/main/java/com/ai/reactive/securityApp/repository/UserRepository.java +++ b/src/main/java/com/ai/reactive/securityApp/repository/UserRepository.java @@ -1,28 +1,22 @@ package com.ai.reactive.securityApp.repository; - import com.ai.reactive.securityApp.entity.User; -import io.lettuce.core.dynamic.annotation.Param; -import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; +import org.springframework.data.r2dbc.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; @Repository -public interface UserRepository extends JpaRepository { - - Optional findByUserId(String userId); - +public interface UserRepository extends ReactiveCrudRepository { - @Query(nativeQuery = true, value = "select * from user where user_id like %?1%") - List findEntity(String name); + Mono findByUserId(String userId); + @Query(nativeQuery = true, value = "SELECT * FROM user WHERE user_id LIKE CONCAT('%', :name, '%')") + Flux findEntity(@Param("name") String name); - @Query(nativeQuery = true, value = "select * from user where user_id like %?1%") - Page findByNameLike(@Param("user_id") String name, Pageable pageable); + @Query(nativeQuery = true, value = "SELECT * FROM user WHERE user_id LIKE CONCAT('%', :name, '%')") + Flux findByNameLike(@Param("name") String name, Pageable pageable); } \ No newline at end of file diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 58a01f1..8a47545 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -18,25 +18,26 @@ server: spring: profiles: active: local - datasource: - hikari: - minimum-idle: 3 - maximum-pool-size: 10 - connection-timeout: 30000 - idle-timeout: 600000 - validation-timeout: 40000 - sql-script-encoding: UTF-8 - initialization-mode: always +# datasource: +# hikari: +# minimum-idle: 3 +# maximum-pool-size: 10 +# connection-timeout: 30000 +# idle-timeout: 600000 +# validation-timeout: 40000 +# sql-script-encoding: UTF-8 +# initialization-mode: always jpa: - show-sql: true - hibernate: - ddl-auto: validate +# show-sql: true # Reactive Hibernate uses different logging for SQL +# hibernate: +# ddl-auto: validate # Keep this under properties for Hibernate Reactive properties: - hibernate.show_sql: true - hibernate.use_sql_comments: true - hibernate.format_sql: true - hibernate.query.in_clause_parameter_padding: true - open-in-view: false +# hibernate.show_sql: true +# hibernate.use_sql_comments: true +# hibernate.format_sql: true +# hibernate.query.in_clause_parameter_padding: true + hibernate.hbm2ddl.auto: validate # For Hibernate Reactive +# open-in-view: false # Not applicable for WebFlux jackson: default-property-inclusion: non_empty serialization: @@ -48,11 +49,17 @@ spring: config: activate: on-profile: local - datasource: - url: jdbc:mysql://localhost:3306/TestDB?useUnicode=yes&characterEncoding=UTF-8 + # spring.datasource properties are for JDBC, replaced by spring.r2dbc for reactive + # datasource: + # url: jdbc:mysql://localhost:3306/TestDB?useUnicode=yes&characterEncoding=UTF-8 + # username: root + # password: root + # driver-class-name: com.mysql.cj.jdbc.Driver + r2dbc: + url: r2dbc:mysql://localhost:3306/TestDB?useUnicode=yes&characterEncoding=UTF-8 username: root password: root - driver-class-name: com.mysql.cj.jdbc.Driver + # For R2DBC, connection factory is auto-configured based on the driver on classpath (dev.miku:r2dbc-mysql) redis: host: localhost port: 63799