DataSqlSource增加natvieQuery的参数模板功能

This commit is contained in:
redkale
2023-08-05 16:47:37 +08:00
parent 30a6e29897
commit d228228eee
7 changed files with 169 additions and 57 deletions

View File

@@ -24,6 +24,7 @@ import org.redkale.persistence.Table;
import org.redkale.service.Local;
import org.redkale.source.EntityInfo.EntityColumn;
import org.redkale.util.*;
import static org.redkale.util.Utility.isEmpty;
/**
* DataSource的SQL抽象实现类 <br>
@@ -2193,7 +2194,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement
if (sb.length() > 0) {
sb.append(", ");
}
sb.append(ffc.func.getColumn((col == null || col.isEmpty() ? "*" : info.getSQLColumn("a", col))));
sb.append(ffc.func.getColumn((isEmpty(col) ? "*" : info.getSQLColumn("a", col))));
}
}
final String sql = "SELECT " + sb + " FROM " + tables[0] + " a"
@@ -2271,7 +2272,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement
final Set<String> haset = new HashSet<>();
final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, haset, info);
final CharSequence where = node == null ? null : node.createSQLExpress(this, info, joinTabalis);
final String sql = "SELECT " + func.getColumn((column == null || column.isEmpty() ? "*" : info.getSQLColumn("a", column))) + " FROM " + tables[0] + " a"
final String sql = "SELECT " + func.getColumn((isEmpty(column) ? "*" : info.getSQLColumn("a", column))) + " FROM " + tables[0] + " a"
+ (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where));
return sql;
}
@@ -3260,7 +3261,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement
this.prepare = prepare;
this.sql = sql;
this.tables = tables;
this.blobs = blobs == null || blobs.isEmpty() ? null : blobs;
this.blobs = isEmpty(blobs) ? null : blobs;
}
}

View File

@@ -12,7 +12,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicLong;
import org.redkale.annotation.Component;
import org.redkale.convert.Convert;
import org.redkale.util.Resourcable;
import org.redkale.util.*;
/**
* Redkale中缓存数据源的核心类。 主要供业务开发者使用, 技术开发者提供CacheSource的实现。<br>
@@ -1438,7 +1438,7 @@ public interface CacheSource extends Resourcable {
}
default <T> CompletableFuture<T> srandmemberAsync(String key, Type componentType) {
return srandmemberAsync(key, componentType, 1).thenApply(list -> list != null && !list.isEmpty() ? (T) list.get(0) : null);
return srandmemberAsync(key, componentType, 1).thenApply(list -> Utility.isNotEmpty(list) ? (T) list.get(0) : null);
}
default CompletableFuture<String> srandmemberStringAsync(String key) {

View File

@@ -2491,7 +2491,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
*/
@Override
public int nativeUpdate(String sql) {
return nativeUpdate(new String[]{sql})[0];
return nativeUpdates(new String[]{sql})[0];
}
/**
@@ -2503,7 +2503,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
* @return 结果数组
*/
@Override
public int[] nativeUpdate(String... sqls) {
public int[] nativeUpdates(String... sqls) {
if (sqls.length == 0) {
return new int[0];
}
@@ -2571,6 +2571,16 @@ public class DataJdbcSource extends AbstractDataSqlSource {
}
}
@Override
public int nativeUpdate(String sql, Map<String, Object> params) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public <V> V nativeQuery(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler, Map<String, Object> params) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Deprecated
public int directExecute(String sql) {
return nativeUpdate(sql);
@@ -2578,7 +2588,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
@Deprecated
public int[] directExecute(String... sqls) {
return nativeUpdate(sqls);
return nativeUpdates(sqls);
}
@Deprecated

View File

@@ -99,7 +99,7 @@ public class DataMemorySource extends AbstractDataSqlSource implements SearchSou
}
@Override
public int[] nativeUpdate(String... sqls) {
public int[] nativeUpdates(String... sqls) {
throw new UnsupportedOperationException("Not supported yet.");
}
@@ -108,6 +108,16 @@ public class DataMemorySource extends AbstractDataSqlSource implements SearchSou
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public int nativeUpdate(String sql, Map<String, Object> params) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public <V> V nativeQuery(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler, Map<String, Object> params) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
protected String prepareParamSign(int index) {
throw new UnsupportedOperationException("Not supported yet.");

View File

@@ -3,9 +3,11 @@
*/
package org.redkale.source;
import java.io.Serializable;
import java.util.*;
import java.util.function.*;
import static org.redkale.source.DataResultSet.formatColumnValue;
import org.redkale.util.Reproduce;
/**
*
@@ -19,9 +21,10 @@ import static org.redkale.source.DataResultSet.formatColumnValue;
*/
public interface DataSqlSource extends DataSource {
public int nativeUpdate(String sql);
public int[] nativeUpdates(String... sqls);
public int[] nativeUpdate(String... sqls);
//----------------------------- 无参数 -----------------------------
public int nativeUpdate(String sql);
//BiConsumer 参数1: connection, 参数2: statement
public <V> V nativeQuery(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler);
@@ -35,7 +38,8 @@ public interface DataSqlSource extends DataSource {
if (!rset.next()) {
return null;
}
if (type.isPrimitive() || type == byte[].class || (!Map.class.isAssignableFrom(type) && type.getName().startsWith("java."))) {
if (type == byte[].class || type == String.class || type.isPrimitive() || Number.class.isAssignableFrom(type)
|| (!Map.class.isAssignableFrom(type) && type.getName().startsWith("java."))) {
return (V) formatColumnValue(type, rset.getObject(1));
}
return EntityBuilder.load(type).getObjectValue(rset);
@@ -44,7 +48,8 @@ public interface DataSqlSource extends DataSource {
default <V> List<V> nativeQueryList(Class<V> type, String sql) {
return nativeQuery(sql, rset -> {
if (type.isPrimitive() || type == byte[].class || (!Map.class.isAssignableFrom(type) && type.getName().startsWith("java."))) {
if (type == byte[].class || type == String.class || type.isPrimitive() || Number.class.isAssignableFrom(type)
|| (!Map.class.isAssignableFrom(type) && type.getName().startsWith("java."))) {
List<V> list = new ArrayList<>();
while (rset.next()) {
list.add(rset.wasNull() ? null : (V) formatColumnValue(type, rset.getObject(1)));
@@ -74,4 +79,90 @@ public interface DataSqlSource extends DataSource {
default Map<Integer, String> nativeQueryIntStrMap(String sql) {
return nativeQueryMap(Integer.class, String.class, sql);
}
//----------------------------- Map<String, Object> -----------------------------
public int nativeUpdate(String sql, Map<String, Object> params);
//BiConsumer 参数1: connection, 参数2: statement
public <V> V nativeQuery(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler, Map<String, Object> params);
default <V> V nativeQuery(String sql, Function<DataResultSet, V> handler, Map<String, Object> params) {
return nativeQuery(sql, null, handler, params);
}
default <V> V nativeQueryOne(Class<V> type, String sql, Map<String, Object> params) {
return nativeQuery(sql, rset -> {
if (!rset.next()) {
return null;
}
if (type == byte[].class || type == String.class || type.isPrimitive() || Number.class.isAssignableFrom(type)
|| (!Map.class.isAssignableFrom(type) && type.getName().startsWith("java."))) {
return (V) formatColumnValue(type, rset.getObject(1));
}
return EntityBuilder.load(type).getObjectValue(rset);
}, params);
}
default <V> List<V> nativeQueryList(Class<V> type, String sql, Map<String, Object> params) {
return nativeQuery(sql, rset -> {
if (type == byte[].class || type == String.class || type.isPrimitive() || Number.class.isAssignableFrom(type)
|| (!Map.class.isAssignableFrom(type) && type.getName().startsWith("java."))) {
List<V> list = new ArrayList<>();
while (rset.next()) {
list.add(rset.wasNull() ? null : (V) formatColumnValue(type, rset.getObject(1)));
}
return list;
}
return EntityBuilder.load(type).getObjectList(rset);
}, params);
}
default <K, V> Map<K, V> nativeQueryMap(Class<K> keyType, Class<V> valType, String sql, Map<String, Object> params) {
return nativeQuery(sql, rset -> {
Map<K, V> map = new LinkedHashMap<K, V>();
while (rset.next()) {
if (!rset.wasNull()) {
map.put((K) formatColumnValue(keyType, rset.getObject(1)), (V) formatColumnValue(valType, rset.getObject(2)));
}
}
return map;
}, params);
}
default Map<String, String> nativeQueryStrStrMap(String sql, Map<String, Object> params) {
return nativeQueryMap(String.class, String.class, sql, params);
}
default Map<Integer, String> nativeQueryIntStrMap(String sql, Map<String, Object> params) {
return nativeQueryMap(Integer.class, String.class, sql, params);
}
//----------------------------- JavaBean -----------------------------
default int nativeUpdate(String sql, Serializable bean) {
return nativeUpdate(sql, (Map<String, Object>) Reproduce.copy(HashMap.class, bean));
}
default <V> V nativeQuery(String sql, Function<DataResultSet, V> handler, Serializable bean) {
return nativeQuery(sql, null, handler, (Map<String, Object>) Reproduce.copy(HashMap.class, bean));
}
default <V> V nativeQueryOne(Class<V> type, String sql, Serializable bean) {
return nativeQueryOne(type, sql, (Map<String, Object>) Reproduce.copy(HashMap.class, bean));
}
default <V> List<V> nativeQueryList(Class<V> type, String sql, Serializable bean) {
return nativeQueryList(type, sql, (Map<String, Object>) Reproduce.copy(HashMap.class, bean));
}
default <K, V> Map<K, V> nativeQueryMap(Class<K> keyType, Class<V> valType, String sql, Serializable bean) {
return nativeQueryMap(keyType, valType, sql, (Map<String, Object>) Reproduce.copy(HashMap.class, bean));
}
default Map<String, String> nativeQueryStrStrMap(String sql, Serializable bean) {
return nativeQueryMap(String.class, String.class, sql, (Map<String, Object>) Reproduce.copy(HashMap.class, bean));
}
default Map<Integer, String> nativeQueryIntStrMap(String sql, Serializable bean) {
return nativeQueryMap(Integer.class, String.class, sql, (Map<String, Object>) Reproduce.copy(HashMap.class, bean));
}
}

View File

@@ -495,8 +495,8 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
}
if (express == FV_MOD || express == FV_DIV) {
FilterValue fv = (FilterValue) val0;
return new StringBuilder().append(info.getSQLColumn(talis, column)).append(' ').append(express.value()).append(' ').append(fv.getFirst())
.append(' ').append(fv.getExpress().value()).append(' ').append(fv.getSecond());
return new StringBuilder().append(info.getSQLColumn(talis, column)).append(' ').append(express.value()).append(' ').append(fv.getLeft())
.append(' ').append(fv.getExpress().value()).append(' ').append(fv.getRight());
}
final boolean fk = (val0 instanceof FilterKey);
CharSequence val = fk ? info.getSQLColumn(talis, ((FilterKey) val0).getColumn()) : formatToString(express, info.getSQLValue(column, (Serializable) val0));
@@ -1132,12 +1132,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() % fv0.getFirst().longValue()) == fv0.getSecond().longValue();
return (((Number) attr.get(t)).longValue() % fv0.getLeft().longValue()) == fv0.getRight().longValue();
}
@Override
public String toString() {
return field + " " + express.value() + " " + fv0.getFirst() + " " + fv0.getExpress().value() + " " + fv0.getSecond();
return field + " " + express.value() + " " + fv0.getLeft() + " " + fv0.getExpress().value() + " " + fv0.getRight();
}
};
case NOTEQUAL:
@@ -1145,12 +1145,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() % fv0.getFirst().longValue()) != fv0.getSecond().longValue();
return (((Number) attr.get(t)).longValue() % fv0.getLeft().longValue()) != fv0.getRight().longValue();
}
@Override
public String toString() {
return field + " " + express.value() + " " + fv0.getFirst() + " " + fv0.getExpress().value() + " " + fv0.getSecond();
return field + " " + express.value() + " " + fv0.getLeft() + " " + fv0.getExpress().value() + " " + fv0.getRight();
}
};
case GREATERTHAN:
@@ -1158,12 +1158,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() % fv0.getFirst().longValue()) > fv0.getSecond().longValue();
return (((Number) attr.get(t)).longValue() % fv0.getLeft().longValue()) > fv0.getRight().longValue();
}
@Override
public String toString() {
return field + " " + express.value() + " " + fv0.getFirst() + " " + fv0.getExpress().value() + " " + fv0.getSecond();
return field + " " + express.value() + " " + fv0.getLeft() + " " + fv0.getExpress().value() + " " + fv0.getRight();
}
};
case LESSTHAN:
@@ -1171,12 +1171,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() % fv0.getFirst().longValue()) < fv0.getSecond().longValue();
return (((Number) attr.get(t)).longValue() % fv0.getLeft().longValue()) < fv0.getRight().longValue();
}
@Override
public String toString() {
return field + " " + express.value() + " " + fv0.getFirst() + " " + fv0.getExpress().value() + " " + fv0.getSecond();
return field + " " + express.value() + " " + fv0.getLeft() + " " + fv0.getExpress().value() + " " + fv0.getRight();
}
};
case GREATERTHANOREQUALTO:
@@ -1184,12 +1184,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() % fv0.getFirst().longValue()) >= fv0.getSecond().longValue();
return (((Number) attr.get(t)).longValue() % fv0.getLeft().longValue()) >= fv0.getRight().longValue();
}
@Override
public String toString() {
return field + " " + express.value() + " " + fv0.getFirst() + " " + fv0.getExpress().value() + " " + fv0.getSecond();
return field + " " + express.value() + " " + fv0.getLeft() + " " + fv0.getExpress().value() + " " + fv0.getRight();
}
};
case LESSTHANOREQUALTO:
@@ -1197,12 +1197,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() % fv0.getFirst().longValue()) <= fv0.getSecond().longValue();
return (((Number) attr.get(t)).longValue() % fv0.getLeft().longValue()) <= fv0.getRight().longValue();
}
@Override
public String toString() {
return field + " " + express.value() + " " + fv0.getFirst() + " " + fv0.getExpress().value() + " " + fv0.getSecond();
return field + " " + express.value() + " " + fv0.getLeft() + " " + fv0.getExpress().value() + " " + fv0.getRight();
}
};
default:
@@ -1216,12 +1216,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() / fv1.getFirst().longValue()) == fv1.getSecond().longValue();
return (((Number) attr.get(t)).longValue() / fv1.getLeft().longValue()) == fv1.getRight().longValue();
}
@Override
public String toString() {
return field + " " + express.value() + " " + fv1.getFirst() + " " + fv1.getExpress().value() + " " + fv1.getSecond();
return field + " " + express.value() + " " + fv1.getLeft() + " " + fv1.getExpress().value() + " " + fv1.getRight();
}
};
case NOTEQUAL:
@@ -1229,12 +1229,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() / fv1.getFirst().longValue()) != fv1.getSecond().longValue();
return (((Number) attr.get(t)).longValue() / fv1.getLeft().longValue()) != fv1.getRight().longValue();
}
@Override
public String toString() {
return field + " " + express.value() + " " + fv1.getFirst() + " " + fv1.getExpress().value() + " " + fv1.getSecond();
return field + " " + express.value() + " " + fv1.getLeft() + " " + fv1.getExpress().value() + " " + fv1.getRight();
}
};
case GREATERTHAN:
@@ -1242,12 +1242,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() / fv1.getFirst().longValue()) > fv1.getSecond().longValue();
return (((Number) attr.get(t)).longValue() / fv1.getLeft().longValue()) > fv1.getRight().longValue();
}
@Override
public String toString() {
return field + " " + express.value() + " " + fv1.getFirst() + " " + fv1.getExpress().value() + " " + fv1.getSecond();
return field + " " + express.value() + " " + fv1.getLeft() + " " + fv1.getExpress().value() + " " + fv1.getRight();
}
};
case LESSTHAN:
@@ -1255,12 +1255,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() / fv1.getFirst().longValue()) < fv1.getSecond().longValue();
return (((Number) attr.get(t)).longValue() / fv1.getLeft().longValue()) < fv1.getRight().longValue();
}
@Override
public String toString() {
return field + " " + express.value() + " " + fv1.getFirst() + " " + fv1.getExpress().value() + " " + fv1.getSecond();
return field + " " + express.value() + " " + fv1.getLeft() + " " + fv1.getExpress().value() + " " + fv1.getRight();
}
};
case GREATERTHANOREQUALTO:
@@ -1268,12 +1268,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() / fv1.getFirst().longValue()) >= fv1.getSecond().longValue();
return (((Number) attr.get(t)).longValue() / fv1.getLeft().longValue()) >= fv1.getRight().longValue();
}
@Override
public String toString() {
return field + " " + express.value() + " " + fv1.getFirst() + " " + fv1.getExpress().value() + " " + fv1.getSecond();
return field + " " + express.value() + " " + fv1.getLeft() + " " + fv1.getExpress().value() + " " + fv1.getRight();
}
};
case LESSTHANOREQUALTO:
@@ -1281,12 +1281,12 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
@Override
public boolean test(T t) {
return (((Number) attr.get(t)).longValue() / fv1.getFirst().longValue()) <= fv1.getSecond().longValue();
return (((Number) attr.get(t)).longValue() / fv1.getLeft().longValue()) <= fv1.getRight().longValue();
}
@Override
public String toString() {
return field + " " + express.value() + " " + fv1.getFirst() + " " + fv1.getExpress().value() + " " + fv1.getSecond();
return field + " " + express.value() + " " + fv1.getLeft() + " " + fv1.getExpress().value() + " " + fv1.getRight();
}
};
default:

View File

@@ -19,37 +19,37 @@ import org.redkale.convert.ConvertColumn;
public class FilterValue implements java.io.Serializable {
@ConvertColumn(index = 1)
private Number first;
private Number left;
@ConvertColumn(index = 2)
private FilterExpress express;
@ConvertColumn(index = 3)
private Number second;
private Number right;
public FilterValue() {
}
public FilterValue(Number first, Number second) {
this(first, FilterExpress.EQUAL, second);
public FilterValue(Number left, Number right) {
this(left, FilterExpress.EQUAL, right);
}
public FilterValue(Number first, FilterExpress express) {
this(first, express, 0);
public FilterValue(Number left, FilterExpress express) {
this(left, express, 0);
}
public FilterValue(Number first, FilterExpress express, Number second) {
this.first = first;
public FilterValue(Number left, FilterExpress express, Number right) {
this.left = left;
this.express = express;
this.second = second;
this.right = right;
}
public Number getFirst() {
return first == null ? 0 : first;
public Number getLeft() {
return left == null ? 0 : left;
}
public void setFirst(Number first) {
this.first = first;
public void setLeft(Number left) {
this.left = left;
}
public FilterExpress getExpress() {
@@ -60,16 +60,16 @@ public class FilterValue implements java.io.Serializable {
this.express = express;
}
public Number getSecond() {
return second == null ? 0 : second;
public Number getRight() {
return right == null ? 0 : right;
}
public void setSecond(Number second) {
this.second = second;
public void setRight(Number right) {
this.right = right;
}
@Override
public String toString() {
return FilterValue.class.getSimpleName() + "[first=" + getFirst() + ", express=" + getExpress() + ", second=" + getSecond() + "]";
return FilterValue.class.getSimpleName() + "[left=" + getLeft() + ", express=" + getExpress() + ", right=" + getRight() + "]";
}
}