feat: 发布0.0.1版本
This commit is contained in:
parent
72f74b2b8c
commit
e390b81a98
@ -19,7 +19,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<artifactId>fluent-sql-core</artifactId>
|
<artifactId>fluent-sql-core</artifactId>
|
||||||
<groupId>group.flyfish.framework</groupId>
|
<groupId>group.flyfish.framework</groupId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>0.0.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>fluent-sql</artifactId>
|
<artifactId>fluent-sql</artifactId>
|
||||||
<groupId>group.flyfish.framework</groupId>
|
<groupId>group.flyfish.framework</groupId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>0.0.1</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
@ -23,7 +23,7 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework</groupId>
|
<groupId>org.springframework</groupId>
|
||||||
<artifactId>spring-jdbc</artifactId>
|
<artifactId>spring-beans</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.persistence</groupId>
|
<groupId>javax.persistence</groupId>
|
||||||
|
@ -2,9 +2,9 @@ package group.flyfish.fluent.chain;
|
|||||||
|
|
||||||
import group.flyfish.fluent.chain.common.PreSqlChain;
|
import group.flyfish.fluent.chain.common.PreSqlChain;
|
||||||
import group.flyfish.fluent.chain.select.SelectComposite;
|
import group.flyfish.fluent.chain.select.SelectComposite;
|
||||||
|
import group.flyfish.fluent.operations.FluentSQLOperations;
|
||||||
import group.flyfish.fluent.update.Update;
|
import group.flyfish.fluent.update.Update;
|
||||||
import group.flyfish.fluent.utils.sql.SFunction;
|
import group.flyfish.fluent.utils.sql.SFunction;
|
||||||
import org.springframework.jdbc.core.JdbcOperations;
|
|
||||||
|
|
||||||
import static group.flyfish.fluent.utils.sql.SqlNameUtils.cast;
|
import static group.flyfish.fluent.utils.sql.SqlNameUtils.cast;
|
||||||
|
|
||||||
@ -54,11 +54,11 @@ public interface SQL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 绑定数据源上下文,基于jdbc template
|
* 绑定数据源上下文,可自由切换实现
|
||||||
*
|
*
|
||||||
* @param operations jdbc操作
|
* @param operations jdbc操作
|
||||||
*/
|
*/
|
||||||
static void bind(JdbcOperations operations) {
|
static void bind(FluentSQLOperations operations) {
|
||||||
SQLImpl.bind(operations);
|
SQLImpl.bind(operations);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,8 @@ import group.flyfish.fluent.chain.common.PreSqlChain;
|
|||||||
import group.flyfish.fluent.chain.select.AfterOrderSqlChain;
|
import group.flyfish.fluent.chain.select.AfterOrderSqlChain;
|
||||||
import group.flyfish.fluent.chain.select.AfterWhereSqlChain;
|
import group.flyfish.fluent.chain.select.AfterWhereSqlChain;
|
||||||
import group.flyfish.fluent.chain.update.AfterSetSqlChain;
|
import group.flyfish.fluent.chain.update.AfterSetSqlChain;
|
||||||
import group.flyfish.fluent.mapping.SQLMappedRowMapper;
|
import group.flyfish.fluent.entity.SQLEntity;
|
||||||
|
import group.flyfish.fluent.operations.FluentSQLOperations;
|
||||||
import group.flyfish.fluent.query.JoinCandidate;
|
import group.flyfish.fluent.query.JoinCandidate;
|
||||||
import group.flyfish.fluent.query.Parameterized;
|
import group.flyfish.fluent.query.Parameterized;
|
||||||
import group.flyfish.fluent.query.Query;
|
import group.flyfish.fluent.query.Query;
|
||||||
@ -18,8 +19,6 @@ import group.flyfish.fluent.utils.sql.ConcatSegment;
|
|||||||
import group.flyfish.fluent.utils.sql.EntityNameUtils;
|
import group.flyfish.fluent.utils.sql.EntityNameUtils;
|
||||||
import group.flyfish.fluent.utils.sql.SFunction;
|
import group.flyfish.fluent.utils.sql.SFunction;
|
||||||
import group.flyfish.fluent.utils.sql.SqlNameUtils;
|
import group.flyfish.fluent.utils.sql.SqlNameUtils;
|
||||||
import org.springframework.dao.EmptyResultDataAccessException;
|
|
||||||
import org.springframework.jdbc.core.JdbcOperations;
|
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -35,7 +34,7 @@ import java.util.stream.Collectors;
|
|||||||
final class SQLImpl extends ConcatSegment<SQLImpl> implements SQLOperations, PreSqlChain, HandleSqlChain, AfterJoinSqlChain, AfterSetSqlChain {
|
final class SQLImpl extends ConcatSegment<SQLImpl> implements SQLOperations, PreSqlChain, HandleSqlChain, AfterJoinSqlChain, AfterSetSqlChain {
|
||||||
|
|
||||||
// 共享的操作
|
// 共享的操作
|
||||||
private static JdbcOperations SHARED_OPERATIONS;
|
private static FluentSQLOperations SHARED_OPERATIONS;
|
||||||
// 参数map,有序
|
// 参数map,有序
|
||||||
private final List<Object> parameters = new ArrayList<>();
|
private final List<Object> parameters = new ArrayList<>();
|
||||||
|
|
||||||
@ -43,11 +42,11 @@ final class SQLImpl extends ConcatSegment<SQLImpl> implements SQLOperations, Pre
|
|||||||
private final boolean debug = false;
|
private final boolean debug = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 基于jdbc template
|
* 绑定实现类
|
||||||
*
|
*
|
||||||
* @param operations jdbc操作
|
* @param operations jdbc操作
|
||||||
*/
|
*/
|
||||||
public static void bind(JdbcOperations operations) {
|
public static void bind(FluentSQLOperations operations) {
|
||||||
SHARED_OPERATIONS = operations;
|
SHARED_OPERATIONS = operations;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,12 +183,7 @@ final class SQLImpl extends ConcatSegment<SQLImpl> implements SQLOperations, Pre
|
|||||||
* @param <T> 泛型
|
* @param <T> 泛型
|
||||||
*/
|
*/
|
||||||
public <T> T one(Class<T> clazz) {
|
public <T> T one(Class<T> clazz) {
|
||||||
try {
|
return SHARED_OPERATIONS.selectOne(entity(), clazz);
|
||||||
return SHARED_OPERATIONS.queryForObject(sql().concat(" limit 1"),
|
|
||||||
new SQLMappedRowMapper<>(clazz), parsedParameters());
|
|
||||||
} catch (EmptyResultDataAccessException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -200,7 +194,7 @@ final class SQLImpl extends ConcatSegment<SQLImpl> implements SQLOperations, Pre
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public <T> List<T> list(Class<T> clazz) {
|
public <T> List<T> list(Class<T> clazz) {
|
||||||
return SHARED_OPERATIONS.query(sql(), new SQLMappedRowMapper<>(clazz), parsedParameters());
|
return SHARED_OPERATIONS.select(entity(), clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -210,7 +204,7 @@ final class SQLImpl extends ConcatSegment<SQLImpl> implements SQLOperations, Pre
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int execute() {
|
public int execute() {
|
||||||
return SHARED_OPERATIONS.update(sql(), parsedParameters());
|
return SHARED_OPERATIONS.execute(entity());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -252,4 +246,13 @@ final class SQLImpl extends ConcatSegment<SQLImpl> implements SQLOperations, Pre
|
|||||||
parameters.addAll(params.getParameters());
|
parameters.addAll(params.getParameters());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将本实体转换为sql实体
|
||||||
|
*
|
||||||
|
* @return 转换结果
|
||||||
|
*/
|
||||||
|
private SQLEntity entity() {
|
||||||
|
return SQLEntity.of(this::sql, this::parsedParameters);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
package group.flyfish.fluent.entity;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sql运行实体
|
||||||
|
*
|
||||||
|
* @author wangyu
|
||||||
|
*/
|
||||||
|
public class SQLEntity {
|
||||||
|
|
||||||
|
private static final Supplier<Object[]> EMPTY_PARAMETERS = () -> new Object[]{};
|
||||||
|
|
||||||
|
// sql提供者
|
||||||
|
private Supplier<String> sqlProvider;
|
||||||
|
|
||||||
|
// sql参数表提供者
|
||||||
|
private Supplier<Object[]> parametersProvider;
|
||||||
|
|
||||||
|
public static SQLEntity of(Supplier<String> sqlProvider) {
|
||||||
|
return of(sqlProvider, EMPTY_PARAMETERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SQLEntity of(Supplier<String> sqlProvider, Supplier<Object[]> parametersProvider) {
|
||||||
|
SQLEntity entity = new SQLEntity();
|
||||||
|
entity.sqlProvider = sqlProvider;
|
||||||
|
entity.parametersProvider = parametersProvider;
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSql() {
|
||||||
|
return sqlProvider.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[] getParameters() {
|
||||||
|
return parametersProvider.get();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package group.flyfish.fluent.operations;
|
||||||
|
|
||||||
|
import group.flyfish.fluent.entity.SQLEntity;
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sql query操作
|
||||||
|
*
|
||||||
|
* @author wangyu
|
||||||
|
*/
|
||||||
|
public interface FluentSQLOperations {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行一条sql,并且序列化为对象
|
||||||
|
* 注意,如果查询不止一条,该方法仅返回第一条数据
|
||||||
|
* 如果没有结果,将返回null
|
||||||
|
*
|
||||||
|
* @param entity sql实体
|
||||||
|
* @param clazz 目标类型
|
||||||
|
* @param <T> 目标泛型
|
||||||
|
* @return 查询结果
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
<T> T selectOne(SQLEntity entity, Class<T> clazz);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行一条sql,并且查询出所有行
|
||||||
|
*
|
||||||
|
* @param entity sql实体
|
||||||
|
* @param clazz 目标类型
|
||||||
|
* @param <T> 目标泛型
|
||||||
|
* @return 返回的列表
|
||||||
|
*/
|
||||||
|
<T> List<T> select(SQLEntity entity, Class<T> clazz);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 直接执行sql,根据update count返回更新行数,如果是查询,永远返回0
|
||||||
|
*
|
||||||
|
* @param entity sql实体
|
||||||
|
* @return 更新行数
|
||||||
|
*/
|
||||||
|
int execute(SQLEntity entity);
|
||||||
|
}
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>fluent-sql</artifactId>
|
<artifactId>fluent-sql</artifactId>
|
||||||
<groupId>group.flyfish.framework</groupId>
|
<groupId>group.flyfish.framework</groupId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>0.0.1</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
@ -16,4 +16,29 @@
|
|||||||
<maven.compiler.target>8</maven.compiler.target>
|
<maven.compiler.target>8</maven.compiler.target>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>group.flyfish.framework</groupId>
|
||||||
|
<artifactId>fluent-sql-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-jdbc</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-context</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
@ -0,0 +1,76 @@
|
|||||||
|
package group.flyfish.fluent.operations;
|
||||||
|
|
||||||
|
import group.flyfish.fluent.chain.SQL;
|
||||||
|
import group.flyfish.fluent.entity.SQLEntity;
|
||||||
|
import group.flyfish.fluent.mapping.SQLMappedRowMapper;
|
||||||
|
import org.springframework.dao.EmptyResultDataAccessException;
|
||||||
|
import org.springframework.jdbc.core.JdbcOperations;
|
||||||
|
import org.springframework.util.ClassUtils;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* jdbc template实现的查询操作
|
||||||
|
*
|
||||||
|
* @author wangyu
|
||||||
|
*/
|
||||||
|
public class JdbcTemplateFluentSQLOperations implements FluentSQLOperations {
|
||||||
|
|
||||||
|
private final JdbcOperations jdbcOperations;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实例化 + 自动绑定
|
||||||
|
*
|
||||||
|
* @param operations spring jdbc template
|
||||||
|
*/
|
||||||
|
public JdbcTemplateFluentSQLOperations(JdbcOperations operations) {
|
||||||
|
this.jdbcOperations = operations;
|
||||||
|
SQL.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行一条sql,并且序列化为对象
|
||||||
|
* 注意,如果查询不止一条,该方法仅返回第一条数据
|
||||||
|
* 如果没有结果,将返回null
|
||||||
|
*
|
||||||
|
* @param entity sql实体
|
||||||
|
* @param clazz 目标类型
|
||||||
|
* @return 查询结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("all")
|
||||||
|
public <T> T selectOne(SQLEntity entity, Class<T> clazz) {
|
||||||
|
try {
|
||||||
|
String sql = entity.getSql().concat(" limit 1");
|
||||||
|
if (ClassUtils.isPrimitiveOrWrapper(clazz)) {
|
||||||
|
return jdbcOperations.queryForObject(sql, clazz, entity.getParameters());
|
||||||
|
}
|
||||||
|
return jdbcOperations.queryForObject(sql, new SQLMappedRowMapper<>(clazz), entity.getParameters());
|
||||||
|
} catch (EmptyResultDataAccessException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行一条sql,并且查询出所有行
|
||||||
|
*
|
||||||
|
* @param entity sql实体
|
||||||
|
* @param clazz 目标类型
|
||||||
|
* @return 返回的列表
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public <T> List<T> select(SQLEntity entity, Class<T> clazz) {
|
||||||
|
return jdbcOperations.query(entity.getSql(), new SQLMappedRowMapper<>(clazz), entity.getParameters());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 直接执行sql,根据update count返回更新行数,如果是查询,永远返回0
|
||||||
|
*
|
||||||
|
* @param entity sql实体
|
||||||
|
* @return 更新行数
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int execute(SQLEntity entity) {
|
||||||
|
return jdbcOperations.update(entity.getSql(), entity.getParameters());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,77 @@
|
|||||||
|
package group.flyfish.framework;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.mysql.cj.jdbc.Driver;
|
||||||
|
import group.flyfish.fluent.operations.FluentSQLOperations;
|
||||||
|
import group.flyfish.fluent.operations.JdbcTemplateFluentSQLOperations;
|
||||||
|
import group.flyfish.fluent.utils.data.ObjectMappers;
|
||||||
|
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 org.junit.Test;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.jdbc.core.JdbcOperations;
|
||||||
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
|
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 链式jdbc测试
|
||||||
|
*
|
||||||
|
* @author wangyu
|
||||||
|
*/
|
||||||
|
public class FluentJdbcTest {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 静态测试demo
|
||||||
|
* 实际测试请根据自己的数据库字段书写实体
|
||||||
|
*
|
||||||
|
* @throws SQLException sql异常
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testSql() throws SQLException, JsonProcessingException {
|
||||||
|
DataSource dataSource = new SimpleDriverDataSource(
|
||||||
|
new Driver(),
|
||||||
|
"jdbc:mysql://127.0.0.1:3306/epi_project?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai",
|
||||||
|
"root",
|
||||||
|
"oI3WtMO8h%mSYARp"
|
||||||
|
);
|
||||||
|
// 基于构造器自动绑定注册,在实际应用中使用@Bean声明即可,可参考下面的demo
|
||||||
|
new JdbcTemplateFluentSQLOperations(new JdbcTemplate(dataSource));
|
||||||
|
|
||||||
|
// 一个平平无奇的查询
|
||||||
|
List<TenantContext> list = 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))
|
||||||
|
.list(TenantContext.class);
|
||||||
|
|
||||||
|
// 打印效果
|
||||||
|
System.out.println(ObjectMappers.shared().writeValueAsString(list));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实际应用中,使用bean注入并实例化
|
||||||
|
*
|
||||||
|
* @param operations 从spring依赖注入的jdbc template
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public FluentSQLOperations fluentSQLOperations(JdbcOperations operations) {
|
||||||
|
return new JdbcTemplateFluentSQLOperations(operations);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package group.flyfish.framework.entity;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所有实体类继承
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public abstract class Po implements Serializable {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@Property("主键")
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
@Column(name = "create_by")
|
||||||
|
@Property("创建者")
|
||||||
|
private String createBy;
|
||||||
|
|
||||||
|
@Column(name = "create_time")
|
||||||
|
@Property("创建时间")
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
@Column(name = "update_by")
|
||||||
|
@Property("更新者")
|
||||||
|
private String updateBy;
|
||||||
|
|
||||||
|
@Column(name = "update_time")
|
||||||
|
@Property("更新时间")
|
||||||
|
private Date updateTime;
|
||||||
|
|
||||||
|
@Column(name = "is_delete")
|
||||||
|
@Property("逻辑删除标志")
|
||||||
|
private Boolean delete;
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package group.flyfish.framework.entity;
|
||||||
|
|
||||||
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Documented
|
||||||
|
@interface Property {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return 属性名称
|
||||||
|
*/
|
||||||
|
String value();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return 属性描述
|
||||||
|
*/
|
||||||
|
String description() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return 是否唯一
|
||||||
|
*/
|
||||||
|
boolean unique() default false;
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
package group.flyfish.framework.entity;
|
||||||
|
|
||||||
|
|
||||||
|
import group.flyfish.fluent.binding.JSONInject;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 租户订阅表
|
||||||
|
*
|
||||||
|
* @author wangyu
|
||||||
|
*/
|
||||||
|
@Table(name = "saas_order")
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class SaasOrder extends Po {
|
||||||
|
|
||||||
|
@Property("订阅备注")
|
||||||
|
private String comment;
|
||||||
|
|
||||||
|
@Property("套餐id")
|
||||||
|
@ManyToOne
|
||||||
|
@Column(name = "plan_id")
|
||||||
|
private String planId;
|
||||||
|
|
||||||
|
@Property("租户id")
|
||||||
|
@ManyToOne
|
||||||
|
@Column(name = "tenant_id")
|
||||||
|
private String tenantId;
|
||||||
|
|
||||||
|
@Property("配额配置JSON")
|
||||||
|
@Column(name = "quota_config")
|
||||||
|
@JSONInject
|
||||||
|
private SaasQuota quotaConfig;
|
||||||
|
|
||||||
|
@Property("订阅类型 (LIMITED:有限期订阅,UNLIMITED:无限期订阅)")
|
||||||
|
@Column(name = "order_type")
|
||||||
|
private Type orderType;
|
||||||
|
|
||||||
|
@Property("订阅时间")
|
||||||
|
@Column(name = "order_time")
|
||||||
|
private Date orderTime;
|
||||||
|
|
||||||
|
@Property("过期时间")
|
||||||
|
@Column(name = "expire_time")
|
||||||
|
private Date expireTime;
|
||||||
|
|
||||||
|
@Property("订阅状态 (VALID:有效,INVALID:无效,ERROR:异常)")
|
||||||
|
@Column(name = "status")
|
||||||
|
private Status status;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum Status {
|
||||||
|
|
||||||
|
VALID("有效"),
|
||||||
|
INVALID("无效"),
|
||||||
|
ERROR("异常");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum Type {
|
||||||
|
|
||||||
|
LIMITED("有限期订阅"),
|
||||||
|
UNLIMITED("无限期订阅");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package group.flyfish.framework.entity;
|
||||||
|
|
||||||
|
import group.flyfish.fluent.binding.JSONInject;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* saas计划套餐
|
||||||
|
*
|
||||||
|
* @author wangyu
|
||||||
|
*/
|
||||||
|
@Table(name = "saas_plan")
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class SaasPlan extends Po {
|
||||||
|
|
||||||
|
@Property("套餐名称")
|
||||||
|
@Column(name = "name")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Property("套餐描述")
|
||||||
|
@Column(name = "description")
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
@Property("配额配置JSON")
|
||||||
|
@Column(name = "quota_config")
|
||||||
|
@JSONInject
|
||||||
|
private SaasQuota quotaConfig;
|
||||||
|
|
||||||
|
@Property("启用状态(未启用0,已启用1)")
|
||||||
|
@Column(name = "enable")
|
||||||
|
private Boolean enable;
|
||||||
|
|
||||||
|
@Property("套餐状态 (NORMAL:上架中,DISABLED:已下架)")
|
||||||
|
@Column(name = "status")
|
||||||
|
private String status;
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package group.flyfish.framework.entity;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* saas配额属性
|
||||||
|
*
|
||||||
|
* @author wangyu
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class SaasQuota implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -3615943142615938771L;
|
||||||
|
|
||||||
|
// 用户限额
|
||||||
|
@Property("在线用户数限制")
|
||||||
|
private Integer userOnlineLimit;
|
||||||
|
|
||||||
|
// mysql 运行限额
|
||||||
|
@Property("每小时最大查询")
|
||||||
|
private Integer databaseMaxQueriesPerHour;
|
||||||
|
@Property("每小时最大修改")
|
||||||
|
private Integer databaseMaxUpdatesPerHour;
|
||||||
|
@Property("每小时最大连接数")
|
||||||
|
private Integer databaseMaxConnectionsPerHour;
|
||||||
|
@Property("当前用户最大连接数")
|
||||||
|
private Integer databaseMaxUserConnections;
|
||||||
|
|
||||||
|
// mysql 存储限额
|
||||||
|
@Property("单库最大存储量(byte)")
|
||||||
|
private Long databaseMaxSize;
|
||||||
|
|
||||||
|
// 文件存储限额
|
||||||
|
@Property("文件最大存储量(byte)")
|
||||||
|
private Long storageMaxSize;
|
||||||
|
@Property("上行速率最大值(KB/s)")
|
||||||
|
private Long storageUpLinkMaxSpeed;
|
||||||
|
@Property("下行速率最大值(KB/s)")
|
||||||
|
private Long storageDownLinkMaxSpeed;
|
||||||
|
|
||||||
|
// 内存数据库配额限制
|
||||||
|
@Property("最大存储键值对数`")
|
||||||
|
private Long cacheMaxKeys;
|
||||||
|
|
||||||
|
// 应用(短信、收费api等)
|
||||||
|
@Property("短信最大发送条数")
|
||||||
|
private Integer smsMaxCount;
|
||||||
|
@Property("实名认证最大次数")
|
||||||
|
private Integer verifyMaxCount;
|
||||||
|
}
|
@ -0,0 +1,120 @@
|
|||||||
|
package group.flyfish.framework.entity;
|
||||||
|
|
||||||
|
import group.flyfish.fluent.binding.JSONInject;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import javax.persistence.Table;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* saas租户
|
||||||
|
*
|
||||||
|
* @author wangyu
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Table(name = "saas_tenant")
|
||||||
|
public class SaasTenant extends Po {
|
||||||
|
|
||||||
|
@Property("租户名称")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Property(value = "租户标识", description = "系统唯一标识", unique = true)
|
||||||
|
private String identifier;
|
||||||
|
|
||||||
|
@Property(value = "租户代码", description = "统一社会信用代码")
|
||||||
|
private String code;
|
||||||
|
|
||||||
|
@Property(value = "数据库配置", description = "租户自有数据库配置")
|
||||||
|
@JSONInject
|
||||||
|
private DataSourceConfig datasource;
|
||||||
|
|
||||||
|
@Property(value = "存储配置", description = "租户自有存储配置")
|
||||||
|
@JSONInject
|
||||||
|
private StorageConfig storage;
|
||||||
|
|
||||||
|
@Property("租户状态")
|
||||||
|
private Status status;
|
||||||
|
|
||||||
|
@Property("合同状态")
|
||||||
|
private ContractStatus contractStatus;
|
||||||
|
|
||||||
|
@Property("是否启用")
|
||||||
|
private Boolean enable;
|
||||||
|
|
||||||
|
@Property("备注")
|
||||||
|
private String comment;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum Status {
|
||||||
|
|
||||||
|
PENDING("未开通"),
|
||||||
|
TRYING("试用中"),
|
||||||
|
CREATED("已开通"),
|
||||||
|
EXPIRED("已过期"),
|
||||||
|
CANCELED("已注销");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum ContractStatus {
|
||||||
|
|
||||||
|
PENDING("未签订"),
|
||||||
|
ENGAGED("已签订"),
|
||||||
|
ABANDONED("已作废");
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 租户数据源配置信息
|
||||||
|
*
|
||||||
|
* @author wangyu
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public static class DataSourceConfig implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 3751414771731042514L;
|
||||||
|
|
||||||
|
@Property("连接字符串")
|
||||||
|
private String connection;
|
||||||
|
|
||||||
|
@Property("驱动名称")
|
||||||
|
private String driverClass = "com.mysql.cj.jdbc.Driver";
|
||||||
|
|
||||||
|
@Property("用户名")
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@Property("密码")
|
||||||
|
private String password;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 租户存储信息
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public static class StorageConfig implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -9032829515869208750L;
|
||||||
|
|
||||||
|
//minio用户信息
|
||||||
|
@Property(value = "服务器地址", description = "可以是sftp服务器地址、minio地址、azure地址")
|
||||||
|
private String server;
|
||||||
|
@Property(value = "目录名", description = "可以是本地目录、sftp目录、minio桶名称,azure桶名称")
|
||||||
|
private String directory;
|
||||||
|
@Property(value = "用户名", description = "可以是sftp用户名、minio用户名、azure用户名")
|
||||||
|
private String username;
|
||||||
|
@Property(value = "用户密码", description = "可以是sftp摩玛、minio密码、azure密码等")
|
||||||
|
private String password;
|
||||||
|
@Property("其他连接参数。根据不同的文件存储方式可以自由放入")
|
||||||
|
private Map<String, Object> properties;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
package group.flyfish.framework.vo;
|
||||||
|
|
||||||
|
|
||||||
|
import group.flyfish.fluent.binding.Alias;
|
||||||
|
import group.flyfish.fluent.binding.JSONInject;
|
||||||
|
import group.flyfish.framework.entity.SaasOrder;
|
||||||
|
import group.flyfish.framework.entity.SaasQuota;
|
||||||
|
import group.flyfish.framework.entity.SaasTenant;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 租户上下文
|
||||||
|
*
|
||||||
|
* @author wangyu
|
||||||
|
* 负责租户生命周期管理,缓存读写,驻留在请求上下文中
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class TenantContext implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -6912908497223962047L;
|
||||||
|
|
||||||
|
// 租户id
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
// 租户名称
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
// 租户标识符
|
||||||
|
private String identifier;
|
||||||
|
|
||||||
|
// 租户数据源配置
|
||||||
|
@JSONInject
|
||||||
|
private SaasTenant.DataSourceConfig datasource;
|
||||||
|
|
||||||
|
// 租户存储配置
|
||||||
|
@JSONInject
|
||||||
|
private SaasTenant.StorageConfig storage;
|
||||||
|
|
||||||
|
// 租户状态
|
||||||
|
private SaasTenant.Status status;
|
||||||
|
|
||||||
|
// 租户启用状态
|
||||||
|
private Boolean enable;
|
||||||
|
|
||||||
|
// 配额信息
|
||||||
|
@Alias("quota_config")
|
||||||
|
@JSONInject
|
||||||
|
private SaasQuota quota;
|
||||||
|
|
||||||
|
// 订阅类型 (LIMITED:有限期订阅,UNLIMITED:无限期订阅)
|
||||||
|
@Column(name = "order_type")
|
||||||
|
private SaasOrder.Type orderType;
|
||||||
|
|
||||||
|
// 订阅时间
|
||||||
|
@Column(name = "order_time")
|
||||||
|
private Date orderTime;
|
||||||
|
|
||||||
|
// 过期时间
|
||||||
|
@Column(name = "expire_time")
|
||||||
|
private Date expireTime;
|
||||||
|
}
|
29
pom.xml
29
pom.xml
@ -7,7 +7,7 @@
|
|||||||
<groupId>group.flyfish.framework</groupId>
|
<groupId>group.flyfish.framework</groupId>
|
||||||
<artifactId>fluent-sql</artifactId>
|
<artifactId>fluent-sql</artifactId>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>0.0.1</version>
|
||||||
<modules>
|
<modules>
|
||||||
<module>fluent-sql-core</module>
|
<module>fluent-sql-core</module>
|
||||||
<module>fluent-sql-jdbctemplate</module>
|
<module>fluent-sql-jdbctemplate</module>
|
||||||
@ -59,6 +59,11 @@
|
|||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>group.flyfish.framework</groupId>
|
||||||
|
<artifactId>fluent-sql-core</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
<artifactId>jackson-databind</artifactId>
|
<artifactId>jackson-databind</artifactId>
|
||||||
@ -69,6 +74,16 @@
|
|||||||
<artifactId>spring-jdbc</artifactId>
|
<artifactId>spring-jdbc</artifactId>
|
||||||
<version>${spring.version}</version>
|
<version>${spring.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-beans</artifactId>
|
||||||
|
<version>${spring.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-context</artifactId>
|
||||||
|
<version>${spring.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
<artifactId>slf4j-api</artifactId>
|
<artifactId>slf4j-api</artifactId>
|
||||||
@ -79,6 +94,18 @@
|
|||||||
<artifactId>persistence-api</artifactId>
|
<artifactId>persistence-api</artifactId>
|
||||||
<version>1.0.2</version>
|
<version>1.0.2</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.13.2</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
<version>8.0.29</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user