mirror of
https://github.com/CarmJos/EasySQL.git
synced 2024-09-19 21:35:47 +00:00
feat(table): 针对 SQLTable 进行重构与文档补充
[4.0.2] 针对 SQLTable 进行重构与文档补充
This commit is contained in:
commit
0d74b684e3
@ -5,10 +5,19 @@
|
|||||||
|
|
||||||
## 目录
|
## 目录
|
||||||
|
|
||||||
- [Bob的EasySQL之旅(HikariCP)](USAGE-HIKARI.md) `@Ghost-Chu`
|
### 文章
|
||||||
|
|
||||||
|
- [Bob的EasySQL之旅(HikariCP)](USAGE-HIKARI.md) `by @Ghost-Chu`
|
||||||
|
- [在**小项目中**推荐使用的**数据库表**实现方案](USAGE-TABLE.md) `by @CarmJos`
|
||||||
|
|
||||||
|
### 视频
|
||||||
|
|
||||||
|
- [EasySql快速操作Mysql数据库:我的世界插件开发](https://www.bilibili.com/video/BV1w34y1p7Xs) `by @Shinyoki`
|
||||||
|
|
||||||
## 实例项目
|
## 实例项目
|
||||||
以下是一些实例项目,可供各位参考。
|
以下是一些实例项目,可供各位参考。
|
||||||
|
|
||||||
- UltraDepository 超级仓库插件 `@CarmJos`
|
- UltraDepository 超级仓库插件 `@CarmJos`
|
||||||
- [storage/MySQLStorage](https://github.com/CarmJos/UltraDepository/blob/master/src/main/java/cc/carm/plugin/ultradepository/storage/impl/MySQLStorage.java)
|
- [storage/MySQLStorage](https://github.com/CarmJos/UltraDepository/blob/master/src/main/java/cc/carm/plugin/ultradepository/storage/impl/MySQLStorage.java)
|
||||||
|
- QuickShop-Hikari 快速商店插件 `@Ghost-Chu`
|
||||||
|
- [database/](https://github.com/Ghost-chu/QuickShop-Hikari/tree/hikari/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/database)
|
@ -1,6 +1,6 @@
|
|||||||
> 本文档由 GitHub 用户 @Ghost-chu 创建。
|
> 本文档由 GitHub 用户 @Ghost-chu 创建。
|
||||||
> 本文撰写于 2022/02/09,适配 EasySQL 版本 `v0.3.6`。
|
> 本文撰写于 2022/02/09,适配 EasySQL 版本 `v0.3.6` **(部分接口已变更)**。
|
||||||
> 本文基于 `EasySQL-HikariPool` 版本编写。
|
> 本文基于 `EasySQL-Hikari` 版本编写。
|
||||||
|
|
||||||
# EasySQL - HikariPool 使用指南
|
# EasySQL - HikariPool 使用指南
|
||||||
|
|
||||||
|
161
.documentation/USAGE-TABLE.md
Normal file
161
.documentation/USAGE-TABLE.md
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
> 本文档由 GitHub 用户 @CarmJos 创建。
|
||||||
|
> 本文撰写于 2022/07/01,基于 EasySQL 版本 `0.4.2` 。
|
||||||
|
|
||||||
|
# 在**小项目中**推荐使用的**数据库表**实现方案
|
||||||
|
|
||||||
|
|
||||||
|
## 简介
|
||||||
|
在小型项目中,我们常常需要编写数据库的表结构,并需要在开发中不断地参考、维护该结构。
|
||||||
|
|
||||||
|
在 EasySQL 中,我们提供了一个简单快捷的数据库表创建工具 `TableCreateBuilder` 。
|
||||||
|
基于该工具,又在后续版本中提供了 `SQLTable` 类用于快速针对指定表创建不同的数据库操作。
|
||||||
|
|
||||||
|
以下内容是我在许多项目中的使用方法,由于其 `便捷`、`易于管理` 且 `支持引用查询` ,我十分推荐您参考我的方案,并应用到自己的项目中。
|
||||||
|
|
||||||
|
### 实例项目:
|
||||||
|
- [QuickShop-Hikari (DataTables)](https://github.com/Ghost-chu/QuickShop-Hikari/blob/hikari/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/database/DataTables1.java)
|
||||||
|
|
||||||
|
## 利用 NamedSQLTable 快速创建枚举类以管理
|
||||||
|
|
||||||
|
这种方案的优势在于无需复制大量代码,仅需使用EasySQL已经提供的 `NamedSQLTable` 类快捷进行数据库操作。
|
||||||
|
|
||||||
|
首先,我们需要创建一个枚举类,[示例代码](../demo/src/main/java/DataTables1.java)如下所示:
|
||||||
|
|
||||||
|
```java
|
||||||
|
import cc.carm.lib.easysql.api.enums.IndexType;
|
||||||
|
import cc.carm.lib.easysql.api.enums.NumberType;
|
||||||
|
import cc.carm.lib.easysql.api.table.NamedSQLTable;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
public enum DataTables {
|
||||||
|
|
||||||
|
DATA(SQLTable.of("data", (table) -> {
|
||||||
|
table.addAutoIncrementColumn("id", true);
|
||||||
|
table.addColumn("user", "INT UNSIGNED NOT NULL");
|
||||||
|
table.addColumn("content", "TEXT NOT NULL");
|
||||||
|
table.addColumn("time", "DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP");
|
||||||
|
})),
|
||||||
|
|
||||||
|
USER(SQLTable.of("user", (table) -> {
|
||||||
|
table.addAutoIncrementColumn("id", NumberType.INT, true, true);
|
||||||
|
table.addColumn("uuid", "VARCHAR(32) NOT NULL UNIQUE KEY");
|
||||||
|
table.addColumn("username", "VARCHAR(16) NOT NULL");
|
||||||
|
table.addColumn("age", "TINYINT NOT NULL DEFAULT 1");
|
||||||
|
table.addColumn("email", "VARCHAR(32)");
|
||||||
|
table.addColumn("phone", "VARCHAR(16)");
|
||||||
|
table.addColumn("registerTime", "DATETIME NOT NULL");
|
||||||
|
table.setIndex("username", IndexType.UNIQUE_KEY); // 添加唯一索引
|
||||||
|
table.setIndex(IndexType.INDEX, "contact", "email", "phone"); //添加联合索引 (示例)
|
||||||
|
}));
|
||||||
|
|
||||||
|
private final NamedSQLTable table;
|
||||||
|
|
||||||
|
DataTables(NamedSQLTable table) {
|
||||||
|
this.table = table;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NamedSQLTable get() {
|
||||||
|
return this.table;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void initialize(@NotNull SQLManager manager, @Nullable String tablePrefix) {
|
||||||
|
for (DataTables value : values()) {
|
||||||
|
try {
|
||||||
|
value.get().create(manager, tablePrefix);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// 提示异常
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
随后,我们便可以在数据库初始化时调用 `DataTables#initialize(manager,tablePrefix)` 方法快捷的进行表的初始化。
|
||||||
|
|
||||||
|
初始化后,我们便可以通过 `DataTables#get()` 方法获取对应表的 `NamedSQLTable` 实例,以进行 `createQuery()` 等操作。
|
||||||
|
|
||||||
|
注意,NamedSQLTable同时提供了有SQLManager参数与无参的操作方法,其中无参方法将自动调用初始化时使用的SQLManager进行操作。
|
||||||
|
|
||||||
|
## 利用枚举类实现 SQLTable 进行操作
|
||||||
|
|
||||||
|
这种方法相较于前者代码量稍多些,但无需在每次使用时调用 `DataTables#get()` 方法获取 NamedSQLTable 实例,代码上更为简介。
|
||||||
|
|
||||||
|
且可以通过重写 `getTableName()` 方法来自行规定表前缀。
|
||||||
|
|
||||||
|
_该方法为本人最常用,也是最推荐的方法。_
|
||||||
|
|
||||||
|
[示例代码](../demo/src/main/java/DataTables2.java)如下:
|
||||||
|
|
||||||
|
```java
|
||||||
|
import cc.carm.lib.easysql.api.builder.TableCreateBuilder;
|
||||||
|
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;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public enum DataTables implements SQLTable {
|
||||||
|
|
||||||
|
USER((table) -> {
|
||||||
|
table.addAutoIncrementColumn("id", NumberType.INT, true, true);
|
||||||
|
table.addColumn("uuid", "VARCHAR(32) NOT NULL UNIQUE KEY");
|
||||||
|
table.addColumn("username", "VARCHAR(16) NOT NULL");
|
||||||
|
table.addColumn("age", "TINYINT NOT NULL DEFAULT 1");
|
||||||
|
table.addColumn("email", "VARCHAR(32)");
|
||||||
|
table.addColumn("phone", "VARCHAR(16)");
|
||||||
|
table.addColumn("registerTime", "DATETIME NOT NULL");
|
||||||
|
table.setIndex("username", IndexType.UNIQUE_KEY); // 添加唯一索引
|
||||||
|
table.setIndex(IndexType.INDEX, "contact", "email", "phone"); //添加联合索引 (示例)
|
||||||
|
});
|
||||||
|
|
||||||
|
private final Consumer<TableCreateBuilder> builder;
|
||||||
|
private @Nullable String tablePrefix;
|
||||||
|
private @Nullable SQLManager manager;
|
||||||
|
|
||||||
|
DataTables(Consumer<TableCreateBuilder> builder) {
|
||||||
|
this.builder = builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable SQLManager getSQLManager() {
|
||||||
|
return this.manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getTableName() {
|
||||||
|
// 这里直接选择用枚举的名称作为table的主名称
|
||||||
|
return (tablePrefix != null ? tablePrefix : "") + name().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean create(SQLManager sqlManager) throws SQLException {
|
||||||
|
return create(sqlManager, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean create(@NotNull SQLManager sqlManager, @Nullable String tablePrefix) throws SQLException {
|
||||||
|
if (this.manager == null) this.manager = sqlManager;
|
||||||
|
this.tablePrefix = tablePrefix;
|
||||||
|
|
||||||
|
TableCreateBuilder tableBuilder = sqlManager.createTable(getTableName());
|
||||||
|
if (builder != null) builder.accept(tableBuilder);
|
||||||
|
return tableBuilder.build().executeFunction(l -> l > 0, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void initialize(@NotNull SQLManager manager, @Nullable String tablePrefix) {
|
||||||
|
for (DataTables1 value : values()) {
|
||||||
|
try {
|
||||||
|
value.create(manager, tablePrefix);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// 提示异常
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
4
.github/workflows/deploy.yml
vendored
4
.github/workflows/deploy.yml
vendored
@ -83,14 +83,14 @@ jobs:
|
|||||||
rm -rf deploy
|
rm -rf deploy
|
||||||
mkdir -vp deploy
|
mkdir -vp deploy
|
||||||
cp -vrf $HOME/local-deploy/* deploy/
|
cp -vrf $HOME/local-deploy/* deploy/
|
||||||
cp -vrf .documentation/REPOSITORY-README.md deploy/README.md
|
cp -vrf .documentation/repository/README.md deploy/README.md
|
||||||
|
|
||||||
- name: "Copy Javadoc"
|
- name: "Copy Javadoc"
|
||||||
run: |
|
run: |
|
||||||
rm -rf docs
|
rm -rf docs
|
||||||
mkdir -vp docs
|
mkdir -vp docs
|
||||||
cp -vrf api/target/apidocs/* docs/
|
cp -vrf api/target/apidocs/* docs/
|
||||||
cp -vrf .documentation/JAVADOC-README.md docs/README.md
|
cp -vrf .documentation/javadoc/README.md docs/README.md
|
||||||
|
|
||||||
- name: "Generate the Javadoc sitemap"
|
- name: "Generate the Javadoc sitemap"
|
||||||
id: sitemap
|
id: sitemap
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<artifactId>easysql-parent</artifactId>
|
<artifactId>easysql-parent</artifactId>
|
||||||
<version>0.4.1</version>
|
<version>0.4.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
@ -4,26 +4,28 @@ 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.builder.*;
|
import cc.carm.lib.easysql.api.builder.*;
|
||||||
import cc.carm.lib.easysql.api.function.SQLHandler;
|
import cc.carm.lib.easysql.api.function.SQLHandler;
|
||||||
|
import cc.carm.lib.easysql.api.table.NamedSQLTable;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SQLTable 基于 {@link TableCreateBuilder} 构建表,用于快速创建与该表相关的操作。
|
* SQLTable 基于 {@link TableCreateBuilder} 构建表,用于快速创建与该表相关的操作。
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>1. 调用 {@link SQLTable#of(String, String[])} 方法创建一个 SQLTable 对象;</li>
|
* <li>1. 调用 {@link NamedSQLTable#of(String, String[])} 方法创建一个 SQLTable 对象;</li>
|
||||||
* <li>2. 在应用初始化阶段调用 {@link SQLTable#create(SQLManager)} 方法初始化 SQLTable 对象;</li>
|
* <li>2. 在应用初始化阶段调用 {@link NamedSQLTable#create(SQLManager)} 方法初始化 SQLTable 对象;</li>
|
||||||
* <li>3. 获取已创建的{@link SQLTable} 实例,直接调用对应方法进行关于表的相关操作。</li>
|
* <li>3. 获取已创建的{@link NamedSQLTable} 实例,直接调用对应方法进行关于表的相关操作。</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* @author CarmJos
|
* @author CarmJos
|
||||||
* @since 0.3.10
|
* @since 0.3.10
|
||||||
*/
|
*/
|
||||||
public abstract class SQLTable {
|
public interface SQLTable {
|
||||||
|
|
||||||
public static @NotNull SQLTable of(@NotNull String tableName, @Nullable SQLHandler<TableCreateBuilder> table) {
|
static @NotNull NamedSQLTable of(@NotNull String tableName, @Nullable SQLHandler<TableCreateBuilder> table) {
|
||||||
return new SQLTable(tableName) {
|
return new NamedSQLTable(tableName) {
|
||||||
@Override
|
@Override
|
||||||
public boolean create(@NotNull SQLManager sqlManager, String tablePrefix) throws SQLException {
|
public boolean create(@NotNull SQLManager sqlManager, String tablePrefix) throws SQLException {
|
||||||
if (this.manager == null) this.manager = sqlManager;
|
if (this.manager == null) this.manager = sqlManager;
|
||||||
@ -36,11 +38,11 @@ public abstract class SQLTable {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @NotNull SQLTable of(@NotNull String tableName, @NotNull String[] columns) {
|
static @NotNull NamedSQLTable of(@NotNull String tableName, @NotNull String[] columns) {
|
||||||
return of(tableName, columns, null);
|
return of(tableName, columns, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @NotNull SQLTable of(@NotNull String tableName,
|
static @NotNull NamedSQLTable of(@NotNull String tableName,
|
||||||
@NotNull String[] columns, @Nullable String tableSettings) {
|
@NotNull String[] columns, @Nullable String tableSettings) {
|
||||||
return of(tableName, builder -> {
|
return of(tableName, builder -> {
|
||||||
builder.setColumns(columns);
|
builder.setColumns(columns);
|
||||||
@ -48,96 +50,101 @@ public abstract class SQLTable {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private final @NotNull String tableName;
|
/**
|
||||||
|
* 以指定的 {@link SQLManager} 实例初始化并创建该表
|
||||||
protected String tablePrefix;
|
*
|
||||||
protected SQLManager manager;
|
* @param sqlManager {@link SQLManager} 实例
|
||||||
|
* @return 是否新创建了本表 (若已创建或创建失败则返回false)
|
||||||
|
* @throws SQLException 当数据库返回异常时抛出
|
||||||
|
*/
|
||||||
|
boolean create(SQLManager sqlManager) throws SQLException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请调用 {@link SQLTable} 下的静态方法进行对象的初始化。
|
* 得到 {@link #create(SQLManager)} 用于初始化本实例的 {@link SQLManager} 实例
|
||||||
*
|
*
|
||||||
* @param tableName 该表的名称
|
* @return {@link SQLManager} 实例
|
||||||
*/
|
*/
|
||||||
private SQLTable(@NotNull String tableName) {
|
@Nullable SQLManager getSQLManager();
|
||||||
this.tableName = tableName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public @NotNull String getTableName() {
|
|
||||||
return (tablePrefix != null ? tablePrefix : "") + tableName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 使用指定 SQLManager 进行本示例的初始化。
|
* 得到本表表名,不得为空。
|
||||||
*
|
*
|
||||||
* @param sqlManager {@link SQLManager}
|
* @return 本表表名
|
||||||
* @param tablePrefix 表名前缀
|
|
||||||
* @return 本表是否为首次创建
|
|
||||||
* @throws SQLException 出现任何错误时抛出
|
|
||||||
*/
|
*/
|
||||||
public abstract boolean create(@NotNull SQLManager sqlManager, @Nullable String tablePrefix) throws SQLException;
|
@NotNull String getTableName();
|
||||||
|
|
||||||
public boolean create(@NotNull SQLManager sqlManager) throws SQLException {
|
default @NotNull TableQueryBuilder createQuery() {
|
||||||
return create(manager, null);
|
return Optional.ofNullable(getSQLManager()).map(this::createQuery)
|
||||||
|
.orElseThrow(() -> new NullPointerException("This table doesn't have a SQLManger."));
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull TableQueryBuilder createQuery(@NotNull SQLManager sqlManager) {
|
default @NotNull TableQueryBuilder createQuery(@NotNull SQLManager sqlManager) {
|
||||||
return sqlManager.createQuery().inTable(getTableName());
|
return sqlManager.createQuery().inTable(getTableName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull TableQueryBuilder createQuery() {
|
default @NotNull DeleteBuilder createDelete() {
|
||||||
return createQuery(this.manager);
|
return Optional.ofNullable(getSQLManager()).map(this::createDelete)
|
||||||
|
.orElseThrow(() -> new NullPointerException("This table doesn't have a SQLManger."));
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull DeleteBuilder createDelete() {
|
default @NotNull DeleteBuilder createDelete(@NotNull SQLManager sqlManager) {
|
||||||
return createDelete(this.manager);
|
|
||||||
}
|
|
||||||
|
|
||||||
public @NotNull DeleteBuilder createDelete(@NotNull SQLManager sqlManager) {
|
|
||||||
return sqlManager.createDelete(getTableName());
|
return sqlManager.createDelete(getTableName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull UpdateBuilder createUpdate() {
|
default @NotNull UpdateBuilder createUpdate() {
|
||||||
return createUpdate(this.manager);
|
return Optional.ofNullable(getSQLManager()).map(this::createUpdate)
|
||||||
|
.orElseThrow(() -> new NullPointerException("This table doesn't have a SQLManger."));
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull UpdateBuilder createUpdate(@NotNull SQLManager sqlManager) {
|
default @NotNull UpdateBuilder createUpdate(@NotNull SQLManager sqlManager) {
|
||||||
return sqlManager.createUpdate(getTableName());
|
return sqlManager.createUpdate(getTableName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default @NotNull InsertBuilder<PreparedSQLUpdateAction<Integer>> createInsert() {
|
||||||
public @NotNull InsertBuilder<PreparedSQLUpdateAction<Integer>> createInsert() {
|
return Optional.ofNullable(getSQLManager()).map(this::createInsert)
|
||||||
return createInsert(this.manager);
|
.orElseThrow(() -> new NullPointerException("This table doesn't have a SQLManger."));
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull InsertBuilder<PreparedSQLUpdateAction<Integer>> createInsert(@NotNull SQLManager sqlManager) {
|
default @NotNull InsertBuilder<PreparedSQLUpdateAction<Integer>> createInsert(@NotNull SQLManager sqlManager) {
|
||||||
return sqlManager.createInsert(getTableName());
|
return sqlManager.createInsert(getTableName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default @NotNull InsertBuilder<PreparedSQLUpdateBatchAction<Integer>> createInsertBatch() {
|
||||||
public @NotNull InsertBuilder<PreparedSQLUpdateBatchAction<Integer>> createInsertBatch() {
|
return Optional.ofNullable(getSQLManager()).map(this::createInsertBatch)
|
||||||
return createInsertBatch(this.manager);
|
.orElseThrow(() -> new NullPointerException("This table doesn't have a SQLManger."));
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull InsertBuilder<PreparedSQLUpdateBatchAction<Integer>> createInsertBatch(@NotNull SQLManager sqlManager) {
|
default @NotNull InsertBuilder<PreparedSQLUpdateBatchAction<Integer>> createInsertBatch(@NotNull SQLManager sqlManager) {
|
||||||
return sqlManager.createInsertBatch(getTableName());
|
return sqlManager.createInsertBatch(getTableName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default @NotNull ReplaceBuilder<PreparedSQLUpdateAction<Integer>> createReplace() {
|
||||||
|
return Optional.ofNullable(getSQLManager()).map(this::createReplace)
|
||||||
|
.orElseThrow(() -> new NullPointerException("This table doesn't have a SQLManger."));
|
||||||
|
|
||||||
public @NotNull ReplaceBuilder<PreparedSQLUpdateAction<Integer>> createReplace() {
|
|
||||||
return createReplace(this.manager);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull ReplaceBuilder<PreparedSQLUpdateAction<Integer>> createReplace(@NotNull SQLManager sqlManager) {
|
default @NotNull ReplaceBuilder<PreparedSQLUpdateAction<Integer>> createReplace(@NotNull SQLManager sqlManager) {
|
||||||
return sqlManager.createReplace(getTableName());
|
return Optional.ofNullable(getSQLManager()).map(this::createReplace)
|
||||||
|
.orElseThrow(() -> new NullPointerException("This table doesn't have a SQLManger."));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default @NotNull ReplaceBuilder<PreparedSQLUpdateBatchAction<Integer>> createReplaceBatch() {
|
||||||
public @NotNull ReplaceBuilder<PreparedSQLUpdateBatchAction<Integer>> createReplaceBatch() {
|
return Optional.ofNullable(getSQLManager()).map(this::createReplaceBatch)
|
||||||
return createReplaceBatch(this.manager);
|
.orElseThrow(() -> new NullPointerException("This table doesn't have a SQLManger."));
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull ReplaceBuilder<PreparedSQLUpdateBatchAction<Integer>> createReplaceBatch(@NotNull SQLManager sqlManager) {
|
default @NotNull ReplaceBuilder<PreparedSQLUpdateBatchAction<Integer>> createReplaceBatch(@NotNull SQLManager sqlManager) {
|
||||||
return sqlManager.createReplaceBatch(getTableName());
|
return sqlManager.createReplaceBatch(getTableName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default @NotNull TableAlterBuilder alter() {
|
||||||
|
return Optional.ofNullable(getSQLManager()).map(this::alter)
|
||||||
|
.orElseThrow(() -> new NullPointerException("This table doesn't have a SQLManger."));
|
||||||
|
}
|
||||||
|
|
||||||
|
default @NotNull TableAlterBuilder alter(@NotNull SQLManager sqlManager) {
|
||||||
|
return sqlManager.alterTable(getTableName());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,50 @@
|
|||||||
|
package cc.carm.lib.easysql.api.table;
|
||||||
|
|
||||||
|
import cc.carm.lib.easysql.api.SQLManager;
|
||||||
|
import cc.carm.lib.easysql.api.SQLTable;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class NamedSQLTable implements SQLTable {
|
||||||
|
|
||||||
|
private final @NotNull String tableName;
|
||||||
|
|
||||||
|
protected @Nullable String tablePrefix;
|
||||||
|
protected @Nullable SQLManager manager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 请调用 {@link NamedSQLTable} 下的静态方法进行对象的初始化。
|
||||||
|
*
|
||||||
|
* @param tableName 该表的名称
|
||||||
|
*/
|
||||||
|
public NamedSQLTable(@NotNull String tableName) {
|
||||||
|
this.tableName = tableName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NotNull String getTableName() {
|
||||||
|
return (tablePrefix != null ? tablePrefix : "") + tableName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable SQLManager getSQLManager() {
|
||||||
|
return this.manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用指定 SQLManager 进行本示例的初始化。
|
||||||
|
*
|
||||||
|
* @param sqlManager {@link SQLManager}
|
||||||
|
* @param tablePrefix 表名前缀
|
||||||
|
* @return 本表是否为首次创建
|
||||||
|
* @throws SQLException 出现任何错误时抛出
|
||||||
|
*/
|
||||||
|
public abstract boolean create(@NotNull SQLManager sqlManager, @Nullable String tablePrefix) throws SQLException;
|
||||||
|
|
||||||
|
public boolean create(@NotNull SQLManager sqlManager) throws SQLException {
|
||||||
|
return create(sqlManager, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>easysql-parent</artifactId>
|
<artifactId>easysql-parent</artifactId>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<version>0.4.1</version>
|
<version>0.4.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
52
demo/src/main/java/DataTables1.java
Normal file
52
demo/src/main/java/DataTables1.java
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import cc.carm.lib.easysql.api.SQLManager;
|
||||||
|
import cc.carm.lib.easysql.api.SQLTable;
|
||||||
|
import cc.carm.lib.easysql.api.enums.IndexType;
|
||||||
|
import cc.carm.lib.easysql.api.enums.NumberType;
|
||||||
|
import cc.carm.lib.easysql.api.table.NamedSQLTable;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
public enum DataTables1 {
|
||||||
|
|
||||||
|
DATA(SQLTable.of("data", (table) -> {
|
||||||
|
table.addAutoIncrementColumn("id", true);
|
||||||
|
table.addColumn("user", "INT UNSIGNED NOT NULL");
|
||||||
|
table.addColumn("content", "TEXT NOT NULL");
|
||||||
|
table.addColumn("time", "DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP");
|
||||||
|
})),
|
||||||
|
|
||||||
|
USER(SQLTable.of("user", (table) -> {
|
||||||
|
table.addAutoIncrementColumn("id", NumberType.INT, true, true);
|
||||||
|
table.addColumn("uuid", "VARCHAR(32) NOT NULL UNIQUE KEY");
|
||||||
|
table.addColumn("username", "VARCHAR(16) NOT NULL");
|
||||||
|
table.addColumn("age", "TINYINT NOT NULL DEFAULT 1");
|
||||||
|
table.addColumn("email", "VARCHAR(32)");
|
||||||
|
table.addColumn("phone", "VARCHAR(16)");
|
||||||
|
table.addColumn("registerTime", "DATETIME NOT NULL");
|
||||||
|
table.setIndex("username", IndexType.UNIQUE_KEY); // 添加唯一索引
|
||||||
|
table.setIndex(IndexType.INDEX, "contact", "email", "phone"); //添加联合索引 (示例)
|
||||||
|
}));
|
||||||
|
|
||||||
|
private final NamedSQLTable table;
|
||||||
|
|
||||||
|
DataTables1(NamedSQLTable table) {
|
||||||
|
this.table = table;
|
||||||
|
}
|
||||||
|
|
||||||
|
public NamedSQLTable get() {
|
||||||
|
return this.table;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void initialize(@NotNull SQLManager manager, @Nullable String tablePrefix) {
|
||||||
|
for (DataTables1 value : values()) {
|
||||||
|
try {
|
||||||
|
value.get().create(manager, tablePrefix);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// 提示异常
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
69
demo/src/main/java/DataTables2.java
Normal file
69
demo/src/main/java/DataTables2.java
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import cc.carm.lib.easysql.api.SQLManager;
|
||||||
|
import cc.carm.lib.easysql.api.SQLTable;
|
||||||
|
import cc.carm.lib.easysql.api.builder.TableCreateBuilder;
|
||||||
|
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;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public enum DataTables2 implements SQLTable {
|
||||||
|
|
||||||
|
USER((table) -> {
|
||||||
|
table.addAutoIncrementColumn("id", NumberType.INT, true, true);
|
||||||
|
table.addColumn("uuid", "VARCHAR(32) NOT NULL UNIQUE KEY");
|
||||||
|
table.addColumn("username", "VARCHAR(16) NOT NULL");
|
||||||
|
table.addColumn("age", "TINYINT NOT NULL DEFAULT 1");
|
||||||
|
table.addColumn("email", "VARCHAR(32)");
|
||||||
|
table.addColumn("phone", "VARCHAR(16)");
|
||||||
|
table.addColumn("registerTime", "DATETIME NOT NULL");
|
||||||
|
table.setIndex("username", IndexType.UNIQUE_KEY); // 添加唯一索引
|
||||||
|
table.setIndex(IndexType.INDEX, "contact", "email", "phone"); //添加联合索引 (示例)
|
||||||
|
});
|
||||||
|
|
||||||
|
private final Consumer<TableCreateBuilder> builder;
|
||||||
|
private @Nullable String tablePrefix;
|
||||||
|
private @Nullable SQLManager manager;
|
||||||
|
|
||||||
|
DataTables2(Consumer<TableCreateBuilder> builder) {
|
||||||
|
this.builder = builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable SQLManager getSQLManager() {
|
||||||
|
return this.manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getTableName() {
|
||||||
|
// 这里直接选择用枚举的名称作为table的主名称
|
||||||
|
return (tablePrefix != null ? tablePrefix : "") + name().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean create(SQLManager sqlManager) throws SQLException {
|
||||||
|
return create(sqlManager, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean create(@NotNull SQLManager sqlManager, @Nullable String tablePrefix) throws SQLException {
|
||||||
|
if (this.manager == null) this.manager = sqlManager;
|
||||||
|
this.tablePrefix = tablePrefix;
|
||||||
|
|
||||||
|
TableCreateBuilder tableBuilder = sqlManager.createTable(getTableName());
|
||||||
|
if (builder != null) builder.accept(tableBuilder);
|
||||||
|
return tableBuilder.build().executeFunction(l -> l > 0, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void initialize(@NotNull SQLManager manager, @Nullable String tablePrefix) {
|
||||||
|
for (DataTables2 value : values()) {
|
||||||
|
try {
|
||||||
|
value.create(manager, tablePrefix);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// 提示异常
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>easysql-parent</artifactId>
|
<artifactId>easysql-parent</artifactId>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<version>0.4.1</version>
|
<version>0.4.2</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
2
pom.xml
2
pom.xml
@ -19,7 +19,7 @@
|
|||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<artifactId>easysql-parent</artifactId>
|
<artifactId>easysql-parent</artifactId>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<version>0.4.1</version>
|
<version>0.4.2</version>
|
||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
<module>api</module>
|
<module>api</module>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>easysql-parent</artifactId>
|
<artifactId>easysql-parent</artifactId>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<version>0.4.1</version>
|
<version>0.4.2</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>easysql-parent</artifactId>
|
<artifactId>easysql-parent</artifactId>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<version>0.4.1</version>
|
<version>0.4.2</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
Loading…
Reference in New Issue
Block a user