1
mirror of https://github.com/CarmJos/EasySQL.git synced 2026-06-04 15:28:20 +08:00

feat(sql): 预备支持事务(v0.5.0)

This commit is contained in:
2022-10-16 23:49:53 +08:00
parent a9a7543e65
commit a88843f768
30 changed files with 429 additions and 69 deletions
@@ -0,0 +1,152 @@
package cc.carm.lib.easysql.api;
import cc.carm.lib.easysql.api.action.PreparedSQLUpdateAction;
import cc.carm.lib.easysql.api.action.PreparedSQLUpdateBatchAction;
import cc.carm.lib.easysql.api.builder.*;
import cc.carm.lib.easysql.api.function.SQLBiFunction;
import cc.carm.lib.easysql.api.function.SQLFunction;
import org.jetbrains.annotations.NotNull;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.util.concurrent.CompletableFuture;
public interface NewSQLManager {
/**
* 得到用于该管理器的 {@link SQLSource}
*
* @return {@link SQLSource}
*/
@NotNull SQLSource getSource();
/**
* 获取并操作 {@link DatabaseMetaData} 以得到需要的数据库消息。
*
* @param reader 操作与读取的方法
* @param <R> 最终结果的返回类型
* @return 最终结果,通过 {@link CompletableFuture#get()} 可阻塞并等待结果返回。
*/
default <R> CompletableFuture<R> fetchMetadata(@NotNull SQLFunction<DatabaseMetaData, R> reader) {
return fetchMetadata((meta, conn) -> reader.apply(meta));
}
/**
* 获取并操作 {@link DatabaseMetaData} 提供的指定 {@link ResultSet} 以得到需要的数据库消息。
* <br> 该方法会自动关闭 {@link ResultSet} 。
*
* @param supplier 操作 {@link DatabaseMetaData} 以提供信息所在的 {@link ResultSet}
* @param reader 读取 {@link ResultSet} 中指定信息的方法
* @param <R> 最终结果的返回类型
* @return 最终结果,通过 {@link CompletableFuture#get()} 可阻塞并等待结果返回。
* @throws NullPointerException 当 supplier 提供的 {@link ResultSet} 为NULL时抛出
*/
default <R> CompletableFuture<R> fetchMetadata(@NotNull SQLFunction<DatabaseMetaData, ResultSet> supplier,
@NotNull SQLFunction<@NotNull ResultSet, R> reader) {
return fetchMetadata((meta, conn) -> supplier.apply(meta), reader);
}
/**
* 获取并操作 {@link DatabaseMetaData} 以得到需要的数据库消息。
*
* @param reader 操作与读取的方法
* @param <R> 最终结果的返回类型
* @return 最终结果,通过 {@link CompletableFuture#get()} 可阻塞并等待结果返回。
*/
<R> CompletableFuture<R> fetchMetadata(@NotNull SQLBiFunction<DatabaseMetaData, Connection, R> reader);
/**
* 获取并操作 {@link DatabaseMetaData} 提供的指定 {@link ResultSet} 以得到需要的数据库消息。
* <br> 该方法会自动关闭 {@link ResultSet} 。
*
* @param supplier 操作 {@link DatabaseMetaData} 以提供信息所在的 {@link ResultSet}
* @param reader 读取 {@link ResultSet} 中指定信息的方法
* @param <R> 最终结果的返回类型
* @return 最终结果,通过 {@link CompletableFuture#get()} 可阻塞并等待结果返回。
* @throws NullPointerException 当 supplier 提供的 {@link ResultSet} 为NULL时抛出
*/
<R> CompletableFuture<R> fetchMetadata(@NotNull SQLBiFunction<DatabaseMetaData, Connection, ResultSet> supplier,
@NotNull SQLFunction<@NotNull ResultSet, R> reader);
/**
* 在库中创建一个表。
*
* @param tableName 表名
* @return {@link TableCreateBuilder}
*/
@NotNull TableCreateBuilder createTable(@NotNull String tableName);
/**
* 对库中的某个表执行更改。
*
* @param tableName 表名
* @return {@link TableAlterBuilder}
*/
@NotNull TableAlterBuilder alterTable(@NotNull String tableName);
/**
* 快速获取表的部分元数据。
* <br> 当需要获取其他元数据时,请使用 {@link #fetchMetadata(SQLFunction, SQLFunction)} 方法。
*
* @param tablePattern 表名通配符
* @return {@link TableMetadataBuilder}
*/
@NotNull TableMetadataBuilder fetchTableMetadata(@NotNull String tablePattern);
/**
* 新建一个查询。
*
* @return {@link QueryBuilder}
*/
@NotNull QueryBuilder createQuery();
/**
* 创建一条插入操作。
*
* @param tableName 目标表名
* @return {@link InsertBuilder}
*/
@NotNull InsertBuilder<PreparedSQLUpdateAction<Integer>> insertInto(@NotNull String tableName);
/**
* 创建支持多组数据的插入操作。
*
* @param tableName 目标表名
* @return {@link InsertBuilder}
*/
@NotNull InsertBuilder<PreparedSQLUpdateBatchAction<Integer>> insertBatchInto(@NotNull String tableName);
/**
* 创建一条替换操作。
*
* @param tableName 目标表名
* @return {@link ReplaceBuilder}
*/
@NotNull ReplaceBuilder<PreparedSQLUpdateAction<Integer>> replaceInto(@NotNull String tableName);
/**
* 创建支持多组数据的替换操作。
*
* @param tableName 目标表名
* @return {@link ReplaceBuilder}
*/
@NotNull ReplaceBuilder<PreparedSQLUpdateBatchAction<Integer>> replaceBatchInto(@NotNull String tableName);
/**
* 创建更新操作。
*
* @param tableName 目标表名
* @return {@link UpdateBuilder}
*/
@NotNull UpdateBuilder updateInto(@NotNull String tableName);
/**
* 创建删除操作。
*
* @param tableName 目标表名
* @return {@link DeleteBuilder}
*/
@NotNull DeleteBuilder deleteFrom(@NotNull String tableName);
}
@@ -35,9 +35,6 @@ public interface SQLManager {
Logger getLogger();
boolean isDebugMode();
/**
* 获取用于执行 {@link SQLAction#executeAsync()} 的线程池。
* <br> 默认线程池为 {@link #defaultExecutorPool(String)} 。
@@ -62,6 +59,7 @@ public interface SQLManager {
});
}
boolean isDebugMode();
/**
* 设定是否启用调试模式。
@@ -0,0 +1,175 @@
package cc.carm.lib.easysql.api;
import cc.carm.lib.easysql.api.action.PreparedSQLUpdateAction;
import cc.carm.lib.easysql.api.action.PreparedSQLUpdateBatchAction;
import cc.carm.lib.easysql.api.action.SQLUpdateAction;
import cc.carm.lib.easysql.api.action.SQLUpdateBatchAction;
import cc.carm.lib.easysql.api.function.SQLDebugHandler;
import cc.carm.lib.easysql.api.function.SQLExceptionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.function.Supplier;
public interface SQLSource {
Logger getLogger();
/**
* 获取用于执行 {@link SQLAction#executeAsync()} 的线程池。
* <br> 默认线程池为 {@link #defaultExecutorPool(String)} 。
*
* @return {@link ExecutorService}
*/
@NotNull ExecutorService getExecutorPool();
/**
* 设定用于执行 {@link SQLAction#executeAsync()} 的线程池.
* <br> 默认线程池为 {@link #defaultExecutorPool(String)} 。
*
* @param executorPool {@link ExecutorService}
*/
void setExecutorPool(@NotNull ExecutorService executorPool);
static @NotNull ExecutorService defaultExecutorPool(@NotNull String threadName) {
return Executors.newFixedThreadPool(4, r -> {
Thread thread = new Thread(r, threadName);
thread.setDaemon(true);
return thread;
});
}
boolean isDebugMode();
/**
* 设定是否启用调试模式。
* 启用调试模式后,会在每次执行SQL语句时,调用 {@link #getDebugHandler()} 来输出调试信息。
*
* @param debugMode 是否启用调试模式
*/
void setDebugMode(@NotNull Supplier<@NotNull Boolean> debugMode);
/**
* 设定是否启用调试模式。
* 启用调试模式后,会在每次执行SQL语句时,调用 {@link #getDebugHandler()} 来输出调试信息。
*
* @param enable 是否启用调试模式
*/
default void setDebugMode(boolean enable) {
setDebugMode(() -> enable);
}
/**
* 获取调试处理器,用于处理调试信息。
*
* @return {@link SQLDebugHandler}
*/
@NotNull SQLDebugHandler getDebugHandler();
/**
* 设定调试处理器,默认为 {@link SQLDebugHandler#defaultHandler(Logger)} 。
*
* @param debugHandler {@link SQLDebugHandler}
*/
void setDebugHandler(@NotNull SQLDebugHandler debugHandler);
/**
* 得到连接池源
*
* @return DataSource
*/
@NotNull DataSource getDataSource();
/**
* 得到一个数据库连接实例
*
* @return Connection
* @throws SQLException 见 {@link DataSource#getConnection()}
*/
@NotNull Connection getConnection() throws SQLException;
/**
* 得到正使用的查询。
*
* @return 查询列表
*/
@NotNull Map<UUID, SQLQuery> getActiveQuery();
/**
* 获取改管理器提供的默认异常处理器。
* 若未使用过 {@link #setExceptionHandler(SQLExceptionHandler)} 方法,
* 则默认返回 {@link SQLExceptionHandler#detailed(Logger)} 。
*
* @return {@link SQLExceptionHandler}
*/
@NotNull SQLExceptionHandler getExceptionHandler();
/**
* 设定通用的异常处理器。
* <br> 在使用 {@link SQLAction#execute(SQLExceptionHandler)} 等相关方法时,若传入的处理器为null,则会采用此处理器。
* <br> 若该方法传入参数为 null,则会使用 {@link SQLExceptionHandler#detailed(Logger)} 。
*
* @param handler 异常处理器
*/
void setExceptionHandler(@Nullable SQLExceptionHandler handler);
/**
* 执行一条不需要返回结果的SQL语句(多用于UPDATE、REPLACE、DELETE方法)
* 该方法使用 Statement 实现,请注意SQL注入风险!
*
* @param sql SQL语句内容
* @return 更新的行数
* @see SQLUpdateAction
*/
@Nullable Integer executeSQL(String sql);
/**
* 执行一条不需要返回结果的预处理SQL更改(UPDATE、REPLACE、DELETE)
*
* @param sql SQL语句内容
* @param params SQL语句中 ? 的对应参数
* @return 更新的行数
* @see PreparedSQLUpdateAction
*/
@Nullable Integer executeSQL(String sql, Object[] params);
/**
* 执行多条不需要返回结果的SQL更改(UPDATE、REPLACE、DELETE)
*
* @param sql SQL语句内容
* @param paramsBatch SQL语句中对应?的参数组
* @return 对应参数返回的行数
* @see PreparedSQLUpdateBatchAction
*/
@Nullable List<Integer> executeSQLBatch(String sql, Iterable<Object[]> paramsBatch);
/**
* 执行多条不需要返回结果的SQL。
* 该方法使用 Statement 实现,请注意SQL注入风险!
*
* @param sql SQL语句内容
* @param moreSQL 更多SQL语句内容
* @return 对应参数返回的行数
* @see SQLUpdateBatchAction
*/
@Nullable List<Integer> executeSQLBatch(@NotNull String sql, String... moreSQL);
/**
* 执行多条不需要返回结果的SQL。
*
* @param sqlBatch SQL语句内容
* @return 对应参数返回的行数
*/
@Nullable List<Integer> executeSQLBatch(@NotNull Iterable<String> sqlBatch);
}
@@ -45,7 +45,7 @@ public interface SQLTable {
static @NotNull NamedSQLTable of(@NotNull String tableName,
@NotNull String[] columns, @Nullable String tableSettings) {
return of(tableName, builder -> {
builder.setColumns(columns);
builder.columns(columns);
if (tableSettings != null) builder.setTableSettings(tableSettings);
});
}
@@ -79,7 +79,7 @@ public interface SQLTable {
}
default @NotNull TableQueryBuilder createQuery(@NotNull SQLManager sqlManager) {
return sqlManager.createQuery().inTable(getTableName());
return sqlManager.createQuery().fromTable(getTableName());
}
default @NotNull DeleteBuilder createDelete() {
@@ -10,7 +10,7 @@ public interface PreparedSQLUpdateAction<T extends Number> extends SQLUpdateActi
* @param params 参数内容
* @return {@link PreparedSQLUpdateAction}
*/
PreparedSQLUpdateAction<T> setParams(Object... params);
PreparedSQLUpdateAction<T> params(Object... params);
/**
* 设定SQL语句中所有 ? 对应的参数
@@ -19,6 +19,6 @@ public interface PreparedSQLUpdateAction<T extends Number> extends SQLUpdateActi
* @return {@link PreparedSQLUpdateAction}
* @since 0.4.0
*/
PreparedSQLUpdateAction<T> setParams(@Nullable Iterable<Object> params);
PreparedSQLUpdateAction<T> params(@Nullable Iterable<Object> params);
}
@@ -0,0 +1,19 @@
package cc.carm.lib.easysql.api.action;
import cc.carm.lib.easysql.api.SQLManager;
public class SQLTransaction implements SQLManager {
public SQLTransaction savepoint() {
return this;
}
public SQLTransaction releaseSavepoint() {
return this;
}
public SQLTransaction rollbackToSavepoint() {
return this;
}
}
@@ -23,7 +23,7 @@ public interface ConditionalBuilder<B extends ConditionalBuilder<B, T>, T extend
* @param limit 条数限制
* @return {@link B}
*/
B setLimit(int limit);
B limit(int limit);
/**
* 直接设定条件的源文本,不需要以WHERE开头。
@@ -32,7 +32,7 @@ public interface ConditionalBuilder<B extends ConditionalBuilder<B, T>, T extend
* @param condition 条件文本,不需要以WHERE开头。
* @return {@link B}
*/
B setConditions(@Nullable String condition);
B where(@Nullable String condition);
/**
* 直接设定每个条件的文本与其对应数值,将以AND链接,且不需要以WHERE开头。
@@ -41,7 +41,7 @@ public interface ConditionalBuilder<B extends ConditionalBuilder<B, T>, T extend
* @param conditionSQLs 条件内容,将以AND链接,且不需要以WHERE开头。
* @return {@link B}
*/
B setConditions(LinkedHashMap<@NotNull String, @Nullable Object> conditionSQLs);
B where(LinkedHashMap<@NotNull String, @Nullable Object> conditionSQLs);
B addCondition(@Nullable String condition);
@@ -9,10 +9,10 @@ public interface InsertBuilder<T extends SQLAction<?>> {
String getTableName();
T setColumnNames(List<String> columnNames);
T columns(List<String> columnNames);
default T setColumnNames(String... columnNames) {
return setColumnNames(columnNames == null ? null : Arrays.asList(columnNames));
default T columns(String... columnNames) {
return columns(columnNames == null ? null : Arrays.asList(columnNames));
}
@@ -32,6 +32,6 @@ public interface QueryBuilder extends SQLBuilder {
* @param tableName 表名
* @return {@link TableQueryBuilder}
*/
TableQueryBuilder inTable(@NotNull String tableName);
TableQueryBuilder fromTable(@NotNull String tableName);
}
@@ -16,10 +16,10 @@ public interface ReplaceBuilder<T extends SQLAction<?>> {
String getTableName();
T setColumnNames(List<String> columnNames);
T columns(List<String> columnNames);
default T setColumnNames(String... columnNames) {
return setColumnNames(columnNames == null ? null : Arrays.asList(columnNames));
default T columns(String... columnNames) {
return columns(columnNames == null ? null : Arrays.asList(columnNames));
}
}
@@ -49,7 +49,7 @@ public interface TableCreateBuilder extends SQLBuilder {
* @param columns 列的相关信息 (包括列设定)
* @return {@link TableCreateBuilder}
*/
TableCreateBuilder setColumns(@NotNull String... columns);
TableCreateBuilder columns(@NotNull String... columns);
/**
* 为该表添加一个列
@@ -13,7 +13,7 @@ public interface TableQueryBuilder extends ConditionalBuilder<TableQueryBuilder,
* @param columnNames 列名
* @return {@link TableQueryBuilder}
*/
TableQueryBuilder selectColumns(@NotNull String... columnNames);
TableQueryBuilder select(@NotNull String... columnNames);
/**
* 对结果进行排序
@@ -32,6 +32,6 @@ public interface TableQueryBuilder extends ConditionalBuilder<TableQueryBuilder,
* @return {@link TableQueryBuilder}
* @since 0.2.6
*/
TableQueryBuilder setPageLimit(int start, int end);
TableQueryBuilder limit(int start, int end);
}
@@ -18,7 +18,7 @@ public interface UpdateBuilder extends ConditionalBuilder<UpdateBuilder, SQLActi
* @return {@link UpdateBuilder}
* @since 0.3.7
*/
UpdateBuilder addColumnValue(@NotNull String columnName, @Nullable Object columnValue);
UpdateBuilder set(@NotNull String columnName, @Nullable Object columnValue);
/**
* 设定更新的全部字段值 <b>(此操作会覆盖之前的设定)</b>
@@ -27,7 +27,7 @@ public interface UpdateBuilder extends ConditionalBuilder<UpdateBuilder, SQLActi
* @param columnData 字段名和值的键值对
* @return {@link UpdateBuilder}
*/
UpdateBuilder setColumnValues(LinkedHashMap<@NotNull String, @Nullable Object> columnData);
UpdateBuilder setAll(LinkedHashMap<@NotNull String, @Nullable Object> columnData);
/**
* 设定更新的全部字段值 <b>(此操作会覆盖之前的设定)</b>
@@ -37,19 +37,19 @@ public interface UpdateBuilder extends ConditionalBuilder<UpdateBuilder, SQLActi
* @param columnValues 字段名对应的值
* @return {@link UpdateBuilder}
*/
UpdateBuilder setColumnValues(@NotNull String[] columnNames, @Nullable Object[] columnValues);
UpdateBuilder setAll(@NotNull String[] columnNames, @Nullable Object[] columnValues);
/**
* 设定更新的全部字段值 <b>(此操作会覆盖之前的设定)</b>
* <p> 如需同时更新多条字段,请使用 {@link #setColumnValues(String[], Object[])} 或 {@link #setColumnValues(LinkedHashMap)}
* <br>也可以使用 {@link #addColumnValue(String, Object)} 一条条的添加字段
* <p> 如需同时更新多条字段,请使用 {@link #setAll(String[], Object[])} 或 {@link #setAll(LinkedHashMap)}
* <br>也可以使用 {@link #set(String, Object)} 一条条的添加字段
*
* @param columnName 字段名
* @param columnValue 字段名对应的值
* @return {@link UpdateBuilder}
*/
default UpdateBuilder setColumnValues(@NotNull String columnName, @Nullable Object columnValue) {
return setColumnValues(new String[]{columnName}, new Object[]{columnValue});
default UpdateBuilder setAll(@NotNull String columnName, @Nullable Object columnValue) {
return setAll(new String[]{columnName}, new Object[]{columnValue});
}
@@ -0,0 +1,4 @@
package cc.carm.lib.easysql.api.condition;
public class SQLCondition {
}