diff --git a/fluent-sql-core/src/main/java/group/flyfish/fluent/chain/SQL.java b/fluent-sql-core/src/main/java/group/flyfish/fluent/chain/SQL.java index 6b3a95c..10ceeef 100644 --- a/fluent-sql-core/src/main/java/group/flyfish/fluent/chain/SQL.java +++ b/fluent-sql-core/src/main/java/group/flyfish/fluent/chain/SQL.java @@ -3,6 +3,7 @@ package group.flyfish.fluent.chain; import group.flyfish.fluent.chain.common.PreSqlChain; import group.flyfish.fluent.chain.select.SelectComposite; import group.flyfish.fluent.operations.FluentSQLOperations; +import group.flyfish.fluent.operations.ReactiveFluentSQLOperations; import group.flyfish.fluent.update.Update; import group.flyfish.fluent.utils.sql.SFunction; @@ -61,4 +62,13 @@ public interface SQL { static void bind(FluentSQLOperations operations) { SQLImpl.bind(operations); } + + /** + * 绑定数据源上下文,可自由切换实现 + * + * @param operations jdbc操作 + */ + static void bind(ReactiveFluentSQLOperations operations) { + SQLImpl.bind(operations); + } } diff --git a/fluent-sql-core/src/main/java/group/flyfish/fluent/chain/SQLImpl.java b/fluent-sql-core/src/main/java/group/flyfish/fluent/chain/SQLImpl.java index 05bb368..b632ae1 100644 --- a/fluent-sql-core/src/main/java/group/flyfish/fluent/chain/SQLImpl.java +++ b/fluent-sql-core/src/main/java/group/flyfish/fluent/chain/SQLImpl.java @@ -236,7 +236,6 @@ final class SQLImpl extends ConcatSegment implements SQLOperations, Pre * @return 构建结果 */ private String sql() { - Assert.notNull(SHARED_OPERATIONS, "未指定执行数据源!"); String sql = segments.stream().map(SQLSegment::get).collect(Collectors.joining(" ")); if (FluentSqlDebugger.enabled()) { System.out.println("prepared sql: " + sql); @@ -310,11 +309,15 @@ final class SQLImpl extends ConcatSegment implements SQLOperations, Pre * * @param */ - @RequiredArgsConstructor private static class DefaultBoundEntitySpec implements BoundEntitySpec { private final BoundSQLEntity entity; + private DefaultBoundEntitySpec(BoundSQLEntity entity) { + Assert.notNull(SHARED_OPERATIONS, "未指定执行数据源!"); + this.entity = entity; + } + @Override public T one() { return SHARED_OPERATIONS.selectOne(entity); @@ -341,11 +344,15 @@ final class SQLImpl extends ConcatSegment implements SQLOperations, Pre * * @param 泛型 */ - @RequiredArgsConstructor private static class DefaultReactiveBoundEntitySpec implements ReactiveBoundEntitySpec { private final BoundSQLEntity entity; + private DefaultReactiveBoundEntitySpec(BoundSQLEntity entity) { + Assert.notNull(SHARED_REACTIVE_OPERATIONS, "未指定执行数据源!"); + this.entity = entity; + } + @Override public Mono one() { return SHARED_REACTIVE_OPERATIONS.selectOne(entity); diff --git a/fluent-sql-spring/pom.xml b/fluent-sql-spring/pom.xml index 1e641f6..d658e28 100644 --- a/fluent-sql-spring/pom.xml +++ b/fluent-sql-spring/pom.xml @@ -46,6 +46,12 @@ mysql-connector-java test + + io.asyncer + r2dbc-mysql + 0.9.7 + test + org.springframework spring-context diff --git a/fluent-sql-spring/src/main/java/group/flyfish/fluent/operations/R2dbcFluentSQLOperations.java b/fluent-sql-spring/src/main/java/group/flyfish/fluent/operations/R2dbcFluentSQLOperations.java index 2c83b9d..b27ef08 100644 --- a/fluent-sql-spring/src/main/java/group/flyfish/fluent/operations/R2dbcFluentSQLOperations.java +++ b/fluent-sql-spring/src/main/java/group/flyfish/fluent/operations/R2dbcFluentSQLOperations.java @@ -1,19 +1,23 @@ package group.flyfish.fluent.operations; +import group.flyfish.fluent.chain.SQL; import group.flyfish.fluent.entity.BoundSQLEntity; import group.flyfish.fluent.entity.DataPage; import group.flyfish.fluent.mapping.ReactiveSQLMappedRowMapper; -import lombok.RequiredArgsConstructor; import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.r2dbc.core.RowsFetchSpec; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -@RequiredArgsConstructor public class R2dbcFluentSQLOperations implements ReactiveFluentSQLOperations { private final DatabaseClient databaseClient; + public R2dbcFluentSQLOperations(DatabaseClient databaseClient) { + this.databaseClient = databaseClient; + SQL.bind(this); + } + /** * 执行一条sql,并且序列化为对象 * 注意,如果查询不止一条,该方法仅返回第一条数据 diff --git a/fluent-sql-spring/src/test/java/group/flyfish/framework/FluentR2dbcTest.java b/fluent-sql-spring/src/test/java/group/flyfish/framework/FluentR2dbcTest.java new file mode 100644 index 0000000..6c7dc8f --- /dev/null +++ b/fluent-sql-spring/src/test/java/group/flyfish/framework/FluentR2dbcTest.java @@ -0,0 +1,62 @@ +package group.flyfish.framework; + +import group.flyfish.fluent.chain.select.FetchSqlChain; +import group.flyfish.fluent.operations.R2dbcFluentSQLOperations; +import group.flyfish.framework.entity.SaasOrder; +import group.flyfish.framework.entity.SaasPlan; +import group.flyfish.framework.entity.SaasTenant; +import group.flyfish.framework.vo.TenantContext; +import io.asyncer.r2dbc.mysql.MySqlConnectionConfiguration; +import io.asyncer.r2dbc.mysql.MySqlConnectionFactory; +import io.r2dbc.spi.ConnectionFactory; +import org.junit.Test; +import org.springframework.r2dbc.core.DatabaseClient; + +import java.sql.SQLException; + +import static group.flyfish.fluent.chain.SQL.select; +import static group.flyfish.fluent.chain.select.SelectComposite.composite; +import static group.flyfish.fluent.query.Query.where; + +public class FluentR2dbcTest { + + private FetchSqlChain sql; + + /** + * 静态测试demo + * 实际测试请根据自己的数据库字段书写实体 + * + * @throws SQLException sql异常 + */ + @Test + public void testSql() { + MySqlConnectionConfiguration configuration = MySqlConnectionConfiguration.builder() + .host("localhost") + .port(3306) + .database("epi_project") + .user("root") + .password("Unicom#2018") + .build(); + ConnectionFactory connectionFactory = MySqlConnectionFactory.from(configuration); + DatabaseClient databaseClient = DatabaseClient.builder().connectionFactory(connectionFactory) + .build(); + new R2dbcFluentSQLOperations(databaseClient); + + // 缓存构建结果 + this.sql = select( + // 查询租户全量字段 + composite(SaasTenant::getId, SaasTenant::getName, SaasTenant::getIdentifier, SaasTenant::getDatasource, + SaasTenant::getStorage, SaasTenant::getStatus, SaasTenant::getEnable), + // 查询套餐 + composite(SaasOrder::getQuotaConfig, SaasOrder::getOrderTime, SaasOrder::getExpireTime, + SaasOrder::getOrderType)) + .from(SaasTenant.class) + .leftJoin(SaasOrder.class).on(where(SaasOrder::getTenantId).eq(SaasTenant::getId)) + .leftJoin(SaasPlan.class).on(where(SaasPlan::getId).eq(SaasOrder::getPlanId)) + .matching(where(SaasTenant::getEnable).eq(true)); + + System.out.println(sql.as(TenantContext.class).reactive().all() + .collectList() + .block()); + } +}