增加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 * @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>>() { private static final Type collectionObjectType = new TypeToken<Collection<Object>>() {
}.getType(); }.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<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 * @param factory ConvertFactory
*/ */
public AnyDecoder(final ConvertFactory factory) { public AnyDecoder(final ConvertFactory factory) {
this.stringDecoder = factory.loadDecoder(String.class); this(mapCreator, mapObjectType, collectionCreator, collectionObjectType, 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);
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 @Override
public Object convertFrom(Reader in) { public T convertFrom(Reader in) {
ValueType vt = in.readType(); ValueType vt = in.readType();
if (vt == null) { if (vt == null) {
return null; return null;
} }
switch (vt) { switch (vt) {
case ARRAY: case ARRAY:
return this.collectionDecoder.convertFrom(in); return (T) this.collectionDecoder.convertFrom(in);
case MAP: 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 @Override

View File

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

View File

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

View File

@@ -6,12 +6,9 @@
package org.redkale.test.convert; package org.redkale.test.convert;
import java.io.*; import java.io.*;
import org.redkale.convert.json.JsonConvert; import java.nio.ByteBuffer;
import org.redkale.convert.json.JsonFactory; import java.util.Map;
import java.nio.*; import org.junit.jupiter.api.*;
import java.util.*;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.redkale.convert.json.*; import org.redkale.convert.json.*;
/** /**
@@ -107,4 +104,40 @@ public class JsonMainTest {
long v = convert.convertFrom(long.class, "100"); long v = convert.convertFrom(long.class, "100");
Assertions.assertEquals(100, v); 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());
}
} }