1
mirror of https://github.com/CarmJos/EasySQL.git synced 2024-09-19 21:35:47 +00:00

chore(sql): 提供当前事务实现思路

This commit is contained in:
Carm Jos 2022-10-17 23:43:49 +08:00
parent a88843f768
commit 934f9d841e
14 changed files with 135 additions and 53 deletions

View File

@ -2,6 +2,7 @@ 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.transaction.SQLTransaction;
import cc.carm.lib.easysql.api.builder.*;
import cc.carm.lib.easysql.api.function.SQLBiFunction;
import cc.carm.lib.easysql.api.function.SQLFunction;
@ -101,6 +102,8 @@ public interface NewSQLManager {
*/
@NotNull QueryBuilder createQuery();
@NotNull SQLTransaction createTransaction();
/**
* 创建一条插入操作
*

View File

@ -10,7 +10,7 @@ public interface PreparedSQLUpdateAction<T extends Number> extends SQLUpdateActi
* @param params 参数内容
* @return {@link PreparedSQLUpdateAction}
*/
PreparedSQLUpdateAction<T> params(Object... params);
PreparedSQLUpdateAction<T> values(Object... params);
/**
* 设定SQL语句中所有 ? 对应的参数
@ -19,6 +19,6 @@ public interface PreparedSQLUpdateAction<T extends Number> extends SQLUpdateActi
* @return {@link PreparedSQLUpdateAction}
* @since 0.4.0
*/
PreparedSQLUpdateAction<T> params(@Nullable Iterable<Object> params);
PreparedSQLUpdateAction<T> values(@Nullable Iterable<Object> params);
}

View File

@ -1,19 +0,0 @@
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;
}
}

View File

@ -1,4 +0,0 @@
package cc.carm.lib.easysql.api.condition;
public class SQLCondition {
}

View File

@ -56,12 +56,12 @@ public interface SQLDebugHandler {
@Override
public void beforeExecute(@NotNull SQLAction<?> action, @NotNull List<@Nullable Object[]> params) {
logger.info("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
logger.info("┣# ActionUUID: {}", action.getActionUUID());
logger.info("┣# ActionType: {}", action.getClass().getSimpleName());
logger.info("┣# 操作编号: {}", action.getActionUUID());
logger.info("┣# 操作类型: {}", action.getClass().getSimpleName());
if (action.getSQLContents().size() == 1) {
logger.info("┣# SQLContent: {}", action.getSQLContents().get(0));
logger.info("┣# SQL语句: {}", action.getSQLContents().get(0));
} else {
logger.info("┣# SQLContents: ");
logger.info("┣# SQL语句: ");
int i = 0;
for (String sqlContent : action.getSQLContents()) {
logger.info("┃ - [{}] {}", ++i, sqlContent);
@ -70,25 +70,25 @@ public interface SQLDebugHandler {
if (params.size() == 1) {
Object[] param = params.get(0);
if (param != null) {
logger.info("┣# SQLParam: {}", parseParams(param));
logger.info("┣# SQL参数: {}", parseParams(param));
}
} else if (params.size() > 1) {
logger.info("┣# SQLParams: ");
logger.info("┣# SQL参数: ");
int i = 0;
for (Object[] param : params) {
logger.info("┃ - [{}] {}", ++i, parseParams(param));
}
}
logger.info("┣# CreateTime: {}", action.getCreateTime(TimeUnit.MILLISECONDS));
logger.info("┣# 创建时间: {}", action.getCreateTime(TimeUnit.MILLISECONDS));
logger.info("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
}
@Override
public void afterQuery(@NotNull SQLQuery query, long executeNanoTime, long closeNanoTime) {
logger.info("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
logger.info("┣# ActionUUID: {}", query.getAction().getActionUUID());
logger.info("┣# SQLContent: {}", query.getSQLContent());
logger.info("┣# CloseTime: {} (cost {} ms)",
logger.info("┣# 操作编号: {}", query.getAction().getActionUUID());
logger.info("┣# SQL语句: {}", query.getSQLContent());
logger.info("┣# 关闭时间: {} (cost {} ms)",
TimeUnit.NANOSECONDS.toMillis(closeNanoTime),
((double) (closeNanoTime - executeNanoTime) / 1000000)
);

View File

@ -38,6 +38,7 @@ public interface SQLExceptionHandler extends BiConsumer<SQLException, SQLAction<
*
* @return 无输出的处理器
*/
@Deprecated
static SQLExceptionHandler silent() {
return (exception, sqlAction) -> {
};

View File

@ -0,0 +1,7 @@
package cc.carm.lib.easysql.api.model;
public class SQLCondition {
}

View File

@ -0,0 +1,24 @@
package cc.carm.lib.easysql.api.model;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class TableColumn {
@NotNull String name;
@NotNull String type;
boolean notNull;
boolean primaryKey;
boolean uniqueKey;
boolean autoIncrement;
@Nullable String defaultValue;
@Nullable String onUpdate;
@Nullable String comment;
}

View File

@ -0,0 +1,16 @@
package cc.carm.lib.easysql.api.transaction;
import org.jetbrains.annotations.NotNull;
public interface SQLSavepoint {
int getID();
@NotNull String getName();
void release();
boolean isReleased();
}

View File

@ -0,0 +1,18 @@
package cc.carm.lib.easysql.api.transaction;
import cc.carm.lib.easysql.api.NewSQLManager;
import org.jetbrains.annotations.Nullable;
public interface SQLTransaction extends NewSQLManager, AutoCloseable {
void commit();
SQLSavepoint savepoint(String name);
default void rollback() {
rollback(null);
}
void rollback(@Nullable SQLSavepoint savepoint);
}

View File

@ -138,7 +138,7 @@ public class EasySQLDemo {
// 同步SQL插入 不使用try-catch的情况下返回的数值可能为空
int id = sqlManager.createInsert("users")
.columns("username", "phone", "email", "registerTime")
.params("CarmJos", "18888888888", "carm@carm.cc", TimeDateUtils.getCurrentTime())
.values("CarmJos", "18888888888", "carm@carm.cc", TimeDateUtils.getCurrentTime())
.returnGeneratedKey() // 设定在后续返回自增主键
.execute((exception, action) -> {
// 处理异常
@ -149,7 +149,7 @@ public class EasySQLDemo {
try {
int userID = sqlManager.createInsert("users")
.columns("username", "phone", "email", "registerTime")
.params("CarmJos", "18888888888", "carm@carm.cc", TimeDateUtils.getCurrentTime())
.values("CarmJos", "18888888888", "carm@carm.cc", TimeDateUtils.getCurrentTime())
.returnGeneratedKey().execute();
System.out.println("新用户的ID为 " + userID);

View File

@ -1,12 +0,0 @@
package cc.carm.lib.easysql;
import cc.carm.lib.easysql.api.action.SQLTransaction;
import java.sql.SQLException;
import java.util.function.Consumer;
public interface DemoTransaction {
SQLTransactionResult commitTransaction(Consumer<SQLTransaction> consumer);
}

View File

@ -0,0 +1,48 @@
package cc.carm.lib.easysql;
import cc.carm.lib.easysql.api.transaction.SQLSavepoint;
import cc.carm.lib.easysql.api.transaction.SQLTransaction;
public class TransactionTest {
public void demo() {
try (SQLTransaction transaction = createTransaction()) {
transaction.updateInto("A")
.set("name", "CARM")
.addCondition("name", "CUMR")
.build().execute();
SQLSavepoint pointA = transaction.savepoint("TEST");
transaction.insertInto("A")
.columns("name")
.values("TEST")
.execute();
try {
transaction.commit(); // 提交
} catch (Exception ex) {
transaction.rollback(pointA); // 出错回滚到pointA
transaction.commit(); // 提交出错前的内容
}
pointA.release(); // release savepoint (结束后也会被自动释放)
} catch (Exception ex) {
}
}
protected SQLTransaction createTransaction() {
return null;
}
}

View File

@ -46,19 +46,19 @@ public class PreparedSQLUpdateActionImpl<T extends Number>
}
@Override
public PreparedSQLUpdateActionImpl<T> params(Object... params) {
public PreparedSQLUpdateActionImpl<T> values(Object... params) {
this.params = params;
return this;
}
@Override
public PreparedSQLUpdateActionImpl<T> params(@Nullable Iterable<Object> params) {
public PreparedSQLUpdateActionImpl<T> values(@Nullable Iterable<Object> params) {
if (params == null) {
return params((Object[]) null);
return values((Object[]) null);
} else {
List<Object> paramsList = new ArrayList<>();
params.forEach(paramsList::add);
return params(paramsList.toArray());
return values(paramsList.toArray());
}
}