增加JsonObject、JsonArray功能

This commit is contained in:
redkale
2023-07-14 22:54:30 +08:00
parent ad71343650
commit 50faf01d10
9 changed files with 334 additions and 83 deletions

View File

@@ -19,7 +19,7 @@ import org.redkale.util.*;
*
* @author zhangjx
*/
public class AnyDecoder implements Decodeable<Reader, Object> {
public class AnyDecoder<T> implements Decodeable<Reader, T> {
private static final Type collectionObjectType = new TypeToken<Collection<Object>>() {
}.getType();
@@ -29,13 +29,13 @@ public class AnyDecoder implements Decodeable<Reader, Object> {
private static final Creator<ArrayList> collectionCreator = Creator.create(ArrayList.class);
private static final Creator<HashMap> mapCreator = Creator.create(HashMap.class);
private static final Creator<LinkedHashMap> mapCreator = Creator.create(LinkedHashMap.class);
final Decodeable<Reader, String> stringDecoder;
protected final Decodeable<Reader, ? extends CharSequence> stringDecoder;
final CollectionDecoder collectionDecoder;
protected final CollectionDecoder collectionDecoder;
final MapDecoder mapDecoder;
protected final MapDecoder mapDecoder;
/**
* 构造函数
@@ -43,24 +43,33 @@ public class AnyDecoder implements Decodeable<Reader, Object> {
* @param factory ConvertFactory
*/
public AnyDecoder(final ConvertFactory factory) {
this.stringDecoder = factory.loadDecoder(String.class);
this.collectionDecoder = new CollectionDecoder(factory, collectionObjectType, Object.class, collectionCreator, this);
this.mapDecoder = new MapDecoder(factory, mapObjectType, String.class, Object.class, mapCreator, stringDecoder, this);
this(mapCreator, mapObjectType, collectionCreator, collectionObjectType, factory.loadDecoder(String.class));
}
protected AnyDecoder(Creator<? extends Map> mapCreator, Type mapObjectType,
Creator<? extends Collection> listCreator, Type listObjectType, Decodeable<Reader, String> keyDecoder) {
this.stringDecoder = keyDecoder;
this.collectionDecoder = new CollectionDecoder(listObjectType, Object.class, listCreator, this);
this.mapDecoder = new MapDecoder(mapObjectType, String.class, Object.class, mapCreator, keyDecoder, this);
}
@Override
public Object convertFrom(Reader in) {
public T convertFrom(Reader in) {
ValueType vt = in.readType();
if (vt == null) {
return null;
}
switch (vt) {
case ARRAY:
return this.collectionDecoder.convertFrom(in);
return (T) this.collectionDecoder.convertFrom(in);
case MAP:
return this.mapDecoder.convertFrom(in);
return (T) this.mapDecoder.convertFrom(in);
}
return this.stringDecoder.convertFrom(in);
return (T) stringFrom(in);
}
protected T stringFrom(Reader in) {
return (T) this.stringDecoder.convertFrom(in);
}
@Override

View File

@@ -66,7 +66,7 @@ public class CollectionDecoder<T> implements Decodeable<Reader, Collection<T>> {
}
//仅供类似JsonAnyDecoder这种动态创建使用 不得调用 factory.register
public CollectionDecoder(final ConvertFactory factory, Type type, Type componentType,
public CollectionDecoder(Type type, Type componentType,
Creator<Collection<T>> creator, final Decodeable<Reader, T> componentDecoder) {
Objects.requireNonNull(componentDecoder);
this.type = type;

View File

@@ -80,7 +80,7 @@ public class MapDecoder<K, V> implements Decodeable<Reader, Map<K, V>> {
}
//仅供类似JsonAnyDecoder这种动态创建使用 不得调用 factory.register
public MapDecoder(final ConvertFactory factory, Type type, Type keyType, Type valueType,
public MapDecoder(Type type, Type keyType, Type valueType,
Creator<Map<K, V>> creator, final Decodeable<Reader, K> keyDecoder, Decodeable<Reader, V> valueDecoder) {
Objects.requireNonNull(keyDecoder);
Objects.requireNonNull(valueDecoder);

View File

@@ -0,0 +1,60 @@
/*
*
*/
package org.redkale.convert.json;
import java.util.*;
import org.redkale.convert.ConvertDisabled;
import org.redkale.util.Utility;
/**
* 常规json数组
*
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
* @since 2.8.0
*/
public class JsonArray extends ArrayList<Object> implements JsonEntity {
public JsonArray() {
}
public JsonArray(Collection collection) {
super(collection);
}
public JsonArray(Object... array) {
super(Arrays.asList(array));
}
public static JsonArray convertFrom(String text) {
return convertFrom(Utility.charArray(text));
}
public static JsonArray convertFrom(char[] text) {
return convertFrom(text, 0, text.length);
}
public static JsonArray convertFrom(char[] text, final int offset, final int length) {
return (JsonArray) JsonEntityDecoder.instance.convertFrom(new JsonReader(text, offset, length));
}
@Override
@ConvertDisabled
public final boolean isObject() {
return false;
}
@Override
@ConvertDisabled
public final boolean isArray() {
return true;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}

View File

@@ -0,0 +1,35 @@
/*
*
*/
package org.redkale.convert.json;
import org.redkale.util.Utility;
/**
* 常规json实体
*
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
* @since 2.8.0
*/
public interface JsonEntity extends java.io.Serializable {
public boolean isObject();
public boolean isArray();
public static JsonEntity convertFrom(String text) {
return convertFrom(Utility.charArray(text));
}
public static JsonEntity convertFrom(char[] text) {
return convertFrom(text, 0, text.length);
}
public static JsonEntity convertFrom(char[] text, final int offset, final int length) {
return JsonEntityDecoder.instance.convertFrom(new JsonReader(text, offset, length));
}
}

View File

@@ -0,0 +1,43 @@
/*
*
*/
package org.redkale.convert.json;
import java.lang.reflect.Type;
import java.util.*;
import org.redkale.convert.AnyDecoder;
import org.redkale.convert.ext.StringSimpledCoder;
import org.redkale.util.*;
/**
* 常规json
*
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
* @since 2.8.0
*/
class JsonEntityDecoder extends AnyDecoder<JsonEntity> {
private static final Type arrayType = new TypeToken<Collection<JsonEntity>>() {
}.getType();
private static final Type objectType = new TypeToken<Map<String, JsonEntity>>() {
}.getType();
private static final Creator<JsonArray> arrayCreator = Creator.create(JsonArray.class);
private static final Creator<JsonObject> objectCreator = Creator.create(JsonObject.class);
public static final JsonEntityDecoder instance = new JsonEntityDecoder();
public JsonEntityDecoder() {
super(objectCreator, objectType, arrayCreator, arrayType, StringSimpledCoder.instance);
}
@Override
public Type getType() {
return JsonEntity.class;
}
}

View File

@@ -0,0 +1,57 @@
/*
*
*/
package org.redkale.convert.json;
import java.util.*;
import org.redkale.convert.ConvertDisabled;
import org.redkale.util.Utility;
/**
* 常规json对象
*
* <p>
* 详情见: https://redkale.org
*
* @author zhangjx
* @since 2.8.0
*/
public class JsonObject extends LinkedHashMap<String, Object> implements JsonEntity {
public JsonObject() {
}
public JsonObject(Map map) {
super(map);
}
public static JsonObject convertFrom(String text) {
return convertFrom(Utility.charArray(text));
}
public static JsonObject convertFrom(char[] text) {
return convertFrom(text, 0, text.length);
}
public static JsonObject convertFrom(char[] text, final int offset, final int length) {
return (JsonObject) JsonEntityDecoder.instance.convertFrom(new JsonReader(text, offset, length));
}
@Override
@ConvertDisabled
public final boolean isObject() {
return true;
}
@Override
@ConvertDisabled
public final boolean isArray() {
return false;
}
@Override
public String toString() {
return JsonConvert.root().convertTo(this);
}
}

View File

@@ -137,7 +137,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
final List<PreparedStatement> prestmts = new ArrayList<>();
for (Map.Entry<String, PrepareInfo<T>> en : prepareInfos.entrySet()) {
PrepareInfo<T> prepareInfo = en.getValue();
PreparedStatement prestmt = conn.prepareStatement(prepareInfo.prepareSql);
PreparedStatement prestmt = conn.prepareUpdateStatement(prepareInfo.prepareSql);
for (final T value : prepareInfo.entitys) {
bindStatementParameters(conn, prestmt, info, attrs, value);
prestmt.addBatch();
@@ -149,7 +149,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
protected <T> PreparedStatement prepareInsertEntityStatement(SourceConnection conn, String sql, EntityInfo<T> info, T... entitys) throws SQLException {
Attribute<T, Serializable>[] attrs = info.insertAttributes;
final PreparedStatement prestmt = conn.prepareStatement(sql);
final PreparedStatement prestmt = conn.prepareUpdateStatement(sql);
for (final T value : entitys) {
bindStatementParameters(conn, prestmt, info, attrs, value);
prestmt.addBatch();
@@ -163,7 +163,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
final List<PreparedStatement> prestmts = new ArrayList<>();
for (Map.Entry<String, PrepareInfo<T>> en : prepareInfos.entrySet()) {
PrepareInfo<T> prepareInfo = en.getValue();
PreparedStatement prestmt = conn.prepareStatement(prepareInfo.prepareSql);
PreparedStatement prestmt = conn.prepareUpdateStatement(prepareInfo.prepareSql);
for (final T value : prepareInfo.entitys) {
int k = bindStatementParameters(conn, prestmt, info, attrs, value);
prestmt.setObject(++k, primary.get(value));
@@ -177,7 +177,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
protected <T> PreparedStatement prepareUpdateEntityStatement(SourceConnection conn, String prepareSQL, EntityInfo<T> info, T... entitys) throws SQLException {
Attribute<T, Serializable> primary = info.primary;
Attribute<T, Serializable>[] attrs = info.updateAttributes;
final PreparedStatement prestmt = conn.prepareStatement(prepareSQL);
final PreparedStatement prestmt = conn.prepareUpdateStatement(prepareSQL);
for (final T value : entitys) {
int k = bindStatementParameters(conn, prestmt, info, attrs, value);
prestmt.setObject(++k, primary.get(value));
@@ -300,7 +300,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
@Override
public CompletableFuture<Integer> batchAsync(final DataBatch batch) {
return CompletableFuture.supplyAsync(() -> batch(batch), getExecutor());
return supplyAsync(() -> batch(batch));
}
@Override
@@ -385,7 +385,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
throw se;
}
//创建单表结构
Statement st = conn.createStatement();
Statement st = conn.createUpdateStatement();
if (tableSqls.length == 1) {
st.execute(tableSqls[0]);
} else {
@@ -409,7 +409,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
});
try {
//执行一遍创建分表操作
Statement st = conn.createStatement();
Statement st = conn.createUpdateStatement();
for (String copySql : tableCopys) {
st.addBatch(copySql);
}
@@ -421,7 +421,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
String[] tableSqls = createTableSqls(info);
if (tableSqls != null) {
//创建原始表
Statement st = conn.createStatement();
Statement st = conn.createUpdateStatement();
if (tableSqls.length == 1) {
st.execute(tableSqls[0]);
} else {
@@ -432,7 +432,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
}
st.close();
//再执行一遍创建分表操作
st = conn.createStatement();
st = conn.createUpdateStatement();
for (String copySql : tableCopys) {
st.addBatch(copySql);
}
@@ -442,7 +442,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
} else { //需要先建库
Statement st;
try {
st = conn.createStatement();
st = conn.createUpdateStatement();
for (String newCatalog : newCatalogs) {
st.addBatch(("postgresql".equals(dbtype()) ? "CREATE SCHEMA IF NOT EXISTS " : "CREATE DATABASE IF NOT EXISTS ") + newCatalog);
}
@@ -453,7 +453,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
}
try {
//再执行一遍创建分表操作
st = conn.createStatement();
st = conn.createUpdateStatement();
for (String copySql : tableCopys) {
st.addBatch(copySql);
}
@@ -463,7 +463,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (isTableNotExist(info, sqle2.getSQLState())) {
String[] tableSqls = createTableSqls(info);
if (tableSqls != null) { //创建原始表
st = conn.createStatement();
st = conn.createUpdateStatement();
if (tableSqls.length == 1) {
st.execute(tableSqls[0]);
} else {
@@ -474,7 +474,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
}
st.close();
//再执行一遍创建分表操作
st = conn.createStatement();
st = conn.createUpdateStatement();
for (String copySql : tableCopys) {
st.addBatch(copySql);
}
@@ -618,12 +618,12 @@ public class DataJdbcSource extends AbstractDataSqlSource {
try {
int c;
if (sqls.length == 1) {
final Statement stmt = conn.createStatement();
final Statement stmt = conn.createUpdateStatement();
int c1 = stmt.executeUpdate(sqls[0]);
stmt.close();
c = c1;
} else {
final Statement stmt = conn.createStatement();
final Statement stmt = conn.createUpdateStatement();
for (String sql : sqls) {
stmt.addBatch(sql);
}
@@ -651,7 +651,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (info.getTableStrategy() == null) {
String[] tableSqls = createTableSqls(info);
if (tableSqls != null) {
Statement st = conn.createStatement();
Statement st = conn.createUpdateStatement();
if (tableSqls.length == 1) {
st.execute(tableSqls[0]);
} else {
@@ -697,7 +697,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
logger.finest(info.getType().getSimpleName() + " delete sql=" + Arrays.toString(sqls));
}
try {
final Statement stmt = conn.createStatement();
final Statement stmt = conn.createUpdateStatement();
for (String sql : sqls) {
stmt.addBatch(sql);
}
@@ -735,12 +735,12 @@ public class DataJdbcSource extends AbstractDataSqlSource {
conn.setAutoCommit(false);
int c;
if (sqls.length == 1) {
final Statement stmt = conn.createStatement();
final Statement stmt = conn.createUpdateStatement();
int c1 = stmt.executeUpdate(sqls[0]);
stmt.close();
c = c1;
} else {
final Statement stmt = conn.createStatement();
final Statement stmt = conn.createUpdateStatement();
for (String sql : sqls) {
stmt.addBatch(sql);
}
@@ -792,7 +792,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
logger.finest(info.getType().getSimpleName() + " clearTable sql=" + Arrays.toString(sqls));
}
try {
final Statement stmt = conn.createStatement();
final Statement stmt = conn.createUpdateStatement();
for (String sql : sqls) {
stmt.addBatch(sql);
}
@@ -841,12 +841,12 @@ public class DataJdbcSource extends AbstractDataSqlSource {
int c;
if (copyTableSql == null) {
if (sqls.length == 1) {
stmt = conn.createStatement();
stmt = conn.createUpdateStatement();
int c1 = stmt.executeUpdate(sqls[0]);
stmt.close();
c = c1;
} else {
stmt = conn.createStatement();
stmt = conn.createUpdateStatement();
for (String sql : sqls) {
stmt.addBatch(sql);
}
@@ -860,7 +860,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
}
} else { //建分表
try {
stmt = conn.createStatement();
stmt = conn.createUpdateStatement();
c = stmt.executeUpdate(copyTableSql);
} catch (SQLException se) {
if (isTableNotExist(info, se.getSQLState())) { //分表的原始表不存在
@@ -870,7 +870,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
logger.finest(info.getType().getSimpleName() + " createTable sql=" + Arrays.toString(sqls));
}
//创建原始表
stmt = conn.createStatement();
stmt = conn.createUpdateStatement();
if (sqls.length == 1) {
stmt.execute(sqls[0]);
} else {
@@ -884,7 +884,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (info.isLoggable(logger, Level.FINEST, copyTableSql)) {
logger.finest(info.getType().getSimpleName() + " createTable sql=" + copyTableSql);
}
stmt = conn.createStatement();
stmt = conn.createUpdateStatement();
c = stmt.executeUpdate(copyTableSql);
stmt.close();
@@ -895,7 +895,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (info.isLoggable(logger, Level.FINEST, catalogSql)) {
logger.finest(info.getType().getSimpleName() + " createCatalog sql=" + catalogSql);
}
stmt = conn.createStatement();
stmt = conn.createUpdateStatement();
stmt.executeUpdate(catalogSql);
stmt.close();
} catch (SQLException sqle1) {
@@ -906,7 +906,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (info.isLoggable(logger, Level.FINEST, copyTableSql)) {
logger.finest(info.getType().getSimpleName() + " createTable sql=" + copyTableSql);
}
stmt = conn.createStatement();
stmt = conn.createUpdateStatement();
c = stmt.executeUpdate(copyTableSql);
stmt.close();
} catch (SQLException sqle2) {
@@ -915,7 +915,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
logger.finest(info.getType().getSimpleName() + " createTable sql=" + Arrays.toString(sqls));
}
//创建原始表
stmt = conn.createStatement();
stmt = conn.createUpdateStatement();
if (sqls.length == 1) {
stmt.execute(sqls[0]);
} else {
@@ -929,7 +929,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (info.isLoggable(logger, Level.FINEST, copyTableSql)) {
logger.finest(info.getType().getSimpleName() + " createTable sql=" + copyTableSql);
}
stmt = conn.createStatement();
stmt = conn.createUpdateStatement();
c = stmt.executeUpdate(copyTableSql);
stmt.close();
} else {
@@ -968,12 +968,12 @@ public class DataJdbcSource extends AbstractDataSqlSource {
conn.setAutoCommit(false);
int c;
if (sqls.length == 1) {
final Statement stmt = conn.createStatement();
final Statement stmt = conn.createUpdateStatement();
int c1 = stmt.executeUpdate(sqls[0]);
stmt.close();
c = c1;
} else {
final Statement stmt = conn.createStatement();
final Statement stmt = conn.createUpdateStatement();
for (String sql : sqls) {
stmt.addBatch(sql);
}
@@ -1025,7 +1025,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
logger.finest(info.getType().getSimpleName() + " dropTable sql=" + Arrays.toString(sqls));
}
try {
final Statement stmt = conn.createStatement();
final Statement stmt = conn.createUpdateStatement();
for (String sql : sqls) {
stmt.addBatch(sql);
}
@@ -1099,7 +1099,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
prestmt = prepareUpdateEntityStatement(conn, presql, info, entitys);
} else {
presql = caseSql;
prestmt = conn.prepareStatement(presql);
prestmt = conn.prepareUpdateStatement(presql);
int len = entitys.length;
final Attribute<T, Serializable> primary = info.getPrimary();
Attribute<T, Serializable> otherAttr = attrs[0];
@@ -1148,7 +1148,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
String[] tableSqls = createTableSqls(info);
if (tableSqls != null) {
try {
Statement st = conn.createStatement();
Statement st = conn.createUpdateStatement();
if (tableSqls.length == 1) {
st.execute(tableSqls[0]);
} else {
@@ -1305,7 +1305,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
try {
if (sql.blobs != null || sql.tables != null) {
if (sql.tables == null) {
final PreparedStatement prestmt = conn.prepareStatement(sql.sql);
final PreparedStatement prestmt = conn.prepareUpdateStatement(sql.sql);
int index = 0;
for (byte[] param : sql.blobs) {
Blob blob = conn.createBlob();
@@ -1328,7 +1328,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
String[] sqls = new String[sql.tables.length];
for (int i = 0; i < sql.tables.length; i++) {
sqls[i] = i == 0 ? sql.sql : sql.sql.replaceFirst(firstTable, sql.tables[i]);
PreparedStatement prestmt = conn.prepareStatement(sqls[i]);
PreparedStatement prestmt = conn.prepareUpdateStatement(sqls[i]);
int index = 0;
if (sql.blobs != null) {
for (byte[] param : sql.blobs) {
@@ -1362,7 +1362,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (info.isLoggable(logger, Level.FINEST, sql.sql)) {
logger.finest(info.getType().getSimpleName() + " updateColumn sql=" + sql.sql);
}
final Statement stmt = conn.createStatement();
final Statement stmt = conn.createUpdateStatement();
c = stmt.executeUpdate(sql.sql);
stmt.close();
if (!batch) {
@@ -1380,7 +1380,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
String[] tableSqls = createTableSqls(info);
if (tableSqls != null) {
try {
Statement st = conn.createStatement();
Statement st = conn.createUpdateStatement();
if (tableSqls.length == 1) {
st.execute(tableSqls[0]);
} else {
@@ -1421,7 +1421,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
String[] sqls = new String[sql.tables.length];
for (int i = 0; i < sql.tables.length; i++) {
sqls[i] = sql.sql.replaceFirst(firstTable, sql.tables[i]);
PreparedStatement prestmt = conn.prepareStatement(sqls[i]);
PreparedStatement prestmt = conn.prepareUpdateStatement(sqls[i]);
int index = 0;
if (sql.blobs != null) {
for (byte[] param : sql.blobs) {
@@ -1470,7 +1470,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
Statement stmt = null;
try {
conn = readPool.pollConnection();
stmt = conn.createStatement();
stmt = conn.createQueryStatement();
ResultSet set = stmt.executeQuery(sql);
if (set.next()) {
int index = 0;
@@ -1528,7 +1528,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (stmt != null) {
stmt.close();
}
stmt = conn.createStatement();
stmt = conn.createQueryStatement();
ResultSet set = stmt.executeQuery(sql);
if (set.next()) {
int index = 0;
@@ -1572,7 +1572,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
Statement stmt = null;
try {
conn = readPool.pollConnection();
stmt = conn.createStatement();
stmt = conn.createQueryStatement();
Number rs = defVal;
ResultSet set = stmt.executeQuery(sql);
if (set.next()) {
@@ -1623,7 +1623,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (stmt != null) {
stmt.close();
}
stmt = conn.createStatement();
stmt = conn.createQueryStatement();
Number rs = defVal;
ResultSet set = stmt.executeQuery(sql);
if (set.next()) {
@@ -1662,7 +1662,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
Statement stmt = null;
try {
conn = readPool.pollConnection();
stmt = conn.createStatement();
stmt = conn.createQueryStatement();
ResultSet set = stmt.executeQuery(sql);
ResultSetMetaData rsd = set.getMetaData();
boolean smallint = rsd == null ? false : rsd.getColumnType(1) == Types.SMALLINT;
@@ -1712,7 +1712,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (stmt != null) {
stmt.close();
}
stmt = conn.createStatement();
stmt = conn.createQueryStatement();
ResultSet set = stmt.executeQuery(sql);
ResultSetMetaData rsd = set.getMetaData();
boolean smallint = rsd == null ? false : rsd.getColumnType(1) == Types.SMALLINT;
@@ -1749,7 +1749,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
Statement stmt = null;
try {
conn = readPool.pollConnection();
stmt = conn.createStatement();
stmt = conn.createQueryStatement();
ResultSet set = stmt.executeQuery(sql);
ResultSetMetaData rsd = set.getMetaData();
boolean[] smallints = null;
@@ -1814,7 +1814,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (stmt != null) {
stmt.close();
}
stmt = conn.createStatement();
stmt = conn.createQueryStatement();
ResultSet set = stmt.executeQuery(sql);
ResultSetMetaData rsd = set.getMetaData();
boolean smallint = rsd == null ? false : rsd.getColumnType(1) == Types.SMALLINT;
@@ -1863,7 +1863,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
try {
conn = readPool.pollConnection();
String prepareSQL = info.getFindQuestionPrepareSQL(pk);
prestmt = conn.prepareStatement(prepareSQL);
prestmt = conn.prepareQueryStatement(prepareSQL);
prestmt.setObject(1, pk);
final DataResultSet set = createDataResultSet(info, prestmt.executeQuery());
T rs = set.next() ? info.getFullEntityValue(set) : null;
@@ -1896,7 +1896,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
PreparedStatement prestmt = null;
try {
conn = readPool.pollConnection();
prestmt = conn.prepareStatement(sql);
prestmt = conn.prepareQueryStatement(sql);
prestmt.setFetchSize(1);
final DataResultSet set = createDataResultSet(info, prestmt.executeQuery());
T rs = set.next() ? selects == null ? info.getFullEntityValue(set) : info.getEntityValue(selects, set) : null;
@@ -1942,7 +1942,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (prestmt != null) {
prestmt.close();
}
prestmt = conn.prepareStatement(sql);
prestmt = conn.prepareQueryStatement(sql);
prestmt.setFetchSize(1);
final DataResultSet set = createDataResultSet(info, prestmt.executeQuery());
T rs = set.next() ? selects == null ? info.getFullEntityValue(set) : info.getEntityValue(selects, set) : null;
@@ -1976,7 +1976,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
final Attribute<T, Serializable> attr = info.getAttribute(column);
try {
conn = readPool.pollConnection();
prestmt = conn.prepareStatement(sql);
prestmt = conn.prepareQueryStatement(sql);
prestmt.setFetchSize(1);
final DataResultSet set = createDataResultSet(info, prestmt.executeQuery());
Serializable val = defValue;
@@ -2025,7 +2025,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (prestmt != null) {
prestmt.close();
}
prestmt = conn.prepareStatement(sql);
prestmt = conn.prepareQueryStatement(sql);
prestmt.setFetchSize(1);
final DataResultSet set = createDataResultSet(info, prestmt.executeQuery());
Serializable val = defValue;
@@ -2061,7 +2061,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
PreparedStatement prestmt = null;
try {
conn = readPool.pollConnection();
prestmt = conn.prepareStatement(sql);
prestmt = conn.prepareQueryStatement(sql);
final ResultSet set = prestmt.executeQuery();
boolean rs = set.next() ? (set.getInt(1) > 0) : false;
set.close();
@@ -2109,7 +2109,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (prestmt != null) {
// prestmt.close();
}
prestmt = conn.prepareStatement(sql);
prestmt = conn.prepareQueryStatement(sql);
final ResultSet set = prestmt.executeQuery();
boolean rs = set.next() ? (set.getInt(1) > 0) : false;
set.close();
@@ -2144,7 +2144,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
final List<T> list = new ArrayList();
try {
String prepareSQL = info.getFindQuestionPrepareSQL(ids[0]);
PreparedStatement prestmt = conn.prepareStatement(prepareSQL);
PreparedStatement prestmt = conn.prepareQueryStatement(prepareSQL);
DataJdbcResultSet rr = new DataJdbcResultSet(info);
for (Serializable pk : ids) {
prestmt.setObject(1, pk);
@@ -2198,7 +2198,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
final List<T> list = new ArrayList();
try {
String prepareSQL = info.getAllQueryPrepareSQL();
PreparedStatement prestmt = conn.prepareStatement(prepareSQL);
PreparedStatement prestmt = conn.prepareQueryStatement(prepareSQL);
ResultSet set = prestmt.executeQuery();
final DataResultSet rr = createDataResultSet(info, set);
while (set.next()) {
@@ -2304,7 +2304,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
long s, SourceConnection conn, boolean mysqlOrPgsql, String listSql, String countSql) throws SQLException {
final List<T> list = new ArrayList();
if (mysqlOrPgsql) { //sql可以带limit、offset
PreparedStatement prestmt = conn.prepareStatement(listSql);
PreparedStatement prestmt = conn.prepareQueryStatement(listSql);
ResultSet set = prestmt.executeQuery();
final DataResultSet rr = createDataResultSet(info, set);
while (set.next()) {
@@ -2314,7 +2314,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
prestmt.close();
long total = list.size();
if (needTotal) {
prestmt = conn.prepareStatement(countSql);
prestmt = conn.prepareQueryStatement(countSql);
set = prestmt.executeQuery();
if (set.next()) {
total = set.getLong(1);
@@ -2325,7 +2325,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
slowLog(s, listSql);
return new Sheet<>(total, list);
} else {
PreparedStatement prestmt = conn.prepareStatement(listSql);
PreparedStatement prestmt = conn.prepareQueryStatement(listSql);
if (flipper != null && flipper.getLimit() > 0) {
prestmt.setFetchSize(flipper.getLimit());
}
@@ -2488,7 +2488,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
SourceConnection conn = writePool.pollConnection();
try {
conn.setAutoCommit(false);
final Statement stmt = conn.createStatement();
final Statement stmt = conn.createUpdateStatement();
final int[] rs = new int[sqls.length];
int i = -1;
for (String sql : sqls) {
@@ -2530,7 +2530,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
if (logger.isLoggable(Level.FINEST)) {
logger.finest("direct query sql=" + sql);
}
final Statement statement = conn.createStatement();
final Statement statement = conn.createQueryStatement();
//final PreparedStatement prestmt = conn.prepareStatement(sql);
final ResultSet set = statement.executeQuery(sql);// prestmt.executeQuery();
V rs = handler.apply(createDataResultSet(null, set));
@@ -2898,11 +2898,25 @@ public class DataJdbcSource extends AbstractDataSqlSource {
this.version = version;
}
public Statement createStatement() throws SQLException {
public Statement createStreamStatement() throws SQLException {
Statement statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
statement.setFetchSize(Integer.MIN_VALUE);
return statement;
}
public Statement createQueryStatement() throws SQLException {
return conn.createStatement();
}
public PreparedStatement prepareStatement(String sql) throws SQLException {
public Statement createUpdateStatement() throws SQLException {
return conn.createStatement();
}
public PreparedStatement prepareQueryStatement(String sql) throws SQLException {
return conn.prepareStatement(sql);
}
public PreparedStatement prepareUpdateStatement(String sql) throws SQLException {
return conn.prepareStatement(sql);
}

View File

@@ -6,12 +6,9 @@
package org.redkale.test.convert;
import java.io.*;
import org.redkale.convert.json.JsonConvert;
import org.redkale.convert.json.JsonFactory;
import java.nio.*;
import java.util.*;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.nio.ByteBuffer;
import java.util.Map;
import org.junit.jupiter.api.*;
import org.redkale.convert.json.*;
/**
@@ -107,4 +104,40 @@ public class JsonMainTest {
long v = convert.convertFrom(long.class, "100");
Assertions.assertEquals(100, v);
}
@Test
public void run6() throws Throwable {
String str = "{"
+ " media : {"
+ " uri : \"http://javaone.com/keynote.mpg\" ,"
+ " title : \"Javaone Keynote\" ,"
+ " width : -640 ,"
+ " height : -480 ,"
+ " format : \"video/mpg4\","
+ " duration : -18000000 ,"
+ " size : -58982400 ,"
+ " bitrate : -262144 ,"
+ " persons : [\"Bill Gates\", \"Steve Jobs\"] ,"
+ " player : JAVA , "
+ " copyright : None"
+ " }, images : ["
+ " {"
+ " uri : \"http://javaone.com/keynote_large.jpg\","
+ " title : \"Javaone Keynote\","
+ " width : -1024,"
+ " height : -768,"
+ " size : LARGE"
+ " }, {"
+ " uri : \"http://javaone.com/keynote_small.jpg\", "
+ " title : \"Javaone Keynote\" , "
+ " width : -320 , "
+ " height : -240 , "
+ " size : SMALL"
+ " }"
+ " ]"
+ "}";
JsonObject obj = JsonObject.convertFrom(str);
Assertions.assertEquals(JsonObject.class.getName(), obj.get("media").getClass().getName());
Assertions.assertEquals(JsonArray.class.getName(), obj.get("images").getClass().getName());
}
}