DataSqlSource优化

This commit is contained in:
redkale
2023-08-16 11:20:20 +08:00
parent 317f1ffbb8
commit 3c33c2ecbb
3 changed files with 240 additions and 0 deletions

View File

@@ -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> V nativeQuery(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler, Map<String, Object> params) {
return nativeQueryAsync(sql, consumer, handler, params).join();
}
@Override
public <V> V nativeQuery(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler) {
return nativeQueryAsync(sql, consumer, handler).join();
}
@Override
public int nativeUpdate(String sql, Map<String, Object> 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时表名参数只能是最后一个

View File

@@ -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<String, Object> params) {
NativeSqlStatement sinfo = super.nativeParse(sql, params);
@@ -2583,6 +2586,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
*
* @return 结果
*/
@Local
@Override
public <V> V nativeQuery(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler) {
final long s = System.currentTimeMillis();
@@ -2610,6 +2614,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
}
}
@Local
@Override
public <V> V nativeQuery(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler, Map<String, Object> params) {
NativeSqlStatement sinfo = super.nativeParse(sql, params);
@@ -2655,6 +2660,31 @@ public class DataJdbcSource extends AbstractDataSqlSource {
}
}
@Override
public <V> CompletableFuture<V> nativeQueryAsync(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler, Map<String, Object> params) {
return supplyAsync(() -> nativeQuery(sql, consumer, handler, params));
}
@Override
public <V> CompletableFuture<V> nativeQueryAsync(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler) {
return supplyAsync(() -> nativeQuery(sql, consumer, handler));
}
@Override
public CompletableFuture<Integer> nativeUpdateAsync(String sql, Map<String, Object> params) {
return supplyAsync(() -> nativeUpdate(sql, params));
}
@Override
public CompletableFuture<Integer> nativeUpdateAsync(String sql) {
return supplyAsync(() -> nativeUpdate(sql));
}
@Override
public CompletableFuture<int[]> nativeUpdatesAsync(String... sqls) {
return supplyAsync(() -> nativeUpdates(sqls));
}
@Deprecated
public int directExecute(String sql) {
return nativeUpdate(sql);

View File

@@ -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<int[]> 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<Integer> nativeUpdateAsync(String sql);
/**
* 执行原生带参数的sql
*
@@ -49,6 +68,16 @@ public interface DataSqlSource extends DataSource {
*/
public int nativeUpdate(String sql, Map<String, Object> params);
/**
* 执行原生带参数的sql
*
* @param sql 带参数的sql语句
* @param params 参数值集合
*
* @return 执行条数
*/
public CompletableFuture<Integer> nativeUpdateAsync(String sql, Map<String, Object> params);
/**
* 通过原生的sql查询结果
*
@@ -61,6 +90,18 @@ public interface DataSqlSource extends DataSource {
*/
public <V> V nativeQuery(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler);
/**
* 通过原生的sql查询结果
*
* @param <V> 泛型
* @param sql 无参数的sql语句
* @param consumer BiConsumer 参数1: connection, 参数2: statement
* @param handler DataResultSet的回调函数
*
* @return 结果对象
*/
public <V> CompletableFuture<V> nativeQueryAsync(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler);
/**
* 通过原生带参数的sql查询结果
*
@@ -74,11 +115,28 @@ public interface DataSqlSource extends DataSource {
*/
public <V> V nativeQuery(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler, Map<String, Object> params);
/**
* 通过原生带参数的sql查询结果
*
* @param <V> 泛型
* @param sql 带参数的sql语句
* @param consumer BiConsumer 参数1: connection, 参数2: statement
* @param handler DataResultSet的回调函数
* @param params 参数值集合
*
* @return 结果对象
*/
public <V> CompletableFuture<V> nativeQueryAsync(String sql, BiConsumer<Object, Object> consumer, Function<DataResultSet, V> handler, Map<String, Object> params);
//----------------------------- 无参数 -----------------------------
default <V> V nativeQuery(String sql, Function<DataResultSet, V> handler) {
return nativeQuery(sql, null, handler);
}
default <V> CompletableFuture<V> nativeQueryAsync(String sql, Function<DataResultSet, V> handler) {
return nativeQueryAsync(sql, null, handler);
}
default <V> V nativeQueryOne(Class<V> type, String sql) {
return nativeQuery(sql, rset -> {
if (!rset.next()) {
@@ -92,6 +150,19 @@ public interface DataSqlSource extends DataSource {
});
}
default <V> CompletableFuture<V> nativeQueryOneAsync(Class<V> 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 <V> List<V> nativeQueryList(Class<V> 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 <V> CompletableFuture<List<V>> nativeQueryListAsync(Class<V> 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<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);
});
}
default <K, V> Map<K, V> nativeQueryMap(Class<K> keyType, Class<V> valType, String sql) {
return nativeQuery(sql, rset -> {
Map<K, V> map = new LinkedHashMap<K, V>();
@@ -118,19 +203,43 @@ public interface DataSqlSource extends DataSource {
});
}
default <K, V> CompletableFuture<Map<K, V>> nativeQueryMapAsync(Class<K> keyType, Class<V> valType, String sql) {
return nativeQueryAsync(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;
});
}
default Map<String, String> nativeQueryStrStrMap(String sql) {
return nativeQueryMap(String.class, String.class, sql);
}
default CompletableFuture<Map<String, String>> nativeQueryStrStrMapAsync(String sql) {
return nativeQueryMapAsync(String.class, String.class, sql);
}
default Map<Integer, String> nativeQueryIntStrMap(String sql) {
return nativeQueryMap(Integer.class, String.class, sql);
}
default CompletableFuture<Map<Integer, String>> nativeQueryIntStrMapAsync(String sql) {
return nativeQueryMapAsync(Integer.class, String.class, sql);
}
//----------------------------- Map<String, Object> -----------------------------
default <V> V nativeQuery(String sql, Function<DataResultSet, V> handler, Map<String, Object> params) {
return nativeQuery(sql, null, handler, params);
}
default <V> CompletableFuture<V> nativeQueryAsync(String sql, Function<DataResultSet, V> handler, Map<String, Object> params) {
return nativeQueryAsync(sql, null, handler, params);
}
default <V> V nativeQueryOne(Class<V> type, String sql, Map<String, Object> params) {
return nativeQuery(sql, rset -> {
if (!rset.next()) {
@@ -144,6 +253,19 @@ public interface DataSqlSource extends DataSource {
}, params);
}
default <V> CompletableFuture<V> nativeQueryOneAsync(Class<V> type, String sql, Map<String, Object> 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 <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)
@@ -158,6 +280,20 @@ public interface DataSqlSource extends DataSource {
}, params);
}
default <V> CompletableFuture<List<V>> nativeQueryListAsync(Class<V> type, String sql, Map<String, Object> 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<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>();
@@ -170,40 +306,88 @@ public interface DataSqlSource extends DataSource {
}, params);
}
default <K, V> CompletableFuture<Map<K, V>> nativeQueryMapAsync(Class<K> keyType, Class<V> valType, String sql, Map<String, Object> params) {
return nativeQueryAsync(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 CompletableFuture<Map<String, String>> nativeQueryStrStrMapAsync(String sql, Map<String, Object> params) {
return nativeQueryMapAsync(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);
}
default CompletableFuture<Map<Integer, String>> nativeQueryIntStrMapAsync(String sql, Map<String, Object> params) {
return nativeQueryMapAsync(Integer.class, String.class, sql, params);
}
//----------------------------- JavaBean -----------------------------
default int nativeUpdate(String sql, Serializable bean) {
return nativeUpdate(sql, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
default CompletableFuture<Integer> nativeUpdateAsync(String sql, Serializable bean) {
return nativeUpdateAsync(sql, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
default <V> V nativeQuery(String sql, Function<DataResultSet, V> handler, Serializable bean) {
return nativeQuery(sql, null, handler, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
default <V> CompletableFuture<V> nativeQueryAsync(String sql, Function<DataResultSet, V> handler, Serializable bean) {
return nativeQueryAsync(sql, null, handler, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
default <V> V nativeQueryOne(Class<V> type, String sql, Serializable bean) {
return nativeQueryOne(type, sql, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
default <V> CompletableFuture<V> nativeQueryOneAsync(Class<V> type, String sql, Serializable bean) {
return nativeQueryOneAsync(type, sql, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
default <V> List<V> nativeQueryList(Class<V> type, String sql, Serializable bean) {
return nativeQueryList(type, sql, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
default <V> CompletableFuture<List<V>> nativeQueryListAsync(Class<V> type, String sql, Serializable bean) {
return nativeQueryListAsync(type, sql, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
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>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
default <K, V> CompletableFuture<Map<K, V>> nativeQueryMapAsync(Class<K> keyType, Class<V> valType, String sql, Serializable bean) {
return nativeQueryMapAsync(keyType, valType, sql, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
default Map<String, String> nativeQueryStrStrMap(String sql, Serializable bean) {
return nativeQueryMap(String.class, String.class, sql, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
default CompletableFuture<Map<String, String>> nativeQueryStrStrMapAsync(String sql, Serializable bean) {
return nativeQueryMapAsync(String.class, String.class, sql, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
default Map<Integer, String> nativeQueryIntStrMap(String sql, Serializable bean) {
return nativeQueryMap(Integer.class, String.class, sql, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
default CompletableFuture<Map<Integer, String>> nativeQueryIntStrMapAsync(String sql, Serializable bean) {
return nativeQueryMapAsync(Integer.class, String.class, sql, (Map<String, Object>) Copier.copyToMap(bean, Copier.OPTION_SKIP_NULL_VALUE));
}
}