mirror of
https://github.com/CarmJos/EasySQL.git
synced 2024-09-19 21:35:47 +00:00
chore(sql): 提供当前事务实现思路
This commit is contained in:
parent
a88843f768
commit
934f9d841e
@ -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();
|
||||
|
||||
/**
|
||||
* 创建一条插入操作。
|
||||
*
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -1,4 +0,0 @@
|
||||
package cc.carm.lib.easysql.api.condition;
|
||||
|
||||
public class SQLCondition {
|
||||
}
|
@ -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)
|
||||
);
|
||||
|
@ -38,6 +38,7 @@ public interface SQLExceptionHandler extends BiConsumer<SQLException, SQLAction<
|
||||
*
|
||||
* @return 无输出的处理器。
|
||||
*/
|
||||
@Deprecated
|
||||
static SQLExceptionHandler silent() {
|
||||
return (exception, sqlAction) -> {
|
||||
};
|
||||
|
@ -0,0 +1,7 @@
|
||||
package cc.carm.lib.easysql.api.model;
|
||||
|
||||
public class SQLCondition {
|
||||
|
||||
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
|
||||
}
|
@ -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();
|
||||
|
||||
|
||||
}
|
@ -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);
|
||||
|
||||
}
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
}
|
48
demo/src/test/java/cc/carm/lib/easysql/TransactionTest.java
Normal file
48
demo/src/test/java/cc/carm/lib/easysql/TransactionTest.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user