From 3c33c2ecbbeb646dbebb314fee52dab1f087598e Mon Sep 17 00:00:00 2001 From: redkale Date: Wed, 16 Aug 2023 11:20:20 +0800 Subject: [PATCH] =?UTF-8?q?DataSqlSource=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redkale/source/AbstractDataSqlSource.java | 26 +++ .../org/redkale/source/DataJdbcSource.java | 30 +++ .../org/redkale/source/DataSqlSource.java | 184 ++++++++++++++++++ 3 files changed, 240 insertions(+) diff --git a/src/main/java/org/redkale/source/AbstractDataSqlSource.java b/src/main/java/org/redkale/source/AbstractDataSqlSource.java index 33bc823c4..3db009880 100644 --- a/src/main/java/org/redkale/source/AbstractDataSqlSource.java +++ b/src/main/java/org/redkale/source/AbstractDataSqlSource.java @@ -3232,6 +3232,32 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource implement return querySheetDBAsync(info, readCache, needTotal, distinct, selects, flipper, node); } + //-------------------------------------------- native SQL -------------------------------------------- + @Override + public V nativeQuery(String sql, BiConsumer consumer, Function handler, Map params) { + return nativeQueryAsync(sql, consumer, handler, params).join(); + } + + @Override + public V nativeQuery(String sql, BiConsumer consumer, Function handler) { + return nativeQueryAsync(sql, consumer, handler).join(); + } + + @Override + public int nativeUpdate(String sql, Map params) { + return nativeUpdateAsync(sql, params).join(); + } + + @Override + public int nativeUpdate(String sql) { + return nativeUpdateAsync(sql).join(); + } + + @Override + public int[] nativeUpdates(String... sqls) { + return nativeUpdatesAsync(sqls).join(); + } + protected static class UpdateSqlInfo { public String sql; //prepare-sql时表名参数只能是最后一个 diff --git a/src/main/java/org/redkale/source/DataJdbcSource.java b/src/main/java/org/redkale/source/DataJdbcSource.java index 713b595ec..9cd5624cb 100644 --- a/src/main/java/org/redkale/source/DataJdbcSource.java +++ b/src/main/java/org/redkale/source/DataJdbcSource.java @@ -2490,6 +2490,7 @@ public class DataJdbcSource extends AbstractDataSqlSource { * * @return 结果数组 */ + @Local @Override public int[] nativeUpdates(String... sqls) { if (sqls.length == 0) { @@ -2530,11 +2531,13 @@ public class DataJdbcSource extends AbstractDataSqlSource { * * @return 结果数组 */ + @Local @Override public int nativeUpdate(String sql) { return nativeUpdates(new String[]{sql})[0]; } + @Local @Override public int nativeUpdate(String sql, Map params) { NativeSqlStatement sinfo = super.nativeParse(sql, params); @@ -2583,6 +2586,7 @@ public class DataJdbcSource extends AbstractDataSqlSource { * * @return 结果 */ + @Local @Override public V nativeQuery(String sql, BiConsumer consumer, Function handler) { final long s = System.currentTimeMillis(); @@ -2610,6 +2614,7 @@ public class DataJdbcSource extends AbstractDataSqlSource { } } + @Local @Override public V nativeQuery(String sql, BiConsumer consumer, Function handler, Map params) { NativeSqlStatement sinfo = super.nativeParse(sql, params); @@ -2655,6 +2660,31 @@ public class DataJdbcSource extends AbstractDataSqlSource { } } + @Override + public CompletableFuture nativeQueryAsync(String sql, BiConsumer consumer, Function handler, Map params) { + return supplyAsync(() -> nativeQuery(sql, consumer, handler, params)); + } + + @Override + public CompletableFuture nativeQueryAsync(String sql, BiConsumer consumer, Function handler) { + return supplyAsync(() -> nativeQuery(sql, consumer, handler)); + } + + @Override + public CompletableFuture nativeUpdateAsync(String sql, Map params) { + return supplyAsync(() -> nativeUpdate(sql, params)); + } + + @Override + public CompletableFuture nativeUpdateAsync(String sql) { + return supplyAsync(() -> nativeUpdate(sql)); + } + + @Override + public CompletableFuture nativeUpdatesAsync(String... sqls) { + return supplyAsync(() -> nativeUpdates(sqls)); + } + @Deprecated public int directExecute(String sql) { return nativeUpdate(sql); diff --git a/src/main/java/org/redkale/source/DataSqlSource.java b/src/main/java/org/redkale/source/DataSqlSource.java index ba8ff194f..684b0ca06 100644 --- a/src/main/java/org/redkale/source/DataSqlSource.java +++ b/src/main/java/org/redkale/source/DataSqlSource.java @@ -5,6 +5,7 @@ package org.redkale.source; import java.io.Serializable; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.function.*; import static org.redkale.source.DataResultSet.formatColumnValue; import org.redkale.util.Copier; @@ -30,6 +31,15 @@ public interface DataSqlSource extends DataSource { */ public int[] nativeUpdates(String... sqls); + /** + * 执行多条原生无参数的sql + * + * @param sql 无参数的sql语句 + * + * @return 执行条数 + */ + public CompletableFuture nativeUpdatesAsync(String... sqls); + /** * 执行原生无参数的sql * @@ -39,6 +49,15 @@ public interface DataSqlSource extends DataSource { */ public int nativeUpdate(String sql); + /** + * 执行原生无参数的sql + * + * @param sql 无参数的sql语句 + * + * @return 执行条数 + */ + public CompletableFuture nativeUpdateAsync(String sql); + /** * 执行原生带参数的sql * @@ -49,6 +68,16 @@ public interface DataSqlSource extends DataSource { */ public int nativeUpdate(String sql, Map params); + /** + * 执行原生带参数的sql + * + * @param sql 带参数的sql语句 + * @param params 参数值集合 + * + * @return 执行条数 + */ + public CompletableFuture nativeUpdateAsync(String sql, Map params); + /** * 通过原生的sql查询结果 * @@ -61,6 +90,18 @@ public interface DataSqlSource extends DataSource { */ public V nativeQuery(String sql, BiConsumer consumer, Function handler); + /** + * 通过原生的sql查询结果 + * + * @param 泛型 + * @param sql 无参数的sql语句 + * @param consumer BiConsumer 参数1: connection, 参数2: statement + * @param handler DataResultSet的回调函数 + * + * @return 结果对象 + */ + public CompletableFuture nativeQueryAsync(String sql, BiConsumer consumer, Function handler); + /** * 通过原生带参数的sql查询结果 * @@ -74,11 +115,28 @@ public interface DataSqlSource extends DataSource { */ public V nativeQuery(String sql, BiConsumer consumer, Function handler, Map params); + /** + * 通过原生带参数的sql查询结果 + * + * @param 泛型 + * @param sql 带参数的sql语句 + * @param consumer BiConsumer 参数1: connection, 参数2: statement + * @param handler DataResultSet的回调函数 + * @param params 参数值集合 + * + * @return 结果对象 + */ + public CompletableFuture nativeQueryAsync(String sql, BiConsumer consumer, Function handler, Map params); + //----------------------------- 无参数 ----------------------------- default V nativeQuery(String sql, Function handler) { return nativeQuery(sql, null, handler); } + default CompletableFuture nativeQueryAsync(String sql, Function handler) { + return nativeQueryAsync(sql, null, handler); + } + default V nativeQueryOne(Class type, String sql) { return nativeQuery(sql, rset -> { if (!rset.next()) { @@ -92,6 +150,19 @@ public interface DataSqlSource extends DataSource { }); } + default CompletableFuture nativeQueryOneAsync(Class type, String sql) { + return nativeQueryAsync(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); + }); + } + default List nativeQueryList(Class type, String sql) { return nativeQuery(sql, rset -> { if (type == byte[].class || type == String.class || type.isPrimitive() || Number.class.isAssignableFrom(type) @@ -106,6 +177,20 @@ public interface DataSqlSource extends DataSource { }); } + default CompletableFuture> nativeQueryListAsync(Class type, String sql) { + return nativeQueryAsync(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); + }); + } + default Map nativeQueryMap(Class keyType, Class valType, String sql) { return nativeQuery(sql, rset -> { Map map = new LinkedHashMap(); @@ -118,19 +203,43 @@ public interface DataSqlSource extends DataSource { }); } + default CompletableFuture> nativeQueryMapAsync(Class keyType, Class valType, String sql) { + return nativeQueryAsync(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; + }); + } + default Map nativeQueryStrStrMap(String sql) { return nativeQueryMap(String.class, String.class, sql); } + default CompletableFuture> nativeQueryStrStrMapAsync(String sql) { + return nativeQueryMapAsync(String.class, String.class, sql); + } + default Map nativeQueryIntStrMap(String sql) { return nativeQueryMap(Integer.class, String.class, sql); } + default CompletableFuture> nativeQueryIntStrMapAsync(String sql) { + return nativeQueryMapAsync(Integer.class, String.class, sql); + } + //----------------------------- Map ----------------------------- default V nativeQuery(String sql, Function handler, Map params) { return nativeQuery(sql, null, handler, params); } + default CompletableFuture nativeQueryAsync(String sql, Function handler, Map params) { + return nativeQueryAsync(sql, null, handler, params); + } + default V nativeQueryOne(Class type, String sql, Map params) { return nativeQuery(sql, rset -> { if (!rset.next()) { @@ -144,6 +253,19 @@ public interface DataSqlSource extends DataSource { }, params); } + default CompletableFuture nativeQueryOneAsync(Class type, String sql, Map params) { + return nativeQueryAsync(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) @@ -158,6 +280,20 @@ public interface DataSqlSource extends DataSource { }, params); } + default CompletableFuture> nativeQueryListAsync(Class type, String sql, Map params) { + return nativeQueryAsync(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(); @@ -170,40 +306,88 @@ public interface DataSqlSource extends DataSource { }, params); } + default CompletableFuture> nativeQueryMapAsync(Class keyType, Class valType, String sql, Map params) { + return nativeQueryAsync(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 CompletableFuture> nativeQueryStrStrMapAsync(String sql, Map params) { + return nativeQueryMapAsync(String.class, String.class, sql, params); + } + default Map nativeQueryIntStrMap(String sql, Map params) { return nativeQueryMap(Integer.class, String.class, sql, params); } + default CompletableFuture> nativeQueryIntStrMapAsync(String sql, Map params) { + return nativeQueryMapAsync(Integer.class, String.class, sql, params); + } + //----------------------------- JavaBean ----------------------------- default int nativeUpdate(String sql, Serializable bean) { return nativeUpdate(sql, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); } + default CompletableFuture nativeUpdateAsync(String sql, Serializable bean) { + return nativeUpdateAsync(sql, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); + } + default V nativeQuery(String sql, Function handler, Serializable bean) { return nativeQuery(sql, null, handler, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); } + default CompletableFuture nativeQueryAsync(String sql, Function handler, Serializable bean) { + return nativeQueryAsync(sql, null, handler, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); + } + default V nativeQueryOne(Class type, String sql, Serializable bean) { return nativeQueryOne(type, sql, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); } + default CompletableFuture nativeQueryOneAsync(Class type, String sql, Serializable bean) { + return nativeQueryOneAsync(type, sql, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); + } + default List nativeQueryList(Class type, String sql, Serializable bean) { return nativeQueryList(type, sql, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); } + default CompletableFuture> nativeQueryListAsync(Class type, String sql, Serializable bean) { + return nativeQueryListAsync(type, sql, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); + } + default Map nativeQueryMap(Class keyType, Class valType, String sql, Serializable bean) { return nativeQueryMap(keyType, valType, sql, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); } + default CompletableFuture> nativeQueryMapAsync(Class keyType, Class valType, String sql, Serializable bean) { + return nativeQueryMapAsync(keyType, valType, sql, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); + } + default Map nativeQueryStrStrMap(String sql, Serializable bean) { return nativeQueryMap(String.class, String.class, sql, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); } + default CompletableFuture> nativeQueryStrStrMapAsync(String sql, Serializable bean) { + return nativeQueryMapAsync(String.class, String.class, sql, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); + } + default Map nativeQueryIntStrMap(String sql, Serializable bean) { return nativeQueryMap(Integer.class, String.class, sql, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); } + + default CompletableFuture> nativeQueryIntStrMapAsync(String sql, Serializable bean) { + return nativeQueryMapAsync(Integer.class, String.class, sql, (Map) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE)); + } }