Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -58,18 +58,21 @@
</dependency>

<!-- MySQL -->
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<!-- R2DBC dependencies -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>9.2.0</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>0.8.2.RELEASE</version> <!-- Ensure this version is compatible -->
</dependency>
<dependency>
<groupId>org.hibernate.reactive</groupId>
<artifactId>hibernate-reactive-core</artifactId>
<version>2.3.1.Final</version> <!-- Ensure this version is compatible -->
</dependency>



<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down
21 changes: 8 additions & 13 deletions src/main/java/com/ai/reactive/securityApp/api/SqlController.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<List<User>>

@RestController
@RequestMapping(path = "/mysql", produces = MediaType.APPLICATION_JSON_VALUE)
Expand All @@ -42,22 +41,18 @@ public class SqlController {

@PostMapping(path = "/page", consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(HttpStatus.CREATED)
public Mono<Page<User>> page(@RequestBody @Valid UserParam userParam) {
public Flux<User> 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<User>> list(@RequestBody @Valid UserParam userParam) {

public Flux<User> 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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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<User, Long> {

Optional<User> findByUserId(String userId);

public interface UserRepository extends ReactiveCrudRepository<User, String> {

@Query(nativeQuery = true, value = "select * from user where user_id like %?1%")
List<User> findEntity(String name);
Mono<User> findByUserId(String userId);

@Query(nativeQuery = true, value = "SELECT * FROM user WHERE user_id LIKE CONCAT('%', :name, '%')")
Flux<User> findEntity(@Param("name") String name);

@Query(nativeQuery = true, value = "select * from user where user_id like %?1%")
Page<User> findByNameLike(@Param("user_id") String name, Pageable pageable);
@Query(nativeQuery = true, value = "SELECT * FROM user WHERE user_id LIKE CONCAT('%', :name, '%')")
Flux<User> findByNameLike(@Param("name") String name, Pageable pageable);
}
47 changes: 27 additions & 20 deletions src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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
Expand Down