From d6be80f8eaa2883a17db52accd02975215984f2b Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 30 Sep 2022 23:00:15 +0800 Subject: [PATCH] fix code --- .../cn/hutool/core/io/file/FileWrapper.java | 12 ++-- .../cn/hutool/core/lang/func/Wrapper.java | 17 +++++ .../cn/hutool/core/map/LinkedForestMap.java | 65 ++++++++++--------- .../java/cn/hutool/core/map/MapWrapper.java | 4 +- .../java/cn/hutool/crypto/CipherWrapper.java | 7 +- .../crypto/asymmetric/AsymmetricCrypto.java | 4 +- .../crypto/symmetric/SymmetricCrypto.java | 8 +-- .../main/java/cn/hutool/db/AbstractDb.java | 13 ++-- .../main/java/cn/hutool/db/DialectRunner.java | 10 +-- .../java/cn/hutool/db/dialect/Dialect.java | 8 +-- .../db/dialect/impl/AnsiSqlDialect.java | 22 +++---- .../cn/hutool/db/dialect/impl/H2Dialect.java | 8 +-- .../hutool/db/dialect/impl/MysqlDialect.java | 12 ++-- .../db/dialect/impl/PostgresqlDialect.java | 12 ++-- .../db/dialect/impl/SqlServer2012Dialect.java | 4 +- .../db/dialect/impl/Sqlite3Dialect.java | 6 +- .../cn/hutool/db/ds/DataSourceWrapper.java | 4 +- .../sql/{Wrapper.java => QuoteWrapper.java} | 13 ++-- .../java/cn/hutool/db/sql/SqlBuilder.java | 54 +++++++-------- .../cn/hutool/db/sql/StatementWrapper.java | 8 ++- .../cn/hutool/json/serialize/JSONString.java | 5 +- .../java/cn/hutool/json/Issue2555Test.java | 7 +- 22 files changed, 173 insertions(+), 130 deletions(-) create mode 100755 hutool-core/src/main/java/cn/hutool/core/lang/func/Wrapper.java rename hutool-db/src/main/java/cn/hutool/db/sql/{Wrapper.java => QuoteWrapper.java} (95%) diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileWrapper.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileWrapper.java index 6f330587b..3c712c028 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileWrapper.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileWrapper.java @@ -1,20 +1,21 @@ package cn.hutool.core.io.file; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.func.Wrapper; +import cn.hutool.core.util.CharsetUtil; + import java.io.File; import java.io.Serializable; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.CharsetUtil; - /** * 文件包装器,扩展文件对象 * * @author Looly * */ -public class FileWrapper implements Serializable{ +public class FileWrapper implements Wrapper, Serializable{ private static final long serialVersionUID = 1L; protected File file; @@ -40,7 +41,8 @@ public class FileWrapper implements Serializable{ * 获得文件 * @return 文件 */ - public File getFile() { + @Override + public File getRaw() { return file; } diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/func/Wrapper.java b/hutool-core/src/main/java/cn/hutool/core/lang/func/Wrapper.java new file mode 100755 index 000000000..bbc80eb94 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/lang/func/Wrapper.java @@ -0,0 +1,17 @@ +package cn.hutool.core.lang.func; + +/** + * 包装接口 + * + * @param 原始对象类型 + * @author looly + * @since 6.0.0 + */ +public interface Wrapper { + /** + * 获取原始对象 + * + * @return 原始对象 + */ + T getRaw(); +} diff --git a/hutool-core/src/main/java/cn/hutool/core/map/LinkedForestMap.java b/hutool-core/src/main/java/cn/hutool/core/map/LinkedForestMap.java index 80c91bbfd..a0b9fc00e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/LinkedForestMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/LinkedForestMap.java @@ -3,6 +3,7 @@ package cn.hutool.core.map; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.func.Wrapper; import cn.hutool.core.reflect.ClassUtil; import cn.hutool.core.text.StrUtil; import cn.hutool.core.util.ObjUtil; @@ -33,6 +34,7 @@ import java.util.stream.Collectors; * 也可以在获取到{@link TreeEntry}后,使用节点本身的方法对数进行操作或访问。 * * @param key类型 + * @param 值类型 * @author huangchengxing */ public class LinkedForestMap implements ForestMap { @@ -48,11 +50,11 @@ public class LinkedForestMap implements ForestMap { private final boolean allowOverrideParent; /** - * 构建{@link LinkedForestMap} + * 构建{@code LinkedForestMap} * * @param allowOverrideParent 当指定节点已经与其他节点构成了父子关系,是否允许将该节点的父节点强制替换为指定节点 */ - public LinkedForestMap(boolean allowOverrideParent) { + public LinkedForestMap(final boolean allowOverrideParent) { this.allowOverrideParent = allowOverrideParent; this.nodes = new LinkedHashMap<>(); } @@ -86,7 +88,7 @@ public class LinkedForestMap implements ForestMap { * @return 是否 */ @Override - public boolean containsKey(Object key) { + public boolean containsKey(final Object key) { return nodes.containsKey(key); } @@ -97,7 +99,7 @@ public class LinkedForestMap implements ForestMap { * @return 是否 */ @Override - public boolean containsValue(Object value) { + public boolean containsValue(final Object value) { return nodes.containsValue(value); } @@ -108,7 +110,7 @@ public class LinkedForestMap implements ForestMap { * @return 节点 */ @Override - public TreeEntry get(Object key) { + public TreeEntry get(final Object key) { return nodes.get(key); } @@ -126,7 +128,7 @@ public class LinkedForestMap implements ForestMap { * @return 删除的且引用关系已经改变的节点,若key没有对应节点,则返回null */ @Override - public TreeEntry remove(Object key) { + public TreeEntry remove(final Object key) { final TreeEntryNode target = nodes.remove(key); if (ObjUtil.isNull(target)) { return null; @@ -189,7 +191,7 @@ public class LinkedForestMap implements ForestMap { /** * 将{@link TreeEntryNode}包装为{@link EntryNodeWrapper} */ - private Map.Entry> wrap(Map.Entry> nodeEntry) { + private Map.Entry> wrap(final Map.Entry> nodeEntry) { return new EntryNodeWrapper<>(nodeEntry.getValue()); } @@ -207,7 +209,7 @@ public class LinkedForestMap implements ForestMap { * @return 节点,若key已有对应节点,则返回具有旧值的节点,否则返回null */ @Override - public TreeEntryNode putNode(K key, V value) { + public TreeEntryNode putNode(final K key, final V value) { TreeEntryNode target = nodes.get(key); if (ObjUtil.isNotNull(target)) { final V oldVal = target.getValue(); @@ -238,7 +240,7 @@ public class LinkedForestMap implements ForestMap { * @param childValue 子节点的值 */ @Override - public void putLinkedNodes(K parentKey, V parentValue, K childKey, V childValue) { + public void putLinkedNodes(final K parentKey, final V parentValue, final K childKey, final V childValue) { linkNodes(parentKey, childKey, (parent, child) -> { parent.setValue(parentValue); child.setValue(childValue); @@ -257,7 +259,7 @@ public class LinkedForestMap implements ForestMap { * @param childValue 子节点的值 */ @Override - public void putLinkedNodes(K parentKey, K childKey, V childValue) { + public void putLinkedNodes(final K parentKey, final K childKey, final V childValue) { linkNodes(parentKey, childKey, (parent, child) -> child.setValue(childValue)); } @@ -269,7 +271,7 @@ public class LinkedForestMap implements ForestMap { * @param consumer 对父节点和子节点的操作,允许为null */ @Override - public void linkNodes(K parentKey, K childKey, BiConsumer, TreeEntry> consumer) { + public void linkNodes(final K parentKey, final K childKey, BiConsumer, TreeEntry> consumer) { consumer = ObjUtil.defaultIfNull(consumer, (parent, child) -> { }); final TreeEntryNode parentNode = nodes.computeIfAbsent(parentKey, t -> new TreeEntryNode<>(null, t)); @@ -315,7 +317,7 @@ public class LinkedForestMap implements ForestMap { * @param childKey 子节点 */ @Override - public void unlinkNode(K parentKey, K childKey) { + public void unlinkNode(final K parentKey, final K childKey) { final TreeEntryNode childNode = nodes.get(childKey); if (ObjUtil.isNull(childNode)) { return; @@ -369,7 +371,7 @@ public class LinkedForestMap implements ForestMap { * @param parent 节点的父节点 * @param key 节点的key */ - public TreeEntryNode(TreeEntryNode parent, K key) { + public TreeEntryNode(final TreeEntryNode parent, final K key) { this(parent, key, null); } @@ -380,7 +382,7 @@ public class LinkedForestMap implements ForestMap { * @param key 节点的key * @param value 节点的value */ - public TreeEntryNode(TreeEntryNode parent, K key, V value) { + public TreeEntryNode(final TreeEntryNode parent, final K key, final V value) { this.parent = parent; this.key = key; this.value = value; @@ -432,7 +434,7 @@ public class LinkedForestMap implements ForestMap { * @return 节点的旧value */ @Override - public V setValue(V value) { + public V setValue(final V value) { final V oldVal = getValue(); this.value = value; return oldVal; @@ -449,7 +451,7 @@ public class LinkedForestMap implements ForestMap { * @return 遍历到的最后一个节点 */ TreeEntryNode traverseParentNodes( - boolean includeCurrent, Consumer> consumer, Predicate> breakTraverse) { + final boolean includeCurrent, final Consumer> consumer, Predicate> breakTraverse) { breakTraverse = ObjUtil.defaultIfNull(breakTraverse, n -> false); TreeEntryNode curr = includeCurrent ? this : this.parent; while (ObjUtil.isNotNull(curr)) { @@ -504,7 +506,7 @@ public class LinkedForestMap implements ForestMap { * @return 指定父节点,当不存在时返回null */ @Override - public TreeEntryNode getParent(K key) { + public TreeEntryNode getParent(final K key) { return traverseParentNodes(false, p -> { }, p -> p.equalsKey(key)); } @@ -516,7 +518,7 @@ public class LinkedForestMap implements ForestMap { * @param nodeConsumer 对节点的处理 */ @Override - public void forEachChild(boolean includeSelf, Consumer> nodeConsumer) { + public void forEachChild(final boolean includeSelf, final Consumer> nodeConsumer) { traverseChildNodes(includeSelf, (index, child) -> nodeConsumer.accept(child), null); } @@ -526,7 +528,7 @@ public class LinkedForestMap implements ForestMap { * @param key 要比较的key * @return 是否key一致 */ - public boolean equalsKey(K key) { + public boolean equalsKey(final K key) { return ObjUtil.equals(getKey(), key); } @@ -541,7 +543,7 @@ public class LinkedForestMap implements ForestMap { * @return 遍历到的最后一个节点 */ TreeEntryNode traverseChildNodes( - boolean includeCurrent, BiConsumer> consumer, BiPredicate> breakTraverse) { + final boolean includeCurrent, final BiConsumer> consumer, BiPredicate> breakTraverse) { breakTraverse = ObjUtil.defaultIfNull(breakTraverse, (i, n) -> false); final Deque>> keyNodeDeque = ListUtil.ofLinked(ListUtil.of(this)); boolean needProcess = includeCurrent; @@ -577,7 +579,7 @@ public class LinkedForestMap implements ForestMap { * @param child 子节点 * @throws IllegalArgumentException 当要添加的子节点已经是其自身父节点时抛出 */ - void addChild(TreeEntryNode child) { + void addChild(final TreeEntryNode child) { if (containsChild(child.key)) { return; } @@ -605,7 +607,7 @@ public class LinkedForestMap implements ForestMap { * * @param key 子节点 */ - void removeDeclaredChild(K key) { + void removeDeclaredChild(final K key) { final TreeEntryNode child = children.get(key); if (ObjUtil.isNull(child)) { return; @@ -629,7 +631,7 @@ public class LinkedForestMap implements ForestMap { * @return 节点 */ @Override - public TreeEntryNode getChild(K key) { + public TreeEntryNode getChild(final K key) { return traverseChildNodes(false, (i, c) -> { }, (i, c) -> c.equalsKey(key)); } @@ -673,7 +675,7 @@ public class LinkedForestMap implements ForestMap { * @return 是否 */ @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { if (this == o) { return true; } @@ -701,8 +703,8 @@ public class LinkedForestMap implements ForestMap { * @param value 复制的节点的值 * @return 节点 */ - TreeEntryNode copy(V value) { - TreeEntryNode copiedNode = new TreeEntryNode<>(this.parent, this.key, ObjUtil.defaultIfNull(value, this.value)); + TreeEntryNode copy(final V value) { + final TreeEntryNode copiedNode = new TreeEntryNode<>(this.parent, this.key, ObjUtil.defaultIfNull(value, this.value)); copiedNode.children.putAll(children); return copiedNode; } @@ -718,10 +720,10 @@ public class LinkedForestMap implements ForestMap { * @see #entrySet() * @see #values() */ - public static class EntryNodeWrapper> implements Map.Entry> { + public static class EntryNodeWrapper> implements Map.Entry>, Wrapper { private final N entryNode; - EntryNodeWrapper(N entryNode) { + EntryNodeWrapper(final N entryNode) { this.entryNode = entryNode; } @@ -736,9 +738,14 @@ public class LinkedForestMap implements ForestMap { } @Override - public TreeEntry setValue(TreeEntry value) { + public TreeEntry setValue(final TreeEntry value) { throw new UnsupportedOperationException(); } + + @Override + public N getRaw() { + return entryNode; + } } } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java b/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java index e1102da9d..1e899f940 100755 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java @@ -1,6 +1,7 @@ package cn.hutool.core.map; import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.func.Wrapper; import cn.hutool.core.util.ObjUtil; import java.io.IOException; @@ -21,7 +22,7 @@ import java.util.function.Supplier; * @author looly * @since 4.3.3 */ -public class MapWrapper implements Map, Iterable>, Serializable, Cloneable { +public class MapWrapper implements Map, Iterable>, Wrapper>, Serializable, Cloneable { private static final long serialVersionUID = -7524578042008586382L; /** @@ -64,6 +65,7 @@ public class MapWrapper implements Map, Iterable>, S * * @return Map */ + @Override public Map getRaw() { return this.raw; } diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/CipherWrapper.java b/hutool-crypto/src/main/java/cn/hutool/crypto/CipherWrapper.java index 56b7c2c68..1bf6713d3 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/CipherWrapper.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/CipherWrapper.java @@ -1,5 +1,7 @@ package cn.hutool.crypto; +import cn.hutool.core.lang.func.Wrapper; + import javax.crypto.Cipher; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; @@ -18,7 +20,7 @@ import java.security.spec.AlgorithmParameterSpec; * @author looly * @since 5.7.17 */ -public class CipherWrapper { +public class CipherWrapper implements Wrapper { private final Cipher cipher; /** @@ -85,7 +87,8 @@ public class CipherWrapper { * * @return {@link Cipher} */ - public Cipher getCipher() { + @Override + public Cipher getRaw() { return this.cipher; } diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/AsymmetricCrypto.java b/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/AsymmetricCrypto.java index db7fd3f8a..62c8d2365 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/AsymmetricCrypto.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/AsymmetricCrypto.java @@ -289,7 +289,7 @@ public class AsymmetricCrypto extends AbstractAsymmetricCrypto * @since 5.4.3 */ public Cipher getCipher() { - return this.cipherWrapper.getCipher(); + return this.cipherWrapper.getRaw(); } /** @@ -364,6 +364,6 @@ public class AsymmetricCrypto extends AbstractAsymmetricCrypto * @throws InvalidKeyException 异常KEY错误 */ private Cipher initMode(final int mode, final Key key) throws InvalidAlgorithmParameterException, InvalidKeyException { - return this.cipherWrapper.initMode(mode, key).getCipher(); + return this.cipherWrapper.initMode(mode, key).getRaw(); } } diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java index 49c3d8704..87d518681 100755 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java @@ -166,7 +166,7 @@ public class SymmetricCrypto implements SymmetricEncryptor, SymmetricDecryptor, * @return 加密或解密 */ public Cipher getCipher() { - return cipherWrapper.getCipher(); + return cipherWrapper.getRaw(); } /** @@ -242,7 +242,7 @@ public class SymmetricCrypto implements SymmetricEncryptor, SymmetricDecryptor, * @since 5.6.8 */ public byte[] update(final byte[] data) { - final Cipher cipher = cipherWrapper.getCipher(); + final Cipher cipher = cipherWrapper.getRaw(); lock.lock(); try { return cipher.update(paddingDataWithZero(data, cipher.getBlockSize())); @@ -383,7 +383,7 @@ public class SymmetricCrypto implements SymmetricEncryptor, SymmetricDecryptor, private SymmetricCrypto initParams(final String algorithm, AlgorithmParameterSpec paramsSpec) { if (null == paramsSpec) { byte[] iv = Opt.ofNullable(cipherWrapper) - .map(CipherWrapper::getCipher).map(Cipher::getIV).get(); + .map(CipherWrapper::getRaw).map(Cipher::getIV).get(); // 随机IV if (StrUtil.startWithIgnoreCase(algorithm, "PBE")) { @@ -412,7 +412,7 @@ public class SymmetricCrypto implements SymmetricEncryptor, SymmetricDecryptor, * @throws InvalidAlgorithmParameterException 无效算法 */ private Cipher initMode(final int mode) throws InvalidKeyException, InvalidAlgorithmParameterException { - return this.cipherWrapper.initMode(mode, this.secretKey).getCipher(); + return this.cipherWrapper.initMode(mode, this.secretKey).getRaw(); } /** diff --git a/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java b/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java index 04f99ed2c..e06c206c8 100755 --- a/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java +++ b/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java @@ -17,7 +17,7 @@ import cn.hutool.db.sql.Query; import cn.hutool.db.sql.SqlBuilder; import cn.hutool.db.sql.SqlExecutor; import cn.hutool.db.sql.SqlUtil; -import cn.hutool.db.sql.Wrapper; +import cn.hutool.db.sql.QuoteWrapper; import javax.sql.DataSource; import java.io.Serializable; @@ -33,6 +33,7 @@ import java.util.Map; * 通过给定的数据源执行给定SQL或者给定数据源和方言,执行相应的CRUD操作
* 提供抽象方法getConnection和closeConnection,用于自定义数据库连接的打开和关闭 * + * @param return this类型 * @author looly */ public abstract class AbstractDb> extends DefaultConnectionHolder implements Serializable { @@ -925,19 +926,19 @@ public abstract class AbstractDb> extends DefaultConnect * @since 4.0.0 */ public R setWrapper(final Character wrapperChar) { - return setWrapper(new Wrapper(wrapperChar)); + return setWrapper(new QuoteWrapper(wrapperChar)); } /** * 设置包装器,包装器用于对表名、字段名进行符号包装(例如双引号),防止关键字与这些表名或字段冲突 * - * @param wrapper 包装器,null表示取消包装 + * @param quoteWrapper 包装器,null表示取消包装 * @return this * @since 4.0.0 */ @SuppressWarnings("unchecked") - public R setWrapper(final Wrapper wrapper) { - this.runner.setWrapper(wrapper); + public R setWrapper(final QuoteWrapper quoteWrapper) { + this.runner.setWrapper(quoteWrapper); return (R) this; } @@ -949,7 +950,7 @@ public abstract class AbstractDb> extends DefaultConnect * @since 4.5.7 */ public R disableWrapper() { - return setWrapper((Wrapper) null); + return setWrapper((QuoteWrapper) null); } // ---------------------------------------------------------------------------- Getters and Setters end diff --git a/hutool-db/src/main/java/cn/hutool/db/DialectRunner.java b/hutool-db/src/main/java/cn/hutool/db/DialectRunner.java index 4f10f93b7..c47b739a0 100644 --- a/hutool-db/src/main/java/cn/hutool/db/DialectRunner.java +++ b/hutool-db/src/main/java/cn/hutool/db/DialectRunner.java @@ -13,7 +13,7 @@ import cn.hutool.db.sql.Query; import cn.hutool.db.sql.SqlBuilder; import cn.hutool.db.sql.SqlExecutor; import cn.hutool.db.sql.SqlUtil; -import cn.hutool.db.sql.Wrapper; +import cn.hutool.db.sql.QuoteWrapper; import java.io.Serializable; import java.sql.Connection; @@ -428,16 +428,16 @@ public class DialectRunner implements Serializable { * @param wrapperChar 包装字符,字符会在SQL生成时位于表名和字段名两边,null时表示取消包装 */ public void setWrapper(final Character wrapperChar) { - setWrapper(new Wrapper(wrapperChar)); + setWrapper(new QuoteWrapper(wrapperChar)); } /** * 设置包装器,包装器用于对表名、字段名进行符号包装(例如双引号),防止关键字与这些表名或字段冲突 * - * @param wrapper 包装器,null表示取消包装 + * @param quoteWrapper 包装器,null表示取消包装 */ - public void setWrapper(final Wrapper wrapper) { - this.dialect.setWrapper(wrapper); + public void setWrapper(final QuoteWrapper quoteWrapper) { + this.dialect.setWrapper(quoteWrapper); } //---------------------------------------------------------------------------- Getters and Setters end diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java b/hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java index b58f74179..9801c0939 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/Dialect.java @@ -5,7 +5,7 @@ import cn.hutool.db.Page; import cn.hutool.db.sql.Order; import cn.hutool.db.sql.Query; import cn.hutool.db.sql.SqlBuilder; -import cn.hutool.db.sql.Wrapper; +import cn.hutool.db.sql.QuoteWrapper; import java.io.Serializable; import java.sql.Connection; @@ -24,14 +24,14 @@ public interface Dialect extends Serializable { /** * @return 包装器 */ - Wrapper getWrapper(); + QuoteWrapper getWrapper(); /** * 设置包装器 * - * @param wrapper 包装器 + * @param quoteWrapper 包装器 */ - void setWrapper(Wrapper wrapper); + void setWrapper(QuoteWrapper quoteWrapper); // -------------------------------------------- Execute diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/AnsiSqlDialect.java b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/AnsiSqlDialect.java index 3553cbb7a..81285fb2b 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/AnsiSqlDialect.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/AnsiSqlDialect.java @@ -13,7 +13,7 @@ import cn.hutool.db.dialect.DialectName; import cn.hutool.db.sql.Condition; import cn.hutool.db.sql.Query; import cn.hutool.db.sql.SqlBuilder; -import cn.hutool.db.sql.Wrapper; +import cn.hutool.db.sql.QuoteWrapper; import java.sql.Connection; import java.sql.PreparedStatement; @@ -29,21 +29,21 @@ import java.util.Set; public class AnsiSqlDialect implements Dialect { private static final long serialVersionUID = 2088101129774974580L; - protected Wrapper wrapper = new Wrapper(); + protected QuoteWrapper quoteWrapper = new QuoteWrapper(); @Override - public Wrapper getWrapper() { - return this.wrapper; + public QuoteWrapper getWrapper() { + return this.quoteWrapper; } @Override - public void setWrapper(final Wrapper wrapper) { - this.wrapper = wrapper; + public void setWrapper(final QuoteWrapper quoteWrapper) { + this.quoteWrapper = quoteWrapper; } @Override public PreparedStatement psForInsert(final Connection conn, final Entity entity) throws SQLException { - final SqlBuilder insert = SqlBuilder.of(wrapper).insert(entity, this.dialectName()); + final SqlBuilder insert = SqlBuilder.of(quoteWrapper).insert(entity, this.dialectName()); return StatementUtil.prepareStatement(conn, insert); } @@ -54,7 +54,7 @@ public class AnsiSqlDialect implements Dialect { throw new DbRuntimeException("Entities for batch insert is empty !"); } // 批量,根据第一行数据结构生成SQL占位符 - final SqlBuilder insert = SqlBuilder.of(wrapper).insert(entities[0], this.dialectName()); + final SqlBuilder insert = SqlBuilder.of(quoteWrapper).insert(entities[0], this.dialectName()); final Set fields = CollUtil.filter(entities[0].keySet(), StrUtil::isNotBlank); return StatementUtil.prepareStatementForBatch(conn, insert.build(), fields, entities); } @@ -68,7 +68,7 @@ public class AnsiSqlDialect implements Dialect { // 对于无条件删除语句直接抛出异常禁止,防止误删除 throw new SQLException("No 'WHERE' condition, we can't prepared statement for delete everything."); } - final SqlBuilder delete = SqlBuilder.of(wrapper).delete(query.getFirstTableName()).where(where); + final SqlBuilder delete = SqlBuilder.of(quoteWrapper).delete(query.getFirstTableName()).where(where); return StatementUtil.prepareStatement(conn, delete); } @@ -83,7 +83,7 @@ public class AnsiSqlDialect implements Dialect { throw new SQLException("No 'WHERE' condition, we can't prepare statement for update everything."); } - final SqlBuilder update = SqlBuilder.of(wrapper).update(entity).where(where); + final SqlBuilder update = SqlBuilder.of(quoteWrapper).update(entity).where(where); return StatementUtil.prepareStatement(conn, update); } @@ -100,7 +100,7 @@ public class AnsiSqlDialect implements Dialect { throw new DbRuntimeException("Table name must be not empty !"); } - final SqlBuilder find = SqlBuilder.of(wrapper).query(query); + final SqlBuilder find = SqlBuilder.of(quoteWrapper).query(query); return psForPage(conn, find, query.getPage()); } diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/H2Dialect.java b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/H2Dialect.java index 6bee0af21..5a667173f 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/H2Dialect.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/H2Dialect.java @@ -40,7 +40,7 @@ public class H2Dialect extends AnsiSqlDialect { public PreparedStatement psForUpsert(final Connection conn, final Entity entity, final String... keys) throws SQLException { Assert.notEmpty(keys, "Keys must be not empty for H2 MERGE SQL."); SqlBuilder.validateEntity(entity); - final SqlBuilder builder = SqlBuilder.of(wrapper); + final SqlBuilder builder = SqlBuilder.of(quoteWrapper); final StringBuilder fieldsPart = new StringBuilder(); final StringBuilder placeHolder = new StringBuilder(); @@ -54,15 +54,15 @@ public class H2Dialect extends AnsiSqlDialect { placeHolder.append(", "); } - fieldsPart.append((null != wrapper) ? wrapper.wrap(field) : field); + fieldsPart.append((null != quoteWrapper) ? quoteWrapper.wrap(field) : field); placeHolder.append("?"); builder.addParams(value); } }); String tableName = entity.getTableName(); - if (null != this.wrapper) { - tableName = this.wrapper.wrap(tableName); + if (null != this.quoteWrapper) { + tableName = this.quoteWrapper.wrap(tableName); } builder.append("MERGE INTO ").append(tableName) // 字段列表 diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/MysqlDialect.java b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/MysqlDialect.java index bc4795094..525157455 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/MysqlDialect.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/MysqlDialect.java @@ -6,7 +6,7 @@ import cn.hutool.db.Page; import cn.hutool.db.StatementUtil; import cn.hutool.db.dialect.DialectName; import cn.hutool.db.sql.SqlBuilder; -import cn.hutool.db.sql.Wrapper; +import cn.hutool.db.sql.QuoteWrapper; import java.sql.Connection; import java.sql.PreparedStatement; @@ -21,7 +21,7 @@ public class MysqlDialect extends AnsiSqlDialect{ private static final long serialVersionUID = -3734718212043823636L; public MysqlDialect() { - wrapper = new Wrapper('`'); + quoteWrapper = new QuoteWrapper('`'); } @Override @@ -51,7 +51,7 @@ public class MysqlDialect extends AnsiSqlDialect{ @Override public PreparedStatement psForUpsert(final Connection conn, final Entity entity, final String... keys) throws SQLException { SqlBuilder.validateEntity(entity); - final SqlBuilder builder = SqlBuilder.of(wrapper); + final SqlBuilder builder = SqlBuilder.of(quoteWrapper); final StringBuilder fieldsPart = new StringBuilder(); final StringBuilder placeHolder = new StringBuilder(); @@ -67,7 +67,7 @@ public class MysqlDialect extends AnsiSqlDialect{ updateHolder.append(", "); } - field = (null != wrapper) ? wrapper.wrap(field) : field; + field = (null != quoteWrapper) ? quoteWrapper.wrap(field) : field; fieldsPart.append(field); updateHolder.append(field).append("=values(").append(field).append(")"); placeHolder.append("?"); @@ -76,8 +76,8 @@ public class MysqlDialect extends AnsiSqlDialect{ }); String tableName = entity.getTableName(); - if (null != this.wrapper) { - tableName = this.wrapper.wrap(tableName); + if (null != this.quoteWrapper) { + tableName = this.quoteWrapper.wrap(tableName); } builder.append("INSERT INTO ").append(tableName) // 字段列表 diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PostgresqlDialect.java b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PostgresqlDialect.java index 468044edd..5fb103add 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PostgresqlDialect.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/PostgresqlDialect.java @@ -7,7 +7,7 @@ import cn.hutool.db.Entity; import cn.hutool.db.StatementUtil; import cn.hutool.db.dialect.DialectName; import cn.hutool.db.sql.SqlBuilder; -import cn.hutool.db.sql.Wrapper; +import cn.hutool.db.sql.QuoteWrapper; import java.sql.Connection; import java.sql.PreparedStatement; @@ -23,7 +23,7 @@ public class PostgresqlDialect extends AnsiSqlDialect{ private static final long serialVersionUID = 3889210427543389642L; public PostgresqlDialect() { - wrapper = new Wrapper('"'); + quoteWrapper = new QuoteWrapper('"'); } @Override @@ -35,7 +35,7 @@ public class PostgresqlDialect extends AnsiSqlDialect{ public PreparedStatement psForUpsert(final Connection conn, final Entity entity, final String... keys) throws SQLException { Assert.notEmpty(keys, "Keys must be not empty for Postgres."); SqlBuilder.validateEntity(entity); - final SqlBuilder builder = SqlBuilder.of(wrapper); + final SqlBuilder builder = SqlBuilder.of(quoteWrapper); final StringBuilder fieldsPart = new StringBuilder(); final StringBuilder placeHolder = new StringBuilder(); @@ -51,7 +51,7 @@ public class PostgresqlDialect extends AnsiSqlDialect{ updateHolder.append(", "); } - final String wrapedField = (null != wrapper) ? wrapper.wrap(field) : field; + final String wrapedField = (null != quoteWrapper) ? quoteWrapper.wrap(field) : field; fieldsPart.append(wrapedField); updateHolder.append(wrapedField).append("=EXCLUDED.").append(field); placeHolder.append("?"); @@ -60,8 +60,8 @@ public class PostgresqlDialect extends AnsiSqlDialect{ }); String tableName = entity.getTableName(); - if (null != this.wrapper) { - tableName = this.wrapper.wrap(tableName); + if (null != this.quoteWrapper) { + tableName = this.quoteWrapper.wrap(tableName); } builder.append("INSERT INTO ").append(tableName) // 字段列表 diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/SqlServer2012Dialect.java b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/SqlServer2012Dialect.java index 2e86640d7..d731045cb 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/SqlServer2012Dialect.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/SqlServer2012Dialect.java @@ -4,7 +4,7 @@ import cn.hutool.core.text.StrUtil; import cn.hutool.db.Page; import cn.hutool.db.dialect.DialectName; import cn.hutool.db.sql.SqlBuilder; -import cn.hutool.db.sql.Wrapper; +import cn.hutool.db.sql.QuoteWrapper; /** * SQLServer2012 方言 @@ -17,7 +17,7 @@ public class SqlServer2012Dialect extends AnsiSqlDialect { public SqlServer2012Dialect() { //双引号和中括号适用,双引号更广泛 - wrapper = new Wrapper('"'); + quoteWrapper = new QuoteWrapper('"'); } @Override diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/Sqlite3Dialect.java b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/Sqlite3Dialect.java index bf209a00c..e723e0e51 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/impl/Sqlite3Dialect.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/impl/Sqlite3Dialect.java @@ -1,7 +1,7 @@ package cn.hutool.db.dialect.impl; import cn.hutool.db.dialect.DialectName; -import cn.hutool.db.sql.Wrapper; +import cn.hutool.db.sql.QuoteWrapper; /** * SqlLite3方言 @@ -12,9 +12,9 @@ public class Sqlite3Dialect extends AnsiSqlDialect{ private static final long serialVersionUID = -3527642408849291634L; public Sqlite3Dialect() { - wrapper = new Wrapper('[', ']'); + quoteWrapper = new QuoteWrapper('[', ']'); } - + @Override public String dialectName() { return DialectName.SQLITE3.name(); diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/DataSourceWrapper.java b/hutool-db/src/main/java/cn/hutool/db/ds/DataSourceWrapper.java index e1e10e129..6a58ee5ef 100644 --- a/hutool-db/src/main/java/cn/hutool/db/ds/DataSourceWrapper.java +++ b/hutool-db/src/main/java/cn/hutool/db/ds/DataSourceWrapper.java @@ -2,6 +2,7 @@ package cn.hutool.db.ds; import cn.hutool.core.exceptions.CloneRuntimeException; import cn.hutool.core.io.IoUtil; +import cn.hutool.core.lang.func.Wrapper; import javax.sql.DataSource; import java.io.Closeable; @@ -21,7 +22,7 @@ import java.util.logging.Logger; * @author looly * @since 4.3.2 */ -public class DataSourceWrapper implements DataSource, Closeable, Cloneable { +public class DataSourceWrapper implements Wrapper, DataSource, Closeable, Cloneable { private final DataSource ds; private final String driver; @@ -62,6 +63,7 @@ public class DataSourceWrapper implements DataSource, Closeable, Cloneable { * * @return 原始数据源 */ + @Override public DataSource getRaw() { return this.ds; } diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/Wrapper.java b/hutool-db/src/main/java/cn/hutool/db/sql/QuoteWrapper.java similarity index 95% rename from hutool-db/src/main/java/cn/hutool/db/sql/Wrapper.java rename to hutool-db/src/main/java/cn/hutool/db/sql/QuoteWrapper.java index 99d31b8cf..e38e030d3 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/Wrapper.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/QuoteWrapper.java @@ -12,12 +12,12 @@ import java.util.Collection; import java.util.Map.Entry; /** - * 包装器
+ * 字段和表明包装器
* 主要用于字段名的包装(在字段名的前后加字符,例如反引号来避免与数据库的关键字冲突) * * @author Looly */ -public class Wrapper implements Serializable { +public class QuoteWrapper implements Serializable { private static final long serialVersionUID = 1L; /** @@ -29,7 +29,10 @@ public class Wrapper implements Serializable { */ private Character sufWrapQuote; - public Wrapper() { + /** + * 构造 + */ + public QuoteWrapper() { } /** @@ -37,7 +40,7 @@ public class Wrapper implements Serializable { * * @param wrapQuote 单包装字符 */ - public Wrapper(final Character wrapQuote) { + public QuoteWrapper(final Character wrapQuote) { this.preWrapQuote = wrapQuote; this.sufWrapQuote = wrapQuote; } @@ -48,7 +51,7 @@ public class Wrapper implements Serializable { * @param preWrapQuote 前置包装符号 * @param sufWrapQuote 后置包装符号 */ - public Wrapper(final Character preWrapQuote, final Character sufWrapQuote) { + public QuoteWrapper(final Character preWrapQuote, final Character sufWrapQuote) { this.preWrapQuote = preWrapQuote; this.sufWrapQuote = sufWrapQuote; } diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/SqlBuilder.java b/hutool-db/src/main/java/cn/hutool/db/sql/SqlBuilder.java index 696283126..050e56410 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/SqlBuilder.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/SqlBuilder.java @@ -39,11 +39,11 @@ public class SqlBuilder implements Builder { /** * 创建SQL构建器 * - * @param wrapper 包装器 + * @param quoteWrapper 包装器 * @return SQL构建器 */ - public static SqlBuilder of(final Wrapper wrapper) { - return new SqlBuilder(wrapper); + public static SqlBuilder of(final QuoteWrapper quoteWrapper) { + return new SqlBuilder(quoteWrapper); } /** @@ -112,14 +112,14 @@ public class SqlBuilder implements Builder { /** * 包装器 */ - private Wrapper wrapper; + private QuoteWrapper quoteWrapper; // --------------------------------------------------------------- Constructor start public SqlBuilder() { } - public SqlBuilder(final Wrapper wrapper) { - this.wrapper = wrapper; + public SqlBuilder(final QuoteWrapper quoteWrapper) { + this.quoteWrapper = quoteWrapper; } // --------------------------------------------------------------- Constructor end @@ -172,7 +172,7 @@ public class SqlBuilder implements Builder { placeHolder.append(", "); } - fieldsPart.append((null != wrapper) ? wrapper.wrap(field) : field); + fieldsPart.append((null != quoteWrapper) ? quoteWrapper.wrap(field) : field); if (isOracle && OracleDialect.isNextVal(value)) { // Oracle的特殊自增键,通过字段名.nextval获得下一个值 placeHolder.append(value); @@ -192,9 +192,9 @@ public class SqlBuilder implements Builder { } String tableName = entity.getTableName(); - if (null != this.wrapper) { + if (null != this.quoteWrapper) { // 包装表名 entity = wrapper.wrap(entity); - tableName = this.wrapper.wrap(tableName); + tableName = this.quoteWrapper.wrap(tableName); } sql.append(tableName) .append(" (").append(fieldsPart).append(") VALUES (")// @@ -214,9 +214,9 @@ public class SqlBuilder implements Builder { throw new DbRuntimeException("Table name is blank !"); } - if (null != wrapper) { + if (null != quoteWrapper) { // 包装表名 - tableName = wrapper.wrap(tableName); + tableName = quoteWrapper.wrap(tableName); } sql.append("DELETE FROM ").append(tableName); @@ -235,9 +235,9 @@ public class SqlBuilder implements Builder { validateEntity(entity); String tableName = entity.getTableName(); - if (null != wrapper) { + if (null != quoteWrapper) { // 包装表名 - tableName = wrapper.wrap(tableName); + tableName = quoteWrapper.wrap(tableName); } sql.append("UPDATE ").append(tableName).append(" SET "); @@ -246,7 +246,7 @@ public class SqlBuilder implements Builder { if (paramValues.size() > 0) { sql.append(", "); } - sql.append((null != wrapper) ? wrapper.wrap(field) : field).append(" = ? "); + sql.append((null != quoteWrapper) ? quoteWrapper.wrap(field) : field).append(" = ? "); this.paramValues.add(value);// 更新不对空做处理,因为存在清空字段的情况 } }); @@ -280,9 +280,9 @@ public class SqlBuilder implements Builder { if (CollUtil.isEmpty(fields)) { sql.append("*"); } else { - if (null != wrapper) { + if (null != quoteWrapper) { // 包装字段名 - fields = wrapper.wrap(fields); + fields = quoteWrapper.wrap(fields); } sql.append(CollUtil.join(fields, StrUtil.COMMA)); } @@ -321,9 +321,9 @@ public class SqlBuilder implements Builder { throw new DbRuntimeException("Table name is blank in table names !"); } - if (null != wrapper) { + if (null != quoteWrapper) { // 包装表名 - tableNames = wrapper.wrap(tableNames); + tableNames = quoteWrapper.wrap(tableNames); } sql.append(" FROM ").append(ArrayUtil.join(tableNames, StrUtil.COMMA)); @@ -369,7 +369,7 @@ public class SqlBuilder implements Builder { */ @SuppressWarnings("unchecked") public SqlBuilder in(final String field, final T... values) { - sql.append(wrapper.wrap(field)).append(" IN ").append("(").append(ArrayUtil.join(values, StrUtil.COMMA)).append(")"); + sql.append(quoteWrapper.wrap(field)).append(" IN ").append("(").append(ArrayUtil.join(values, StrUtil.COMMA)).append(")"); return this; } @@ -381,9 +381,9 @@ public class SqlBuilder implements Builder { */ public SqlBuilder groupBy(String... fields) { if (ArrayUtil.isNotEmpty(fields)) { - if (null != wrapper) { + if (null != quoteWrapper) { // 包装字段名 - fields = wrapper.wrap(fields); + fields = quoteWrapper.wrap(fields); } sql.append(" GROUP BY ").append(ArrayUtil.join(fields, StrUtil.COMMA)); @@ -436,9 +436,9 @@ public class SqlBuilder implements Builder { boolean isFirst = true; for (final Order order : orders) { field = order.getField(); - if (null != wrapper) { + if (null != quoteWrapper) { // 包装字段名 - field = wrapper.wrap(field); + field = quoteWrapper.wrap(field); } if (StrUtil.isBlank(field)) { continue; @@ -473,9 +473,9 @@ public class SqlBuilder implements Builder { if (null != join) { sql.append(StrUtil.SPACE).append(join).append(" JOIN "); - if (null != wrapper) { + if (null != quoteWrapper) { // 包装表名 - tableName = wrapper.wrap(tableName); + tableName = quoteWrapper.wrap(tableName); } sql.append(tableName); } @@ -623,9 +623,9 @@ public class SqlBuilder implements Builder { return StrUtil.EMPTY; } - if (null != wrapper) { + if (null != quoteWrapper) { // 包装字段名 - conditions = wrapper.wrap(conditions); + conditions = quoteWrapper.wrap(conditions); } return ConditionBuilder.of(conditions).build(this.paramValues); diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/StatementWrapper.java b/hutool-db/src/main/java/cn/hutool/db/sql/StatementWrapper.java index c99e14c7a..8ce7bb61e 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/StatementWrapper.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/StatementWrapper.java @@ -1,5 +1,7 @@ package cn.hutool.db.sql; +import cn.hutool.core.lang.func.Wrapper; + import java.io.InputStream; import java.io.Reader; import java.math.BigDecimal; @@ -35,7 +37,7 @@ import java.util.Calendar; * @author looly * @since 4.1.0 */ -public class StatementWrapper implements PreparedStatement { +public class StatementWrapper implements PreparedStatement, Wrapper { private final PreparedStatement rawStatement; @@ -544,4 +546,8 @@ public class StatementWrapper implements PreparedStatement { rawStatement.setNClob(parameterIndex, reader); } + @Override + public PreparedStatement getRaw() { + return rawStatement; + } } diff --git a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONString.java b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONString.java index 0b740ab4c..e3e639b51 100644 --- a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONString.java +++ b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONString.java @@ -1,5 +1,7 @@ package cn.hutool.json.serialize; +import cn.hutool.core.lang.func.Wrapper; + /** * {@code JSONString}接口定义了一个{@code toJSONString()}
* 实现此接口的类可以通过实现{@code toJSONString()}方法来改变转JSON字符串的方式。 @@ -8,7 +10,7 @@ package cn.hutool.json.serialize; * */ @FunctionalInterface -public interface JSONString { +public interface JSONString extends Wrapper { /** * 自定义转JSON字符串的方法 @@ -22,6 +24,7 @@ public interface JSONString { * * @return 原始对象 */ + @Override default Object getRaw() { return this; } diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue2555Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue2555Test.java index c020737b9..9d1cdc6f2 100644 --- a/hutool-json/src/test/java/cn/hutool/json/Issue2555Test.java +++ b/hutool-json/src/test/java/cn/hutool/json/Issue2555Test.java @@ -1,8 +1,5 @@ package cn.hutool.json; -import cn.hutool.json.JSON; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; import cn.hutool.json.serialize.JSONDeserializer; import cn.hutool.json.serialize.JSONObjectSerializer; import lombok.Data; @@ -39,14 +36,14 @@ public class Issue2555Test { public static class MySerializer implements JSONObjectSerializer { @Override - public void serialize(JSONObject json, MyType bean) { + public void serialize(final JSONObject json, final MyType bean) { json.set("addr", bean.getAddress()); } } public static class MyDeserializer implements JSONDeserializer { @Override - public MyType deserialize(JSON json) { + public MyType deserialize(final JSON json) { final MyType myType = new MyType(); myType.setAddress(((JSONObject)json).getStr("addr")); return myType;