mirror of
https://github.com/CarmJos/EasySQL.git
synced 2026-06-04 23:41:15 +08:00
chore(sql): 提供当前事务实现思路
This commit is contained in:
@@ -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.PreparedSQLUpdateAction;
|
||||||
import cc.carm.lib.easysql.api.action.PreparedSQLUpdateBatchAction;
|
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.builder.*;
|
||||||
import cc.carm.lib.easysql.api.function.SQLBiFunction;
|
import cc.carm.lib.easysql.api.function.SQLBiFunction;
|
||||||
import cc.carm.lib.easysql.api.function.SQLFunction;
|
import cc.carm.lib.easysql.api.function.SQLFunction;
|
||||||
@@ -101,6 +102,8 @@ public interface NewSQLManager {
|
|||||||
*/
|
*/
|
||||||
@NotNull QueryBuilder createQuery();
|
@NotNull QueryBuilder createQuery();
|
||||||
|
|
||||||
|
@NotNull SQLTransaction createTransaction();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建一条插入操作。
|
* 创建一条插入操作。
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ public interface PreparedSQLUpdateAction<T extends Number> extends SQLUpdateActi
|
|||||||
* @param params 参数内容
|
* @param params 参数内容
|
||||||
* @return {@link PreparedSQLUpdateAction}
|
* @return {@link PreparedSQLUpdateAction}
|
||||||
*/
|
*/
|
||||||
PreparedSQLUpdateAction<T> params(Object... params);
|
PreparedSQLUpdateAction<T> values(Object... params);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设定SQL语句中所有 ? 对应的参数
|
* 设定SQL语句中所有 ? 对应的参数
|
||||||
@@ -19,6 +19,6 @@ public interface PreparedSQLUpdateAction<T extends Number> extends SQLUpdateActi
|
|||||||
* @return {@link PreparedSQLUpdateAction}
|
* @return {@link PreparedSQLUpdateAction}
|
||||||
* @since 0.4.0
|
* @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
|
@Override
|
||||||
public void beforeExecute(@NotNull SQLAction<?> action, @NotNull List<@Nullable Object[]> params) {
|
public void beforeExecute(@NotNull SQLAction<?> action, @NotNull List<@Nullable Object[]> params) {
|
||||||
logger.info("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
logger.info("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
||||||
logger.info("┣# ActionUUID: {}", action.getActionUUID());
|
logger.info("┣# 操作编号: {}", action.getActionUUID());
|
||||||
logger.info("┣# ActionType: {}", action.getClass().getSimpleName());
|
logger.info("┣# 操作类型: {}", action.getClass().getSimpleName());
|
||||||
if (action.getSQLContents().size() == 1) {
|
if (action.getSQLContents().size() == 1) {
|
||||||
logger.info("┣# SQLContent: {}", action.getSQLContents().get(0));
|
logger.info("┣# SQL语句: {}", action.getSQLContents().get(0));
|
||||||
} else {
|
} else {
|
||||||
logger.info("┣# SQLContents: ");
|
logger.info("┣# SQL语句: ");
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (String sqlContent : action.getSQLContents()) {
|
for (String sqlContent : action.getSQLContents()) {
|
||||||
logger.info("┃ - [{}] {}", ++i, sqlContent);
|
logger.info("┃ - [{}] {}", ++i, sqlContent);
|
||||||
@@ -70,25 +70,25 @@ public interface SQLDebugHandler {
|
|||||||
if (params.size() == 1) {
|
if (params.size() == 1) {
|
||||||
Object[] param = params.get(0);
|
Object[] param = params.get(0);
|
||||||
if (param != null) {
|
if (param != null) {
|
||||||
logger.info("┣# SQLParam: {}", parseParams(param));
|
logger.info("┣# SQL参数: {}", parseParams(param));
|
||||||
}
|
}
|
||||||
} else if (params.size() > 1) {
|
} else if (params.size() > 1) {
|
||||||
logger.info("┣# SQLParams: ");
|
logger.info("┣# SQL参数: ");
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (Object[] param : params) {
|
for (Object[] param : params) {
|
||||||
logger.info("┃ - [{}] {}", ++i, parseParams(param));
|
logger.info("┃ - [{}] {}", ++i, parseParams(param));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
logger.info("┣# CreateTime: {}", action.getCreateTime(TimeUnit.MILLISECONDS));
|
logger.info("┣# 创建时间: {}", action.getCreateTime(TimeUnit.MILLISECONDS));
|
||||||
logger.info("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
logger.info("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterQuery(@NotNull SQLQuery query, long executeNanoTime, long closeNanoTime) {
|
public void afterQuery(@NotNull SQLQuery query, long executeNanoTime, long closeNanoTime) {
|
||||||
logger.info("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
logger.info("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
||||||
logger.info("┣# ActionUUID: {}", query.getAction().getActionUUID());
|
logger.info("┣# 操作编号: {}", query.getAction().getActionUUID());
|
||||||
logger.info("┣# SQLContent: {}", query.getSQLContent());
|
logger.info("┣# SQL语句: {}", query.getSQLContent());
|
||||||
logger.info("┣# CloseTime: {} (cost {} ms)",
|
logger.info("┣# 关闭时间: {} (cost {} ms)",
|
||||||
TimeUnit.NANOSECONDS.toMillis(closeNanoTime),
|
TimeUnit.NANOSECONDS.toMillis(closeNanoTime),
|
||||||
((double) (closeNanoTime - executeNanoTime) / 1000000)
|
((double) (closeNanoTime - executeNanoTime) / 1000000)
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ public interface SQLExceptionHandler extends BiConsumer<SQLException, SQLAction<
|
|||||||
*
|
*
|
||||||
* @return 无输出的处理器。
|
* @return 无输出的处理器。
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
static SQLExceptionHandler silent() {
|
static SQLExceptionHandler silent() {
|
||||||
return (exception, sqlAction) -> {
|
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的情况下,返回的数值可能为空。)
|
// 同步SQL插入 (不使用try-catch的情况下,返回的数值可能为空。)
|
||||||
int id = sqlManager.createInsert("users")
|
int id = sqlManager.createInsert("users")
|
||||||
.columns("username", "phone", "email", "registerTime")
|
.columns("username", "phone", "email", "registerTime")
|
||||||
.params("CarmJos", "18888888888", "carm@carm.cc", TimeDateUtils.getCurrentTime())
|
.values("CarmJos", "18888888888", "carm@carm.cc", TimeDateUtils.getCurrentTime())
|
||||||
.returnGeneratedKey() // 设定在后续返回自增主键
|
.returnGeneratedKey() // 设定在后续返回自增主键
|
||||||
.execute((exception, action) -> {
|
.execute((exception, action) -> {
|
||||||
// 处理异常
|
// 处理异常
|
||||||
@@ -149,7 +149,7 @@ public class EasySQLDemo {
|
|||||||
try {
|
try {
|
||||||
int userID = sqlManager.createInsert("users")
|
int userID = sqlManager.createInsert("users")
|
||||||
.columns("username", "phone", "email", "registerTime")
|
.columns("username", "phone", "email", "registerTime")
|
||||||
.params("CarmJos", "18888888888", "carm@carm.cc", TimeDateUtils.getCurrentTime())
|
.values("CarmJos", "18888888888", "carm@carm.cc", TimeDateUtils.getCurrentTime())
|
||||||
.returnGeneratedKey().execute();
|
.returnGeneratedKey().execute();
|
||||||
|
|
||||||
System.out.println("新用户的ID为 " + userID);
|
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);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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
|
@Override
|
||||||
public PreparedSQLUpdateActionImpl<T> params(Object... params) {
|
public PreparedSQLUpdateActionImpl<T> values(Object... params) {
|
||||||
this.params = params;
|
this.params = params;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PreparedSQLUpdateActionImpl<T> params(@Nullable Iterable<Object> params) {
|
public PreparedSQLUpdateActionImpl<T> values(@Nullable Iterable<Object> params) {
|
||||||
if (params == null) {
|
if (params == null) {
|
||||||
return params((Object[]) null);
|
return values((Object[]) null);
|
||||||
} else {
|
} else {
|
||||||
List<Object> paramsList = new ArrayList<>();
|
List<Object> paramsList = new ArrayList<>();
|
||||||
params.forEach(paramsList::add);
|
params.forEach(paramsList::add);
|
||||||
return params(paramsList.toArray());
|
return values(paramsList.toArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user