From d228228eeeaa8ab5c1ba523cf7db8acd144b3172 Mon Sep 17 00:00:00 2001 From: redkale Date: Sat, 5 Aug 2023 16:47:37 +0800 Subject: [PATCH] =?UTF-8?q?DataSqlSource=E5=A2=9E=E5=8A=A0natvieQuery?= =?UTF-8?q?=E7=9A=84=E5=8F=82=E6=95=B0=E6=A8=A1=E6=9D=BF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redkale/source/AbstractDataSqlSource.java | 7 +- .../java/org/redkale/source/CacheSource.java | 4 +- .../org/redkale/source/DataJdbcSource.java | 16 ++- .../org/redkale/source/DataMemorySource.java | 12 ++- .../org/redkale/source/DataSqlSource.java | 99 ++++++++++++++++++- .../java/org/redkale/source/FilterNode.java | 52 +++++----- .../java/org/redkale/source/FilterValue.java | 36 +++---- 7 files changed, 169 insertions(+), 57 deletions(-) diff --git a/src/main/java/org/redkale/source/AbstractDataSqlSource.java b/src/main/java/org/redkale/source/AbstractDataSqlSource.java index e160066b8..7dfedcca3 100644 --- a/src/main/java/org/redkale/source/AbstractDataSqlSource.java +++ b/src/main/java/org/redkale/source/AbstractDataSqlSource.java @@ -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抽象实现类
@@ -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 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; } } diff --git a/src/main/java/org/redkale/source/CacheSource.java b/src/main/java/org/redkale/source/CacheSource.java index 19d686e0a..9d65fb055 100644 --- a/src/main/java/org/redkale/source/CacheSource.java +++ b/src/main/java/org/redkale/source/CacheSource.java @@ -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的实现。
@@ -1438,7 +1438,7 @@ public interface CacheSource extends Resourcable { } default CompletableFuture 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 srandmemberStringAsync(String key) { diff --git a/src/main/java/org/redkale/source/DataJdbcSource.java b/src/main/java/org/redkale/source/DataJdbcSource.java index c8008be7b..39921ae82 100644 --- a/src/main/java/org/redkale/source/DataJdbcSource.java +++ b/src/main/java/org/redkale/source/DataJdbcSource.java @@ -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 params) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public V nativeQuery(String sql, BiConsumer consumer, Function handler, Map 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 diff --git a/src/main/java/org/redkale/source/DataMemorySource.java b/src/main/java/org/redkale/source/DataMemorySource.java index 6105694ad..41a21786e 100644 --- a/src/main/java/org/redkale/source/DataMemorySource.java +++ b/src/main/java/org/redkale/source/DataMemorySource.java @@ -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 params) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public V nativeQuery(String sql, BiConsumer consumer, Function handler, Map params) { + throw new UnsupportedOperationException("Not supported yet."); + } + @Override protected String prepareParamSign(int index) { throw new UnsupportedOperationException("Not supported yet."); diff --git a/src/main/java/org/redkale/source/DataSqlSource.java b/src/main/java/org/redkale/source/DataSqlSource.java index 3c98ec050..0be24c4fe 100644 --- a/src/main/java/org/redkale/source/DataSqlSource.java +++ b/src/main/java/org/redkale/source/DataSqlSource.java @@ -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 nativeQuery(String sql, BiConsumer consumer, Function 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 List nativeQueryList(Class 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 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 nativeQueryIntStrMap(String sql) { return nativeQueryMap(Integer.class, String.class, sql); } + + //----------------------------- Map ----------------------------- + public int nativeUpdate(String sql, Map params); + + //BiConsumer 参数1: connection, 参数2: statement + public V nativeQuery(String sql, BiConsumer consumer, Function handler, Map params); + + default V nativeQuery(String sql, Function handler, Map params) { + return nativeQuery(sql, null, handler, params); + } + + default V nativeQueryOne(Class type, String sql, Map 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 List nativeQueryList(Class type, String sql, Map 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 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 Map nativeQueryMap(Class keyType, Class valType, String sql, Map params) { + return nativeQuery(sql, rset -> { + Map map = new LinkedHashMap(); + 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 nativeQueryStrStrMap(String sql, Map params) { + return nativeQueryMap(String.class, String.class, sql, params); + } + + default Map nativeQueryIntStrMap(String sql, Map params) { + return nativeQueryMap(Integer.class, String.class, sql, params); + } + + //----------------------------- JavaBean ----------------------------- + default int nativeUpdate(String sql, Serializable bean) { + return nativeUpdate(sql, (Map) Reproduce.copy(HashMap.class, bean)); + } + + default V nativeQuery(String sql, Function handler, Serializable bean) { + return nativeQuery(sql, null, handler, (Map) Reproduce.copy(HashMap.class, bean)); + } + + default V nativeQueryOne(Class type, String sql, Serializable bean) { + return nativeQueryOne(type, sql, (Map) Reproduce.copy(HashMap.class, bean)); + } + + default List nativeQueryList(Class type, String sql, Serializable bean) { + return nativeQueryList(type, sql, (Map) Reproduce.copy(HashMap.class, bean)); + } + + default Map nativeQueryMap(Class keyType, Class valType, String sql, Serializable bean) { + return nativeQueryMap(keyType, valType, sql, (Map) Reproduce.copy(HashMap.class, bean)); + } + + default Map nativeQueryStrStrMap(String sql, Serializable bean) { + return nativeQueryMap(String.class, String.class, sql, (Map) Reproduce.copy(HashMap.class, bean)); + } + + default Map nativeQueryIntStrMap(String sql, Serializable bean) { + return nativeQueryMap(Integer.class, String.class, sql, (Map) Reproduce.copy(HashMap.class, bean)); + } } diff --git a/src/main/java/org/redkale/source/FilterNode.java b/src/main/java/org/redkale/source/FilterNode.java index c3761a88e..347e952ad 100644 --- a/src/main/java/org/redkale/source/FilterNode.java +++ b/src/main/java/org/redkale/source/FilterNode.java @@ -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: diff --git a/src/main/java/org/redkale/source/FilterValue.java b/src/main/java/org/redkale/source/FilterValue.java index ac56a52b5..bb4fb481c 100644 --- a/src/main/java/org/redkale/source/FilterValue.java +++ b/src/main/java/org/redkale/source/FilterValue.java @@ -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() + "]"; } }