From 5601d1288c991f4c283c539f914183eeee43925e Mon Sep 17 00:00:00 2001 From: CarmJos Date: Fri, 7 Jan 2022 23:01:44 +0800 Subject: [PATCH] =?UTF-8?q?[v0.2.6]=20=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=20-=20[U]=20=E4=BC=98=E5=8C=96=20ConditionalBuilder=20?= =?UTF-8?q?=E7=9A=84=E4=BD=BF=E7=94=A8=E6=96=B9=E5=BC=8F=E3=80=82=20-=20[A?= =?UTF-8?q?]=20=E4=B8=BA=20TableQueryBuilder=20=E6=B7=BB=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E8=A1=A8=E6=9F=A5=E8=AF=A2limit=E6=96=B9=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cc/carm/lib/easysql/api/SQLManager.java | 2 + .../api/builder/ConditionalBuilder.java | 22 +++++------ .../easysql/api/builder/DeleteBuilder.java | 2 +- .../lib/easysql/api/builder/QueryBuilder.java | 5 ++- .../api/builder/TableQueryBuilder.java | 18 ++++++++- .../easysql/api/builder/UpdateBuilder.java | 2 +- .../impl/AbstractConditionalBuilder.java | 37 ++++++++++--------- .../builder/impl/DeleteBuilderImpl.java | 7 +++- .../builder/impl/TableQueryBuilderImpl.java | 24 ++++++++++-- .../builder/impl/UpdateBuilderImpl.java | 6 ++- 10 files changed, 86 insertions(+), 39 deletions(-) diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/SQLManager.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/SQLManager.java index da2c543..0ac0ece 100644 --- a/easysql-api/src/main/java/cc/carm/lib/easysql/api/SQLManager.java +++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/SQLManager.java @@ -49,6 +49,7 @@ public interface SQLManager { /** * 执行一条不需要返回结果的SQL语句(多用于UPDATE、REPLACE、DELETE方法) + * 该方法使用 Statement 实现,请注意SQL注入风险! * * @param sql SQL语句内容 * @return 更新的行数 @@ -79,6 +80,7 @@ public interface SQLManager { /** * 执行多条不需要返回结果的SQL。 + * 该方法使用 Statement 实现,请注意SQL注入风险! * * @param sql SQL语句内容 * @param moreSQL 更多SQL语句内容 diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/ConditionalBuilder.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/ConditionalBuilder.java index 3743c02..4d23a12 100644 --- a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/ConditionalBuilder.java +++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/ConditionalBuilder.java @@ -7,36 +7,36 @@ import org.jetbrains.annotations.Nullable; import java.util.Date; import java.util.LinkedHashMap; -public interface ConditionalBuilder extends SQLBuilder { +public interface ConditionalBuilder, T> extends SQLBuilder { T build(); - ConditionalBuilder setLimit(int limit); + B setLimit(int limit); - ConditionalBuilder setConditions(@Nullable String condition); + B setConditions(@Nullable String condition); - ConditionalBuilder setConditions(LinkedHashMap<@NotNull String, @Nullable Object> conditionSQLs); + B setConditions(LinkedHashMap<@NotNull String, @Nullable Object> conditionSQLs); - ConditionalBuilder addCondition(@Nullable String condition); + B addCondition(@Nullable String condition); - ConditionalBuilder addCondition(@NotNull String queryName, @NotNull String operator, @Nullable Object queryValue); + B addCondition(@NotNull String queryName, @NotNull String operator, @Nullable Object queryValue); - default ConditionalBuilder addCondition(@NotNull String queryName, @Nullable Object queryValue) { + default B addCondition(@NotNull String queryName, @Nullable Object queryValue) { return addCondition(queryName, "=", queryValue); } - ConditionalBuilder addCondition(@NotNull String[] queryNames, @Nullable Object[] queryValues); + B addCondition(@NotNull String[] queryNames, @Nullable Object[] queryValues); - ConditionalBuilder addNotNullCondition(@NotNull String queryName); + B addNotNullCondition(@NotNull String queryName); - default ConditionalBuilder addTimeCondition(@NotNull String queryName, long startMillis, long endMillis) { + default B addTimeCondition(@NotNull String queryName, long startMillis, long endMillis) { return addTimeCondition(queryName, startMillis > 0 ? new Date(startMillis) : null, endMillis > 0 ? new Date(endMillis) : null ); } - ConditionalBuilder addTimeCondition(@NotNull String queryName, @Nullable java.util.Date startDate, @Nullable java.util.Date endDate); + B addTimeCondition(@NotNull String queryName, @Nullable java.util.Date startDate, @Nullable java.util.Date endDate); } diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/DeleteBuilder.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/DeleteBuilder.java index c107f8f..b91cad7 100644 --- a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/DeleteBuilder.java +++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/DeleteBuilder.java @@ -2,7 +2,7 @@ package cc.carm.lib.easysql.api.builder; import cc.carm.lib.easysql.api.action.PreparedSQLUpdateAction; -public interface DeleteBuilder extends ConditionalBuilder { +public interface DeleteBuilder extends ConditionalBuilder { String getTableName(); diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/QueryBuilder.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/QueryBuilder.java index ddacc6a..4908312 100644 --- a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/QueryBuilder.java +++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/QueryBuilder.java @@ -8,11 +8,12 @@ import org.jetbrains.annotations.NotNull; public interface QueryBuilder extends SQLBuilder { /** - * 通过一条 SQL语句创建查询 + * 通过一条 SQL语句创建查询。 + * 该方法使用 Statement 实现,请注意SQL注入风险! * * @param sql SQL语句 * @return {@link QueryAction} - * @deprecated 存在SQL注入风险,请使用 {@link QueryBuilder#withPreparedSQL(String)} + * @deprecated 存在SQL注入风险,建议使用 {@link QueryBuilder#withPreparedSQL(String)} */ @Deprecated QueryAction withSQL(@NotNull String sql); diff --git a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/TableQueryBuilder.java b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/TableQueryBuilder.java index a9e50a9..0be6cbe 100644 --- a/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/TableQueryBuilder.java +++ b/easysql-api/src/main/java/cc/carm/lib/easysql/api/builder/TableQueryBuilder.java @@ -3,10 +3,16 @@ package cc.carm.lib.easysql.api.builder; import cc.carm.lib.easysql.api.action.query.PreparedQueryAction; import org.jetbrains.annotations.NotNull; -public interface TableQueryBuilder extends ConditionalBuilder { +public interface TableQueryBuilder extends ConditionalBuilder { @NotNull String getTableName(); + /** + * 选定用于查询的列名 + * + * @param columnNames 列名 + * @return {@link TableQueryBuilder} + */ TableQueryBuilder selectColumns(@NotNull String... columnNames); /** @@ -18,4 +24,14 @@ public interface TableQueryBuilder extends ConditionalBuilder { +public interface UpdateBuilder extends ConditionalBuilder { String getTableName(); 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 0a16231..04e98d2 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 @@ -13,7 +13,8 @@ import java.util.Date; import java.util.Iterator; import java.util.LinkedHashMap; -public abstract class AbstractConditionalBuilder extends AbstractSQLBuilder implements ConditionalBuilder { +public abstract class AbstractConditionalBuilder, T> + extends AbstractSQLBuilder implements ConditionalBuilder { ArrayList conditionSQLs = new ArrayList<>(); ArrayList conditionParams = new ArrayList<>(); @@ -23,39 +24,41 @@ public abstract class AbstractConditionalBuilder extends AbstractSQLBuilder i super(manager); } + protected abstract B getThis(); + @Override - public AbstractConditionalBuilder setConditions(@Nullable String condition) { + public B setConditions(@Nullable String condition) { this.conditionSQLs = new ArrayList<>(); this.conditionParams = new ArrayList<>(); if (condition != null) this.conditionSQLs.add(condition); - return this; + return getThis(); } @Override - public AbstractConditionalBuilder setConditions( + public B setConditions( LinkedHashMap<@NotNull String, @Nullable Object> conditions ) { conditions.forEach(this::addCondition); - return this; + return getThis(); } @Override - public AbstractConditionalBuilder addCondition(@Nullable String condition) { + public B addCondition(@Nullable String condition) { this.conditionSQLs.add(condition); - return this; + return getThis(); } @Override - public AbstractConditionalBuilder addCondition( + public B addCondition( @NotNull String queryName, @NotNull String operator, @Nullable Object queryValue ) { addCondition("`" + queryName + "` " + operator + " ?"); this.conditionParams.add(queryValue); - return this; + return getThis(); } @Override - public AbstractConditionalBuilder addCondition( + public B addCondition( @NotNull String[] queryNames, @Nullable Object[] queryValues ) { if (queryNames.length != queryValues.length) { @@ -64,21 +67,21 @@ public abstract class AbstractConditionalBuilder extends AbstractSQLBuilder i for (int i = 0; i < queryNames.length; i++) { addCondition(queryNames[i], queryValues[i]); } - return this; + return getThis(); } @Override - public AbstractConditionalBuilder addNotNullCondition(@NotNull String queryName) { + public B addNotNullCondition(@NotNull String queryName) { return addCondition("`" + queryName + "` IS NOT NULL"); } @Override - public AbstractConditionalBuilder addTimeCondition( + public B addTimeCondition( @NotNull String queryName, @Nullable Date startDate, @Nullable Date endDate ) { - if (startDate == null && endDate == null) return this; // 都不限定时间,不用判断了 + if (startDate == null && endDate == null) return getThis(); // 都不限定时间,不用判断了 if (startDate != null) { addCondition("`" + queryName + "` BETWEEN ? AND ?"); this.conditionParams.add(startDate); @@ -96,14 +99,14 @@ public abstract class AbstractConditionalBuilder extends AbstractSQLBuilder i } else { addCondition(queryName, "<=", endDate); } - return this; + return getThis(); } @Override - public AbstractConditionalBuilder setLimit(int limit) { + public B setLimit(int limit) { this.limit = limit; - return this; + return getThis(); } protected String buildConditionSQL() { diff --git a/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/DeleteBuilderImpl.java b/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/DeleteBuilderImpl.java index 760aa5b..43e1832 100644 --- a/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/DeleteBuilderImpl.java +++ b/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/DeleteBuilderImpl.java @@ -7,7 +7,7 @@ import cc.carm.lib.easysql.manager.SQLManagerImpl; import org.jetbrains.annotations.NotNull; public class DeleteBuilderImpl - extends AbstractConditionalBuilder + extends AbstractConditionalBuilder implements DeleteBuilder { String tableName; @@ -39,4 +39,9 @@ public class DeleteBuilderImpl } + @Override + protected DeleteBuilderImpl getThis() { + return this; + } + } diff --git a/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/TableQueryBuilderImpl.java b/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/TableQueryBuilderImpl.java index 600c287..2d8e61a 100644 --- a/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/TableQueryBuilderImpl.java +++ b/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/TableQueryBuilderImpl.java @@ -7,10 +7,8 @@ import cc.carm.lib.easysql.manager.SQLManagerImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; - public class TableQueryBuilderImpl - extends AbstractConditionalBuilder + extends AbstractConditionalBuilder implements TableQueryBuilder { @NotNull String tableName; @@ -19,6 +17,8 @@ public class TableQueryBuilderImpl @Nullable String orderBy; + int[] pageLimit; + public TableQueryBuilderImpl(@NotNull SQLManagerImpl manager, @NotNull String tableName) { super(manager); this.tableName = tableName; @@ -44,7 +44,13 @@ public class TableQueryBuilderImpl sqlBuilder.append("`").append(tableName).append("`"); if (hasConditions()) sqlBuilder.append(" ").append(buildConditionSQL()); - if (limit > 0) sqlBuilder.append(" ").append(buildLimitSQL()); + + if (pageLimit != null && pageLimit.length == 2) { + sqlBuilder.append(" LIMIT ").append(pageLimit[0]).append(",").append(pageLimit[1]); + } else if (limit > 0) { + sqlBuilder.append(" ").append(buildLimitSQL()); + } + if (orderBy != null) sqlBuilder.append(orderBy); return new PreparedQueryActionImpl(getManager(), sqlBuilder.toString()) @@ -68,4 +74,14 @@ public class TableQueryBuilderImpl return this; } + @Override + public TableQueryBuilder setPageLimit(int start, int end) { + this.pageLimit = new int[]{start, end}; + return this; + } + + @Override + protected TableQueryBuilderImpl getThis() { + return this; + } } diff --git a/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/UpdateBuilderImpl.java b/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/UpdateBuilderImpl.java index d9fdb61..1c7117c 100644 --- a/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/UpdateBuilderImpl.java +++ b/easysql-impl/src/main/java/cc/carm/lib/easysql/builder/impl/UpdateBuilderImpl.java @@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull; import java.util.*; public class UpdateBuilderImpl - extends AbstractConditionalBuilder + extends AbstractConditionalBuilder implements UpdateBuilder { String tableName; @@ -73,4 +73,8 @@ public class UpdateBuilderImpl } + @Override + protected UpdateBuilder getThis() { + return this; + } }