1
mirror of https://github.com/CarmJos/EasySQL.git synced 2024-09-19 21:35:47 +00:00

[v0.2.6] 版本更新

- [U] 优化 ConditionalBuilder 的使用方式。
- [A] 为 TableQueryBuilder 添加分表查询limit方法。
This commit is contained in:
Carm Jos 2022-01-07 23:01:44 +08:00
parent 50b36d8430
commit 5601d1288c
10 changed files with 86 additions and 39 deletions

View File

@ -49,6 +49,7 @@ public interface SQLManager {
/** /**
* 执行一条不需要返回结果的SQL语句(多用于UPDATEREPLACEDELETE方法) * 执行一条不需要返回结果的SQL语句(多用于UPDATEREPLACEDELETE方法)
* 该方法使用 Statement 实现请注意SQL注入风险
* *
* @param sql SQL语句内容 * @param sql SQL语句内容
* @return 更新的行数 * @return 更新的行数
@ -79,6 +80,7 @@ public interface SQLManager {
/** /**
* 执行多条不需要返回结果的SQL * 执行多条不需要返回结果的SQL
* 该方法使用 Statement 实现请注意SQL注入风险
* *
* @param sql SQL语句内容 * @param sql SQL语句内容
* @param moreSQL 更多SQL语句内容 * @param moreSQL 更多SQL语句内容

View File

@ -7,36 +7,36 @@ import org.jetbrains.annotations.Nullable;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
public interface ConditionalBuilder<T> extends SQLBuilder { public interface ConditionalBuilder<B extends ConditionalBuilder<B, T>, T> extends SQLBuilder {
T build(); T build();
ConditionalBuilder<T> setLimit(int limit); B setLimit(int limit);
ConditionalBuilder<T> setConditions(@Nullable String condition); B setConditions(@Nullable String condition);
ConditionalBuilder<T> setConditions(LinkedHashMap<@NotNull String, @Nullable Object> conditionSQLs); B setConditions(LinkedHashMap<@NotNull String, @Nullable Object> conditionSQLs);
ConditionalBuilder<T> addCondition(@Nullable String condition); B addCondition(@Nullable String condition);
ConditionalBuilder<T> addCondition(@NotNull String queryName, @NotNull String operator, @Nullable Object queryValue); B addCondition(@NotNull String queryName, @NotNull String operator, @Nullable Object queryValue);
default ConditionalBuilder<T> addCondition(@NotNull String queryName, @Nullable Object queryValue) { default B addCondition(@NotNull String queryName, @Nullable Object queryValue) {
return addCondition(queryName, "=", queryValue); return addCondition(queryName, "=", queryValue);
} }
ConditionalBuilder<T> addCondition(@NotNull String[] queryNames, @Nullable Object[] queryValues); B addCondition(@NotNull String[] queryNames, @Nullable Object[] queryValues);
ConditionalBuilder<T> addNotNullCondition(@NotNull String queryName); B addNotNullCondition(@NotNull String queryName);
default ConditionalBuilder<T> addTimeCondition(@NotNull String queryName, long startMillis, long endMillis) { default B addTimeCondition(@NotNull String queryName, long startMillis, long endMillis) {
return addTimeCondition(queryName, return addTimeCondition(queryName,
startMillis > 0 ? new Date(startMillis) : null, startMillis > 0 ? new Date(startMillis) : null,
endMillis > 0 ? new Date(endMillis) : null endMillis > 0 ? new Date(endMillis) : null
); );
} }
ConditionalBuilder<T> 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);
} }

View File

@ -2,7 +2,7 @@ package cc.carm.lib.easysql.api.builder;
import cc.carm.lib.easysql.api.action.PreparedSQLUpdateAction; import cc.carm.lib.easysql.api.action.PreparedSQLUpdateAction;
public interface DeleteBuilder extends ConditionalBuilder<PreparedSQLUpdateAction> { public interface DeleteBuilder extends ConditionalBuilder<DeleteBuilder, PreparedSQLUpdateAction> {
String getTableName(); String getTableName();

View File

@ -8,11 +8,12 @@ import org.jetbrains.annotations.NotNull;
public interface QueryBuilder extends SQLBuilder { public interface QueryBuilder extends SQLBuilder {
/** /**
* 通过一条 SQL语句创建查询 * 通过一条 SQL语句创建查询
* 该方法使用 Statement 实现请注意SQL注入风险
* *
* @param sql SQL语句 * @param sql SQL语句
* @return {@link QueryAction} * @return {@link QueryAction}
* @deprecated 存在SQL注入风险使用 {@link QueryBuilder#withPreparedSQL(String)} * @deprecated 存在SQL注入风险建议使用 {@link QueryBuilder#withPreparedSQL(String)}
*/ */
@Deprecated @Deprecated
QueryAction withSQL(@NotNull String sql); QueryAction withSQL(@NotNull String sql);

View File

@ -3,10 +3,16 @@ package cc.carm.lib.easysql.api.builder;
import cc.carm.lib.easysql.api.action.query.PreparedQueryAction; import cc.carm.lib.easysql.api.action.query.PreparedQueryAction;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public interface TableQueryBuilder extends ConditionalBuilder<PreparedQueryAction> { public interface TableQueryBuilder extends ConditionalBuilder<TableQueryBuilder, PreparedQueryAction> {
@NotNull String getTableName(); @NotNull String getTableName();
/**
* 选定用于查询的列名
*
* @param columnNames 列名
* @return {@link TableQueryBuilder}
*/
TableQueryBuilder selectColumns(@NotNull String... columnNames); TableQueryBuilder selectColumns(@NotNull String... columnNames);
/** /**
@ -18,4 +24,14 @@ public interface TableQueryBuilder extends ConditionalBuilder<PreparedQueryActio
*/ */
TableQueryBuilder orderBy(@NotNull String columnName, boolean asc); TableQueryBuilder orderBy(@NotNull String columnName, boolean asc);
/**
* 限制查询条数用于分页查询
*
* @param start 开始数
* @param end 结束条数
* @return {@link TableQueryBuilder}
* @since 0.2.6
*/
TableQueryBuilder setPageLimit(int start, int end);
} }

View File

@ -4,7 +4,7 @@ import cc.carm.lib.easysql.api.action.PreparedSQLUpdateAction;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
public interface UpdateBuilder extends ConditionalBuilder<PreparedSQLUpdateAction> { public interface UpdateBuilder extends ConditionalBuilder<UpdateBuilder, PreparedSQLUpdateAction> {
String getTableName(); String getTableName();

View File

@ -13,7 +13,8 @@ import java.util.Date;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
public abstract class AbstractConditionalBuilder<T> extends AbstractSQLBuilder implements ConditionalBuilder<T> { public abstract class AbstractConditionalBuilder<B extends ConditionalBuilder<B, T>, T>
extends AbstractSQLBuilder implements ConditionalBuilder<B, T> {
ArrayList<String> conditionSQLs = new ArrayList<>(); ArrayList<String> conditionSQLs = new ArrayList<>();
ArrayList<Object> conditionParams = new ArrayList<>(); ArrayList<Object> conditionParams = new ArrayList<>();
@ -23,39 +24,41 @@ public abstract class AbstractConditionalBuilder<T> extends AbstractSQLBuilder i
super(manager); super(manager);
} }
protected abstract B getThis();
@Override @Override
public AbstractConditionalBuilder<T> setConditions(@Nullable String condition) { public B setConditions(@Nullable String condition) {
this.conditionSQLs = new ArrayList<>(); this.conditionSQLs = new ArrayList<>();
this.conditionParams = new ArrayList<>(); this.conditionParams = new ArrayList<>();
if (condition != null) this.conditionSQLs.add(condition); if (condition != null) this.conditionSQLs.add(condition);
return this; return getThis();
} }
@Override @Override
public AbstractConditionalBuilder<T> setConditions( public B setConditions(
LinkedHashMap<@NotNull String, @Nullable Object> conditions LinkedHashMap<@NotNull String, @Nullable Object> conditions
) { ) {
conditions.forEach(this::addCondition); conditions.forEach(this::addCondition);
return this; return getThis();
} }
@Override @Override
public AbstractConditionalBuilder<T> addCondition(@Nullable String condition) { public B addCondition(@Nullable String condition) {
this.conditionSQLs.add(condition); this.conditionSQLs.add(condition);
return this; return getThis();
} }
@Override @Override
public AbstractConditionalBuilder<T> addCondition( public B addCondition(
@NotNull String queryName, @NotNull String operator, @Nullable Object queryValue @NotNull String queryName, @NotNull String operator, @Nullable Object queryValue
) { ) {
addCondition("`" + queryName + "` " + operator + " ?"); addCondition("`" + queryName + "` " + operator + " ?");
this.conditionParams.add(queryValue); this.conditionParams.add(queryValue);
return this; return getThis();
} }
@Override @Override
public AbstractConditionalBuilder<T> addCondition( public B addCondition(
@NotNull String[] queryNames, @Nullable Object[] queryValues @NotNull String[] queryNames, @Nullable Object[] queryValues
) { ) {
if (queryNames.length != queryValues.length) { if (queryNames.length != queryValues.length) {
@ -64,21 +67,21 @@ public abstract class AbstractConditionalBuilder<T> extends AbstractSQLBuilder i
for (int i = 0; i < queryNames.length; i++) { for (int i = 0; i < queryNames.length; i++) {
addCondition(queryNames[i], queryValues[i]); addCondition(queryNames[i], queryValues[i]);
} }
return this; return getThis();
} }
@Override @Override
public AbstractConditionalBuilder<T> addNotNullCondition(@NotNull String queryName) { public B addNotNullCondition(@NotNull String queryName) {
return addCondition("`" + queryName + "` IS NOT NULL"); return addCondition("`" + queryName + "` IS NOT NULL");
} }
@Override @Override
public AbstractConditionalBuilder<T> addTimeCondition( public B addTimeCondition(
@NotNull String queryName, @Nullable Date startDate, @Nullable Date endDate @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) { if (startDate != null) {
addCondition("`" + queryName + "` BETWEEN ? AND ?"); addCondition("`" + queryName + "` BETWEEN ? AND ?");
this.conditionParams.add(startDate); this.conditionParams.add(startDate);
@ -96,14 +99,14 @@ public abstract class AbstractConditionalBuilder<T> extends AbstractSQLBuilder i
} else { } else {
addCondition(queryName, "<=", endDate); addCondition(queryName, "<=", endDate);
} }
return this; return getThis();
} }
@Override @Override
public AbstractConditionalBuilder<T> setLimit(int limit) { public B setLimit(int limit) {
this.limit = limit; this.limit = limit;
return this; return getThis();
} }
protected String buildConditionSQL() { protected String buildConditionSQL() {

View File

@ -7,7 +7,7 @@ import cc.carm.lib.easysql.manager.SQLManagerImpl;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class DeleteBuilderImpl public class DeleteBuilderImpl
extends AbstractConditionalBuilder<PreparedSQLUpdateAction> extends AbstractConditionalBuilder<DeleteBuilder, PreparedSQLUpdateAction>
implements DeleteBuilder { implements DeleteBuilder {
String tableName; String tableName;
@ -39,4 +39,9 @@ public class DeleteBuilderImpl
} }
@Override
protected DeleteBuilderImpl getThis() {
return this;
}
} }

View File

@ -7,10 +7,8 @@ import cc.carm.lib.easysql.manager.SQLManagerImpl;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
public class TableQueryBuilderImpl public class TableQueryBuilderImpl
extends AbstractConditionalBuilder<PreparedQueryAction> extends AbstractConditionalBuilder<TableQueryBuilder, PreparedQueryAction>
implements TableQueryBuilder { implements TableQueryBuilder {
@NotNull String tableName; @NotNull String tableName;
@ -19,6 +17,8 @@ public class TableQueryBuilderImpl
@Nullable String orderBy; @Nullable String orderBy;
int[] pageLimit;
public TableQueryBuilderImpl(@NotNull SQLManagerImpl manager, @NotNull String tableName) { public TableQueryBuilderImpl(@NotNull SQLManagerImpl manager, @NotNull String tableName) {
super(manager); super(manager);
this.tableName = tableName; this.tableName = tableName;
@ -44,7 +44,13 @@ public class TableQueryBuilderImpl
sqlBuilder.append("`").append(tableName).append("`"); sqlBuilder.append("`").append(tableName).append("`");
if (hasConditions()) sqlBuilder.append(" ").append(buildConditionSQL()); 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); if (orderBy != null) sqlBuilder.append(orderBy);
return new PreparedQueryActionImpl(getManager(), sqlBuilder.toString()) return new PreparedQueryActionImpl(getManager(), sqlBuilder.toString())
@ -68,4 +74,14 @@ public class TableQueryBuilderImpl
return this; return this;
} }
@Override
public TableQueryBuilder setPageLimit(int start, int end) {
this.pageLimit = new int[]{start, end};
return this;
}
@Override
protected TableQueryBuilderImpl getThis() {
return this;
}
} }

View File

@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.*; import java.util.*;
public class UpdateBuilderImpl public class UpdateBuilderImpl
extends AbstractConditionalBuilder<PreparedSQLUpdateAction> extends AbstractConditionalBuilder<UpdateBuilder, PreparedSQLUpdateAction>
implements UpdateBuilder { implements UpdateBuilder {
String tableName; String tableName;
@ -73,4 +73,8 @@ public class UpdateBuilderImpl
} }
@Override
protected UpdateBuilder getThis() {
return this;
}
} }