addAutoIncrementColumn(@NotNull String columnName) {
+ return addAutoIncrementColumn(columnName, NumberType.INT);
+ }
+
}
diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/TableCreateBuilder.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/TableCreateBuilder.java
index 3cc57b7..9955319 100644
--- a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/TableCreateBuilder.java
+++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/TableCreateBuilder.java
@@ -2,29 +2,239 @@ package cc.carm.lib.easysql.api.builder;
import cc.carm.lib.easysql.api.SQLBuilder;
import cc.carm.lib.easysql.api.action.SQLUpdateAction;
+import cc.carm.lib.easysql.api.enums.ForeignKeyRule;
+import cc.carm.lib.easysql.api.enums.IndexType;
+import cc.carm.lib.easysql.api.enums.NumberType;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
public interface TableCreateBuilder extends SQLBuilder {
- @NotNull String getTableName();
+ /**
+ * 将现有条件构建完整的SQL语句用于执行。
+ *
+ * @return {@link SQLUpdateAction}
+ */
+ SQLUpdateAction build();
- @NotNull String getTableSettings();
+ @NotNull String getTableName();
- TableCreateBuilder setTableSettings(@NotNull String settings);
+ /**
+ * 得到表的设定。
+ * 若未使用 {@link #setTableSettings(String)} 方法则会采用 {@link #defaultTablesSettings()} 。
+ *
+ * @return TableSettings
+ */
+ @NotNull String getTableSettings();
- SQLUpdateAction build();
+ TableCreateBuilder setTableSettings(@NotNull String settings);
- default TableCreateBuilder addColumn(@NotNull String columnName, @NotNull String settings) {
- return addColumn("`" + columnName + "` " + settings);
- }
+ /**
+ * 设定表的标注,一般用于解释该表的作用。
+ *
+ * @param comment 表标注
+ * @return {@link TableCreateBuilder}
+ */
+ TableCreateBuilder setTableComment(@Nullable String comment);
- TableCreateBuilder addColumn(@NotNull String column);
+ /**
+ * 直接设定表的所有列信息
+ *
+ * @param columns 列的相关信息 (包括列设定)
+ * @return {@link TableCreateBuilder}
+ */
+ TableCreateBuilder setColumns(@NotNull String... columns);
- TableCreateBuilder setColumns(@NotNull String... columns);
+ /**
+ * 为该表添加一个列
+ *
+ * @param column 列的相关信息
+ *
如 `uuid` VARCHAR(36) NOT NULL UNIQUE KEY
+ * @return {@link TableCreateBuilder}
+ */
+ TableCreateBuilder addColumn(@NotNull String column);
- default TableCreateBuilder defaultTablesSettings() {
- return setTableSettings("ENGINE=InnoDB DEFAULT CHARSET=utf8");
- }
+ /**
+ * 为该表添加一个列
+ *
+ * @param columnName 列名
+ * @param settings 列的设定
+ *
如 VARCHAR(36) NOT NULL UNIQUE KEY
+ * @return {@link TableCreateBuilder}
+ */
+ default TableCreateBuilder addColumn(@NotNull String columnName, @NotNull String settings) {
+ return addColumn("`" + columnName + "` " + settings);
+ }
+ /**
+ * 为该表添加一个列
+ *
+ * @param columnName 列名
+ * @param settings 列的设定
+ *
如 VARCHAR(36) NOT NULL UNIQUE KEY
+ * @param comments 列的注解,用于解释该列数据的作用
+ * @return {@link TableCreateBuilder}
+ */
+ default TableCreateBuilder addColumn(@NotNull String columnName, @NotNull String settings, @NotNull String comments) {
+ return addColumn(columnName, settings + " COMMENT '" + comments + "'");
+ }
+
+ /**
+ * 为该表添加一个自增列
+ *
自增列强制要求为数字类型,非空,且为UNIQUE。
+ *
注意:一个表只允许有一个自增列!
+ *
+ * @param columnName 列名
+ * @param numberType 数字类型,若省缺则为 {@link NumberType#INT}
+ * @param primary 是否为主键,若为false则设定为唯一键
+ * @param unsigned 是否采用 UNSIGNED (即无负数,可以增加自增键的最高数,建议为true)
+ * @return {@link TableCreateBuilder}
+ */
+ default TableCreateBuilder addAutoIncrementColumn(@NotNull String columnName, @Nullable NumberType numberType,
+ boolean primary, boolean unsigned) {
+ return addColumn(columnName,
+ (numberType == null ? NumberType.INT : numberType).name()
+ + (unsigned ? " UNSIGNED " : " ")
+ + "NOT NULL AUTO_INCREMENT " + (primary ? "PRIMARY KEY" : "UNIQUE KEY")
+ );
+ }
+
+ /**
+ * 为该表添加一个自增主键列
+ *
自增列强制要求为数字类型,非空,且为UNIQUE。
+ *
注意:一个表只允许有一个自增列!
+ *
+ * @param columnName 列名
+ * @param numberType 数字类型,若省缺则为 {@link NumberType#INT}
+ * @return {@link TableCreateBuilder}
+ */
+ default TableCreateBuilder addAutoIncrementColumn(@NotNull String columnName, @Nullable NumberType numberType) {
+ return addAutoIncrementColumn(columnName, numberType, true, true);
+ }
+
+ /**
+ * 为该表添加一个INT类型的自增主键列
+ *
自增列强制要求为数字类型,非空,且为UNIQUE。
+ *
本方法采用的类型为 INT 如有其他需要请自行使用 {@link #addAutoIncrementColumn(String, NumberType)} 方法。
+ *
注意:一个表只允许有一个自增列!
+ *
+ * @param columnName 列名
+ * @return {@link TableCreateBuilder}
+ */
+ default TableCreateBuilder addAutoIncrementColumn(@NotNull String columnName) {
+ return addAutoIncrementColumn(columnName, null);
+ }
+
+ /**
+ * 设定表中的某列为索引或键。
+ *
+ *
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
+ *
虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE 和DELETE。
+ *
因此,请合理的设计索引。
+ *
+ * @param type 索引类型
+ * @param columnName 索引包含的列
+ * @return {@link TableCreateBuilder}
+ */
+ default TableCreateBuilder setIndex(@NotNull IndexType type,
+ @NotNull String columnName) {
+ return setIndex(type, null, columnName);
+ }
+
+ /**
+ * 设定表中的某列为索引或键。
+ *
+ *
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
+ *
虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE 和DELETE。
+ *
因此,请合理的设计索引。
+ *
+ * @param type 索引类型
+ * @param indexName 索引名称,缺省时将根据第一个索引列赋一个名称
+ * @param columnName 索引包含的列
+ * @param moreColumns 联合索引需要包含的列
+ * @return {@link TableCreateBuilder}
+ */
+ TableCreateBuilder setIndex(@NotNull IndexType type, @Nullable String indexName,
+ @NotNull String columnName, @NotNull String... moreColumns);
+
+
+ /**
+ * 以本表位从表,为表中某列设定自参照外键(即自参照完整性)。
+ *
+ *
外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。
+ *
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
+ *
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。
+ *
+ * @param tableColumn 本表中的列
+ * @param foreignColumn 外键关联表中对应的关联列,必须为目标表的主键,即 {@link IndexType#PRIMARY_KEY}
+ * @return {@link TableCreateBuilder}
+ */
+ default TableCreateBuilder addForeignKey(@NotNull String tableColumn, @NotNull String foreignColumn) {
+ return addForeignKey(tableColumn, getTableName(), foreignColumn);
+ }
+
+ /**
+ * 以本表位从表,为表中某列设定外键。
+ *
+ *
外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。
+ *
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
+ *
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。
+ *
+ * @param tableColumn 本表中的列
+ * @param foreignTable 外键关联主表,必须为已存在的表或本表,且必须有主键。
+ * @param foreignColumn 外键关联主表中对应的关联列,须满足
+ *
1. 为主表的主键,即 {@link IndexType#PRIMARY_KEY}
+ *
2. 数据类型必须和所要建立主键的列的数据类型相同。
+ * @return {@link TableCreateBuilder}
+ */
+ default TableCreateBuilder addForeignKey(@NotNull String tableColumn,
+ @NotNull String foreignTable, @NotNull String foreignColumn) {
+ return addForeignKey(tableColumn, null, foreignTable, foreignColumn);
+ }
+
+ /**
+ * 以本表位从表,为表中某列设定外键。
+ *
+ *
外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。
+ *
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
+ *
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。
+ *
+ * @param tableColumn 本表中的列
+ * @param constraintName 约束名,缺省时将使用参数自动生成,如 fk_[tableColumn]_[foreignTable]
+ * @param foreignTable 外键关联主表,必须为已存在的表或本表,且必须有主键。
+ * @param foreignColumn 外键关联主表中对应的关联列,须满足
+ *
1. 为主表的主键,即 {@link IndexType#PRIMARY_KEY}
+ *
2. 数据类型必须和所要建立主键的列的数据类型相同。
+ * @return {@link TableCreateBuilder}
+ */
+ default TableCreateBuilder addForeignKey(@NotNull String tableColumn, @Nullable String constraintName,
+ @NotNull String foreignTable, @NotNull String foreignColumn) {
+ return addForeignKey(tableColumn, constraintName, foreignTable, foreignColumn, null, null);
+ }
+
+ /**
+ * 以本表位从表,为表中某列设定外键。
+ *
+ *
外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。
+ *
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
+ *
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。
+ *
+ * @param tableColumn 本表中的列
+ * @param constraintName 约束名,缺省时将使用参数自动生成,如 fk_[tableColumn]_[foreignTable]
+ * @param foreignTable 外键关联主表,必须为已存在的表或本表,且必须有主键。
+ * @param foreignColumn 外键关联主表中对应的关联列,须满足
+ *
1. 为主表的主键,即 {@link IndexType#PRIMARY_KEY}
+ *
2. 数据类型必须和所要建立主键的列的数据类型相同。
+ * @param updateRule 在外键被更新时采用的规则,缺省时默认为{@link ForeignKeyRule#RESTRICT}
+ * @param deleteRule 在外键被删除时采用的规则,缺省时默认为{@link ForeignKeyRule#RESTRICT}
+ * @return {@link TableCreateBuilder}
+ */
+ TableCreateBuilder addForeignKey(@NotNull String tableColumn, @Nullable String constraintName,
+ @NotNull String foreignTable, @NotNull String foreignColumn,
+ @Nullable ForeignKeyRule updateRule, @Nullable ForeignKeyRule deleteRule);
+
+ default String defaultTablesSettings() {
+ return "ENGINE=InnoDB DEFAULT CHARSET=utf8";
+ }
}
diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/UpdateBuilder.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/UpdateBuilder.java
index a5e3cf0..1ea79cf 100644
--- a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/UpdateBuilder.java
+++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/UpdateBuilder.java
@@ -1,20 +1,20 @@
package cc.carm.lib.easysql.api.builder;
-import cc.carm.lib.easysql.api.action.PreparedSQLUpdateAction;
+import cc.carm.lib.easysql.api.SQLAction;
import java.util.LinkedHashMap;
-public interface UpdateBuilder extends ConditionalBuilder {
+public interface UpdateBuilder extends ConditionalBuilder> {
- String getTableName();
+ String getTableName();
- UpdateBuilder setColumnValues(LinkedHashMap columnData);
+ UpdateBuilder setColumnValues(LinkedHashMap columnData);
- UpdateBuilder setColumnValues(String[] columnNames, Object[] columnValues);
+ UpdateBuilder setColumnValues(String[] columnNames, Object[] columnValues);
- default UpdateBuilder setColumnValues(String columnName, Object columnValue) {
- return setColumnValues(new String[]{columnName}, new Object[]{columnValue});
- }
+ default UpdateBuilder setColumnValues(String columnName, Object columnValue) {
+ return setColumnValues(new String[]{columnName}, new Object[]{columnValue});
+ }
}
diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/UpsertBuilder.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/UpsertBuilder.java
index 02c8768..b7a2ed0 100644
--- a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/UpsertBuilder.java
+++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/UpsertBuilder.java
@@ -1,9 +1,15 @@
package cc.carm.lib.easysql.api.builder;
+/**
+ * 存在则更新,不存在则插入。
+ *
+ * @see ReplaceBuilder
+ */
+@Deprecated
public interface UpsertBuilder {
- String getTableName();
+ String getTableName();
- UpsertBuilder setColumnNames(String[] columnNames, String updateColumn);
+ UpsertBuilder setColumnNames(String[] columnNames, String updateColumn);
}
diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/enums/ForeignKeyRule.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/enums/ForeignKeyRule.java
new file mode 100644
index 0000000..173308f
--- /dev/null
+++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/enums/ForeignKeyRule.java
@@ -0,0 +1,41 @@
+package cc.carm.lib.easysql.api.enums;
+
+public enum ForeignKeyRule {
+
+ /**
+ * 啥也不做
+ * 注意: 在Mysql中该选项实际上等同于采用默认的 {@link #RESTRICT} 设定!
+ */
+ NO_ACTION("NO ACTION"),
+
+ /**
+ * 拒绝删除要求,直到使用删除键值的辅助表被手工删除,并且没有参照时(这是默认设置,也是最安全的设置)
+ */
+ RESTRICT("RESTRICT"),
+
+ /**
+ * 修改包含与已删除键值有参照关系的所有记录,使用NULL值替换(只能用于已标记为NOT NULL的字段)
+ */
+ SET_NULL("SET NULL"),
+
+ /**
+ * 修改包含与已删除键值有参照关系的所有记录,使用默认值替换(只能用于设定了DEFAULT的字段)
+ */
+ SET_DEFAULT("SET DEFAULT"),
+
+ /**
+ * 级联删除,删除包含与已删除键值有参照关系的所有记录
+ */
+ CASCADE("CASCADE");
+
+ String ruleName;
+
+ ForeignKeyRule(String ruleName) {
+ this.ruleName = ruleName;
+ }
+
+ public String getRuleName() {
+ return ruleName;
+ }
+
+}
diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/enums/IndexType.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/enums/IndexType.java
new file mode 100644
index 0000000..0b2ea98
--- /dev/null
+++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/enums/IndexType.java
@@ -0,0 +1,41 @@
+package cc.carm.lib.easysql.api.enums;
+
+public enum IndexType {
+
+
+ /**
+ * 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。
+ *
因此,应该只为那些最经常出现在查询条件(WHERE column=)或排序条件(ORDER BY column)中的数据列创建索引。
+ *
只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。
+ */
+ INDEX("INDEX"),
+
+
+ /**
+ * 唯一索引 是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复,用于保证数据的唯一性。
+ */
+ UNIQUE_KEY("UNIQUE KEY"),
+
+ /**
+ * 主键索引 是唯一索引的特定类型。表中创建主键时自动创建的索引 。一个表只能建立一个主索引。
+ */
+ PRIMARY_KEY("PRIMARY KEY"),
+
+ /**
+ * 全文索引 主要用来查找文本中的关键字,而不是直接与索引中的值相比较。
+ *
请搭配 MATCH 等语句使用,而不是使用 WHERE - LIKE 。
+ *
全文索引只可用于 CHAR、 VARCHAR 与 TEXT 系列类型。
+ */
+ FULLTEXT_INDEX("FULLTEXT");
+
+
+ String name;
+
+ IndexType(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/enums/NumberType.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/enums/NumberType.java
new file mode 100644
index 0000000..19439f1
--- /dev/null
+++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/enums/NumberType.java
@@ -0,0 +1,11 @@
+package cc.carm.lib.easysql.api.enums;
+
+public enum NumberType {
+
+ TINYINT,
+ SMALLINT,
+ MEDIUMINT,
+ INT,
+ BIGINT
+
+}
diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/function/SQLExceptionHandler.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/function/SQLExceptionHandler.java
index ff6ef2a..150070d 100644
--- a/easysql-api/src/main/java/cc/carm/lib/easysql/api/function/SQLExceptionHandler.java
+++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/function/SQLExceptionHandler.java
@@ -7,5 +7,6 @@ import java.util.function.BiConsumer;
@FunctionalInterface
public interface SQLExceptionHandler extends BiConsumer> {
+
}
diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/function/impl/DefaultSQLExceptionHandler.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/function/defaults/DefaultSQLExceptionHandler.java
similarity index 69%
rename from easysql-api/src/main/java/cc/carm/lib/easysql/api/function/impl/DefaultSQLExceptionHandler.java
rename to easysql-api/src/main/java/cc/carm/lib/easysql/api/function/defaults/DefaultSQLExceptionHandler.java
index 307337f..9e3efca 100644
--- a/easysql-api/src/main/java/cc/carm/lib/easysql/api/function/impl/DefaultSQLExceptionHandler.java
+++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/function/defaults/DefaultSQLExceptionHandler.java
@@ -1,6 +1,7 @@
-package cc.carm.lib.easysql.api.function.impl;
+package cc.carm.lib.easysql.api.function.defaults;
import cc.carm.lib.easysql.api.SQLAction;
+import cc.carm.lib.easysql.api.action.SQLUpdateBatchAction;
import cc.carm.lib.easysql.api.function.SQLExceptionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -37,8 +38,18 @@ public class DefaultSQLExceptionHandler implements SQLExceptionHandler {
@Override
public void accept(SQLException exception, SQLAction> sqlAction) {
- getLogger().severe("Error when execute [" + sqlAction.getSQLContent() + "]");
- getLogger().severe(exception.getLocalizedMessage());
+ if (sqlAction instanceof SQLUpdateBatchAction) {
+
+ getLogger().severe("Error when execute SQLs : ");
+ int i = 1;
+ for (String content : ((SQLUpdateBatchAction) sqlAction).getSQLContents()) {
+ getLogger().severe("#" + i + " {" + content + "}");
+ i++;
+ }
+
+ } else {
+ getLogger().severe("Error when execute { " + sqlAction.getSQLContent() + " }");
+ }
exception.printStackTrace();
}
diff --git a/easysql-beecp/pom.xml b/easysql-beecp/pom.xml
index 6eacace..b1bbb9f 100644
--- a/easysql-beecp/pom.xml
+++ b/easysql-beecp/pom.xml
@@ -5,10 +5,17 @@
easysql-parent
cc.carm.lib
- 0.2.10
+ 0.3.0-SNAPSHOT
4.0.0
+
+ 11
+ 11
+ UTF-8
+ UTF-8
+
+
easysql-beecp
jar
@@ -45,14 +52,6 @@
${project.url}/actions/workflows/maven.yml
-
- 11
- 11
- UTF-8
- UTF-8
- true
-
-
diff --git a/easysql-demo/pom.xml b/easysql-demo/pom.xml
index 72ba230..e9df1aa 100644
--- a/easysql-demo/pom.xml
+++ b/easysql-demo/pom.xml
@@ -5,9 +5,18 @@
easysql-parent
cc.carm.lib
- 0.2.10
+ 0.3.0-SNAPSHOT
4.0.0
+
+
+ 11
+ 11
+ UTF-8
+ UTF-8
+ true
+ true
+
easysql-demo
jar
@@ -45,15 +54,6 @@
${project.url}/actions/workflows/maven.yml
-
- 11
- 11
- UTF-8
- UTF-8
- true
- true
-
-
diff --git a/easysql-demo/src/main/java/EasySQLDemo.java b/easysql-demo/src/main/java/EasySQLDemo.java
index c7b506c..dc00ac7 100644
--- a/easysql-demo/src/main/java/EasySQLDemo.java
+++ b/easysql-demo/src/main/java/EasySQLDemo.java
@@ -1,5 +1,8 @@
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.api.SQLQuery;
+import cc.carm.lib.easysql.api.enums.ForeignKeyRule;
+import cc.carm.lib.easysql.api.enums.IndexType;
+import cc.carm.lib.easysql.api.enums.NumberType;
import cc.carm.lib.easysql.api.util.TimeDateUtils;
import cc.carm.lib.easysql.api.util.UUIDUtil;
@@ -12,17 +15,39 @@ public class EasySQLDemo {
public void createTable(SQLManager sqlManager) {
// 同步创建表
sqlManager.createTable("users")
- .addColumn("id", "INT(11) AUTO_INCREMENT NOT NULL PRIMARY KEY")
+// .addColumn("id", "INT(11) AUTO_INCREMENT NOT NULL PRIMARY KEY")
+ .addAutoIncrementColumn("id", NumberType.INT, true, true)
.addColumn("uuid", "VARCHAR(32) NOT NULL UNIQUE KEY")
- .addColumn("username", "VARCHAR(16) NOT NULL UNIQUE KEY")
- .addColumn("age", "INT(3) NOT NULL DEFAULT 1")
+ .addColumn("username", "VARCHAR(16) NOT NULL")
+ .addColumn("age", "TINYINT NOT NULL DEFAULT 1")
.addColumn("email", "VARCHAR(32)")
.addColumn("phone", "VARCHAR(16)")
.addColumn("registerTime", "DATETIME NOT NULL")
- .addColumn("INDEX `phone`") // 添加索引
+// .addColumn("INDEX `phone`") // 原始方法添加索引
+ .setIndex(IndexType.UNIQUE_KEY, "username") // 添加唯一索引
+ .setIndex(IndexType.INDEX, "contact", "email", "phone") //添加联合索引 (示例)
+ .build().execute(null /* 不处理错误 */);
+
+ sqlManager.createTable("user_ipaddr")
+ .addAutoIncrementColumn("id", NumberType.INT, true, true)
+ .addColumn("uuid", "VARCHAR(32) NOT NULL")
+ .addColumn("ip", "VARCHAR(16)")
+ .addColumn("time", "DATETIME NOT NULL")
+ .addForeignKey("uuid", null,
+ "users", "uuid",
+ ForeignKeyRule.CASCADE, ForeignKeyRule.CASCADE
+ )
.build().execute(null /* 不处理错误 */);
}
+ public void alertTable(SQLManager sqlManager) {
+ // 同步更新表
+ sqlManager.alterTable("users")
+ .modifyColumn("age", "TINYINT NOT NULL DEFAULT 0")
+ .execute(null /* 不处理错误 */);
+ }
+
+
public void sqlQuery(SQLManager sqlManager) {
// 同步SQL查询
try (SQLQuery query = sqlManager.createQuery()
diff --git a/easysql-hikaricp/pom.xml b/easysql-hikaricp/pom.xml
index eb07d96..1e5c947 100644
--- a/easysql-hikaricp/pom.xml
+++ b/easysql-hikaricp/pom.xml
@@ -5,10 +5,17 @@
easysql-parent
cc.carm.lib
- 0.2.10
+ 0.3.0-SNAPSHOT
4.0.0
+
+ 11
+ 11
+ UTF-8
+ UTF-8
+
+
easysql-hikaricp
11-EasySQL-HikariCP
@@ -44,14 +51,6 @@
${project.url}/actions/workflows/maven.yml
-
- 11
- 11
- UTF-8
- UTF-8
- true
-
-
diff --git a/easysql-impl/pom.xml b/easysql-impl/pom.xml
index 495cb68..3756013 100644
--- a/easysql-impl/pom.xml
+++ b/easysql-impl/pom.xml
@@ -5,10 +5,17 @@
easysql-parent
cc.carm.lib
- 0.2.10
+ 0.3.0-SNAPSHOT
4.0.0
+
+ 11
+ 11
+ UTF-8
+ UTF-8
+
+
easysql-impl
jar
@@ -45,14 +52,6 @@
${project.url}/actions/workflows/maven.yml
-
- 11
- 11
- UTF-8
- UTF-8
- true
-
-
diff --git a/easysql-impl/src/main/java/cc/carm/lib/easysql/action/AbstractSQLAction.java b/easysql-impl/src/main/java/cc/carm/lib/easysql/action/AbstractSQLAction.java
index 2fe7d7d..2b07334 100644
--- a/easysql-impl/src/main/java/cc/carm/lib/easysql/action/AbstractSQLAction.java
+++ b/easysql-impl/src/main/java/cc/carm/lib/easysql/action/AbstractSQLAction.java
@@ -5,10 +5,8 @@ import cc.carm.lib.easysql.api.function.SQLExceptionHandler;
import cc.carm.lib.easysql.api.function.SQLHandler;
import cc.carm.lib.easysql.manager.SQLManagerImpl;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
import java.sql.SQLException;
-import java.util.Optional;
import java.util.UUID;
public abstract class AbstractSQLAction implements SQLAction {
@@ -20,8 +18,6 @@ public abstract class AbstractSQLAction implements SQLAction {
protected @NotNull String sqlContent;
- protected static @Nullable SQLExceptionHandler exceptionHandler = null;
-
public AbstractSQLAction(@NotNull SQLManagerImpl manager, @NotNull String sql) {
this(manager, sql, System.currentTimeMillis());
}
@@ -69,10 +65,11 @@ public abstract class AbstractSQLAction implements SQLAction {
}
protected void outputDebugMessage() {
- getManager().debug("#" + getShortID() + " ->" + getSQLContent());
+ getManager().debug("#" + getShortID() + " -> { " + getSQLContent() + " }");
}
@Override
+ @SuppressWarnings("FutureReturnValueIgnored")
public void executeAsync(SQLHandler success, SQLExceptionHandler failure) {
getManager().getExecutorPool().submit(() -> {
try {
diff --git a/easysql-impl/src/main/java/cc/carm/lib/easysql/action/SQLUpdateBatchActionImpl.java b/easysql-impl/src/main/java/cc/carm/lib/easysql/action/SQLUpdateBatchActionImpl.java
index 3223c76..6847afd 100644
--- a/easysql-impl/src/main/java/cc/carm/lib/easysql/action/SQLUpdateBatchActionImpl.java
+++ b/easysql-impl/src/main/java/cc/carm/lib/easysql/action/SQLUpdateBatchActionImpl.java
@@ -39,6 +39,7 @@ public class SQLUpdateBatchActionImpl
Connection connection = getManager().getConnection();
Statement statement = connection.createStatement();
outputDebugMessage();
+
for (String content : this.sqlContents) {
statement.addBatch(content);
}
@@ -50,4 +51,13 @@ public class SQLUpdateBatchActionImpl
return returnedValues;
}
+
+ @Override
+ protected void outputDebugMessage() {
+ getManager().debug("#" + getShortID() + " -> {");
+ for (String content : getSQLContents()) getManager().debug(" " + content);
+ getManager().debug("}");
+
+ }
+
}
diff --git a/easysql-impl/src/main/java/cc/carm/lib/easysql/action/query/PreparedQueryActionImpl.java b/easysql-impl/src/main/java/cc/carm/lib/easysql/action/query/PreparedQueryActionImpl.java
index fdacb68..8fcb292 100644
--- a/easysql-impl/src/main/java/cc/carm/lib/easysql/action/query/PreparedQueryActionImpl.java
+++ b/easysql-impl/src/main/java/cc/carm/lib/easysql/action/query/PreparedQueryActionImpl.java
@@ -50,8 +50,9 @@ public class PreparedQueryActionImpl extends QueryActionImpl implements Prepared
@Override
public @NotNull SQLQueryImpl execute() throws SQLException {
+ outputDebugMessage();
+
Connection connection = getManager().getConnection();
- getManager().debug("#" + getShortID() + " ->" + getSQLContent());
PreparedStatement preparedStatement;
if (handler == null) {
preparedStatement = StatementUtil.createPrepareStatement(connection, getSQLContent(), this.params);
@@ -60,8 +61,14 @@ public class PreparedQueryActionImpl extends QueryActionImpl implements Prepared
handler.accept(preparedStatement);
}
+ long executeTime = System.currentTimeMillis();
ResultSet resultSet = preparedStatement.executeQuery();
- return new SQLQueryImpl(getManager(), this, connection, preparedStatement, resultSet);
+ return new SQLQueryImpl(
+ getManager(), this,
+ connection, preparedStatement, resultSet,
+ executeTime
+ );
+
}
}
diff --git a/easysql-impl/src/main/java/cc/carm/lib/easysql/action/query/QueryActionImpl.java b/easysql-impl/src/main/java/cc/carm/lib/easysql/action/query/QueryActionImpl.java
index 4241e0b..3c41473 100644
--- a/easysql-impl/src/main/java/cc/carm/lib/easysql/action/query/QueryActionImpl.java
+++ b/easysql-impl/src/main/java/cc/carm/lib/easysql/action/query/QueryActionImpl.java
@@ -1,8 +1,8 @@
package cc.carm.lib.easysql.action.query;
import cc.carm.lib.easysql.action.AbstractSQLAction;
-import cc.carm.lib.easysql.api.action.query.QueryAction;
import cc.carm.lib.easysql.api.SQLQuery;
+import cc.carm.lib.easysql.api.action.query.QueryAction;
import cc.carm.lib.easysql.api.function.SQLExceptionHandler;
import cc.carm.lib.easysql.api.function.SQLHandler;
import cc.carm.lib.easysql.manager.SQLManagerImpl;
@@ -22,13 +22,20 @@ public class QueryActionImpl extends AbstractSQLAction implements Quer
@Override
public @NotNull SQLQueryImpl execute() throws SQLException {
+
Connection connection = getManager().getConnection();
Statement statement = connection.createStatement();
outputDebugMessage();
+ long executeTime = System.currentTimeMillis();
ResultSet resultSet = statement.executeQuery(getSQLContent());
- SQLQueryImpl query = new SQLQueryImpl(getManager(), this, connection, statement, resultSet);
+ SQLQueryImpl query = new SQLQueryImpl(
+ getManager(), this,
+ connection, statement, resultSet,
+ executeTime
+ );
+
getManager().getActiveQuery().put(getActionUUID(), query);
return query;
diff --git a/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/AbstractConditionalBuilder.java b/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/AbstractConditionalBuilder.java
index a779d61..f25533b 100644
--- a/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/AbstractConditionalBuilder.java
+++ b/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/AbstractConditionalBuilder.java
@@ -1,5 +1,6 @@
package cc.carm.lib.easysql.builder.impl;
+import cc.carm.lib.easysql.api.SQLAction;
import cc.carm.lib.easysql.api.builder.ConditionalBuilder;
import cc.carm.lib.easysql.builder.AbstractSQLBuilder;
import cc.carm.lib.easysql.manager.SQLManagerImpl;
@@ -13,132 +14,132 @@ import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
-public abstract class AbstractConditionalBuilder, T>
- extends AbstractSQLBuilder implements ConditionalBuilder {
+public abstract class AbstractConditionalBuilder, T extends SQLAction>>
+ extends AbstractSQLBuilder implements ConditionalBuilder {
- ArrayList conditionSQLs = new ArrayList<>();
- ArrayList