{
*
*
* 1. {@link SynchronousQueue} 它将任务直接提交给线程而不保持它们。当运行线程小于maxPoolSize时会创建新线程,否则触发异常策略
- * 2. {@link LinkedBlockingQueue} 默认无界队列,当运行线程大于corePoolSize时始终放入此队列,此时maximumPoolSize无效。
+ * 2. {@link LinkedBlockingQueue} 默认无界队列,当运行线程大于corePoolSize时始终放入此队列,此时maxPoolSize无效。
* 当构造LinkedBlockingQueue对象时传入参数,变为有界队列,队列满时,运行线程小于maxPoolSize时会创建新线程,否则触发异常策略
* 3. {@link ArrayBlockingQueue} 有界队列,相对无界队列有利于控制队列大小,队列满时,运行线程小于maxPoolSize时会创建新线程,否则触发异常策略
*
diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/FinalizableDelegatedExecutorService.java b/hutool-core/src/main/java/cn/hutool/core/thread/FinalizableDelegatedExecutorService.java
index 29749783d..d51d6e52b 100644
--- a/hutool-core/src/main/java/cn/hutool/core/thread/FinalizableDelegatedExecutorService.java
+++ b/hutool-core/src/main/java/cn/hutool/core/thread/FinalizableDelegatedExecutorService.java
@@ -8,6 +8,12 @@ import java.util.concurrent.ExecutorService;
* @author loolly
*/
public class FinalizableDelegatedExecutorService extends DelegatedExecutorService {
+
+ /**
+ * 构造
+ *
+ * @param executor {@link ExecutorService}
+ */
FinalizableDelegatedExecutorService(ExecutorService executor) {
super(executor);
}
diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java b/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java
index 8555a7dbc..e922795ad 100644
--- a/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java
+++ b/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java
@@ -16,9 +16,10 @@ import java.util.concurrent.ExecutorService;
* ps:
* //模拟1000个线程并发
* SyncFinisher sf = new SyncFinisher(1000);
- * concurrencyTestUtil.run(() -> {
+ * sf.addWorker(() -> {
* // 需要并发测试的业务代码
* });
+ * sf.start()
*
*
*
diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java b/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java
index ab8ba9ef1..b7a5fe9db 100644
--- a/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/thread/ThreadUtil.java
@@ -31,7 +31,7 @@ public class ThreadUtil {
* @param corePoolSize 同时执行的线程数大小
* @return ExecutorService
*/
- public static ExecutorService newExecutor(int corePoolSize) {
+ public static ExecutorService newExecutor(int corePoolSize) {
ExecutorBuilder builder = ExecutorBuilder.create();
if (corePoolSize > 0) {
builder.setCorePoolSize(corePoolSize);
diff --git a/hutool-core/src/main/java/cn/hutool/core/util/EnumUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/EnumUtil.java
index 9fa54b2b3..fd33465bb 100644
--- a/hutool-core/src/main/java/cn/hutool/core/util/EnumUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/EnumUtil.java
@@ -61,7 +61,7 @@ public class EnumUtil {
*/
public static > E getEnumAt(Class enumClass, int index) {
final E[] enumConstants = enumClass.getEnumConstants();
- return index < enumConstants.length ? enumConstants[index] : null;
+ return index >= 0 && index < enumConstants.length ? enumConstants[index] : null;
}
/**
diff --git a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java
index 19b3469de..867b54d42 100644
--- a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java
@@ -2731,14 +2731,14 @@ public class StrUtil {
}
/**
- * 包装多个字符串
+ * 使用单个字符包装多个字符串
*
* @param prefixAndSuffix 前缀和后缀
* @param strs 多个字符串
* @return 包装的字符串数组
- * @since 4.0.7
+ * @since 5.4.1
*/
- public static String[] wrapAll(CharSequence prefixAndSuffix, CharSequence... strs) {
+ public static String[] wrapAllWithPair(CharSequence prefixAndSuffix, CharSequence... strs) {
return wrapAll(prefixAndSuffix, prefixAndSuffix, strs);
}
@@ -2792,14 +2792,14 @@ public class StrUtil {
}
/**
- * 包装多个字符串,如果已经包装,则不再包装
+ * 使用成对的字符包装多个字符串,如果已经包装,则不再包装
*
* @param prefixAndSuffix 前缀和后缀
* @param strs 多个字符串
* @return 包装的字符串数组
- * @since 4.0.7
+ * @since 5.4.1
*/
- public static String[] wrapAllIfMissing(CharSequence prefixAndSuffix, CharSequence... strs) {
+ public static String[] wrapAllWithPairIfMissing(CharSequence prefixAndSuffix, CharSequence... strs) {
return wrapAllIfMissing(prefixAndSuffix, prefixAndSuffix, strs);
}
@@ -3427,7 +3427,7 @@ public class StrUtil {
* @param start 起始位置,如果小于0,从0开始查找
* @return 位置
*/
- public static int indexOf(final CharSequence str, char searchChar, int start) {
+ public static int indexOf(CharSequence str, char searchChar, int start) {
if (str instanceof String) {
return ((String) str).indexOf(searchChar, start);
} else {
@@ -3445,6 +3445,9 @@ public class StrUtil {
* @return 位置
*/
public static int indexOf(final CharSequence str, char searchChar, int start, int end) {
+ if(isEmpty(str)){
+ return INDEX_NOT_FOUND;
+ }
final int len = str.length();
if (start < 0 || start > len) {
start = 0;
@@ -3457,7 +3460,7 @@ public class StrUtil {
return i;
}
}
- return -1;
+ return INDEX_NOT_FOUND;
}
/**
diff --git a/hutool-core/src/test/java/cn/hutool/core/date/ChineseDateTest.java b/hutool-core/src/test/java/cn/hutool/core/date/ChineseDateTest.java
index f78d2259a..210282e10 100644
--- a/hutool-core/src/test/java/cn/hutool/core/date/ChineseDateTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/date/ChineseDateTest.java
@@ -45,4 +45,27 @@ public class ChineseDateTest {
date = new ChineseDate(DateUtil.parseDate("1996-07-15"));
Assert.assertEquals("丙子鼠年 五月三十", date.toString());
}
+ @Test
+ public void getCyclicalYMDTest(){
+ //通过公历构建
+ ChineseDate chineseDate = new ChineseDate(DateUtil.parseDate("1993-01-06"));
+ String cyclicalYMD = chineseDate.getCyclicalYMD();
+ Assert.assertEquals("壬申年癸丑月丁亥日",cyclicalYMD);
+ }
+
+ @Test
+ public void getCyclicalYMDTest2(){
+ //通过农历构建
+ ChineseDate chineseDate = new ChineseDate(1992,12,14);
+ String cyclicalYMD = chineseDate.getCyclicalYMD();
+ Assert.assertEquals("壬申年癸丑月丁亥日",cyclicalYMD);
+ }
+
+ @Test
+ public void getCyclicalYMDTest3(){
+ //通过公历构建
+ ChineseDate chineseDate = new ChineseDate(DateUtil.parseDate("2020-08-28"));
+ String cyclicalYMD = chineseDate.getCyclicalYMD();
+ Assert.assertEquals("庚子年甲申月癸卯日",cyclicalYMD);
+ }
}
diff --git a/hutool-core/src/test/java/cn/hutool/core/img/ImgTest.java b/hutool-core/src/test/java/cn/hutool/core/img/ImgTest.java
index dc47cdcd5..15682b41a 100644
--- a/hutool-core/src/test/java/cn/hutool/core/img/ImgTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/img/ImgTest.java
@@ -55,4 +55,12 @@ public class ImgTest {
.pressImage(ImgUtil.read("d:/test/617180969474805871.jpg"), new Rectangle(0, 0, 800, 800), 1f)
.write(FileUtil.file("d:/test/pressImg_result.jpg"));
}
+
+ @Test
+ @Ignore
+ public void strokeTest(){
+ Img.from(FileUtil.file("d:/test/公章3.png"))
+ .stroke(null, 2f)
+ .write(FileUtil.file("d:/test/stroke_result.png"));
+ }
}
diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/UUIDTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/UUIDTest.java
new file mode 100644
index 000000000..6cae317a2
--- /dev/null
+++ b/hutool-core/src/test/java/cn/hutool/core/lang/UUIDTest.java
@@ -0,0 +1,21 @@
+package cn.hutool.core.lang;
+
+import cn.hutool.core.collection.ConcurrentHashSet;
+import cn.hutool.core.thread.ThreadUtil;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Set;
+
+public class UUIDTest {
+
+ /**
+ * 测试UUID是否存在重复问题
+ */
+ @Test
+ public void fastUUIDTest(){
+ Set set = new ConcurrentHashSet<>(100);
+ ThreadUtil.concurrencyTest(100, ()-> set.add(UUID.fastUUID().toString()));
+ Assert.assertEquals(100, set.size());
+ }
+}
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java
index 87f019945..a022b28ab 100644
--- a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java
@@ -458,4 +458,13 @@ public class StrUtilTest {
String cleanBlank = StrUtil.filter(" 你 好 ", c -> !CharUtil.isBlankChar(c));
Assert.assertEquals("你好", cleanBlank);
}
+
+ @Test
+ public void wrapAllTest(){
+ String[] strings = StrUtil.wrapAll("`", "`", StrUtil.splitToArray("1,2,3,4", ','));
+ Assert.assertEquals("[`1`, `2`, `3`, `4`]", StrUtil.utf8Str(strings));
+
+ strings = StrUtil.wrapAllWithPair("`", StrUtil.splitToArray("1,2,3,4", ','));
+ Assert.assertEquals("[`1`, `2`, `3`, `4`]", StrUtil.utf8Str(strings));
+ }
}
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/TypeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/TypeUtilTest.java
index 94ef42954..6b7cd97ec 100644
--- a/hutool-core/src/test/java/cn/hutool/core/util/TypeUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/TypeUtilTest.java
@@ -56,4 +56,5 @@ public class TypeUtilTest {
public void service(String string) {
}
}
+
}
diff --git a/hutool-cron/pom.xml b/hutool-cron/pom.xml
index d8be510af..4270b6b34 100644
--- a/hutool-cron/pom.xml
+++ b/hutool-cron/pom.xml
@@ -7,7 +7,7 @@
cn.hutool
hutool-parent
- 5.4.1-SNAPSHOT
+ 5.4.2-SNAPSHOT
hutool-cron
diff --git a/hutool-cron/src/main/java/cn/hutool/cron/TaskTable.java b/hutool-cron/src/main/java/cn/hutool/cron/TaskTable.java
index 242c6e075..27daf2948 100644
--- a/hutool-cron/src/main/java/cn/hutool/cron/TaskTable.java
+++ b/hutool-cron/src/main/java/cn/hutool/cron/TaskTable.java
@@ -52,8 +52,8 @@ public class TaskTable implements Serializable {
*/
public TaskTable add(String id, CronPattern pattern, Task task) {
final Lock writeLock = lock.writeLock();
+ writeLock.lock();
try {
- writeLock.lock();
if (ids.contains(id)) {
throw new CronException("Id [{}] has been existed!", id);
}
@@ -75,8 +75,8 @@ public class TaskTable implements Serializable {
*/
public List getIds() {
final Lock readLock = lock.readLock();
+ readLock.lock();
try {
- readLock.lock();
return Collections.unmodifiableList(this.ids);
} finally {
readLock.unlock();
@@ -91,8 +91,8 @@ public class TaskTable implements Serializable {
*/
public List getPatterns() {
final Lock readLock = lock.readLock();
+ readLock.lock();
try {
- readLock.lock();
return Collections.unmodifiableList(this.patterns);
} finally {
readLock.unlock();
@@ -107,8 +107,8 @@ public class TaskTable implements Serializable {
*/
public List getTasks() {
final Lock readLock = lock.readLock();
+ readLock.lock();
try {
- readLock.lock();
return Collections.unmodifiableList(this.tasks);
} finally {
readLock.unlock();
@@ -122,8 +122,8 @@ public class TaskTable implements Serializable {
*/
public void remove(String id) {
final Lock writeLock = lock.writeLock();
+ writeLock.lock();
try {
- writeLock.lock();
final int index = ids.indexOf(id);
if (index > -1) {
tasks.remove(index);
@@ -146,8 +146,8 @@ public class TaskTable implements Serializable {
*/
public boolean updatePattern(String id, CronPattern pattern) {
final Lock writeLock = lock.writeLock();
+ writeLock.lock();
try {
- writeLock.lock();
final int index = ids.indexOf(id);
if (index > -1) {
patterns.set(index, pattern);
@@ -168,8 +168,8 @@ public class TaskTable implements Serializable {
*/
public Task getTask(int index) {
final Lock readLock = lock.readLock();
+ readLock.lock();
try {
- readLock.lock();
return tasks.get(index);
} finally {
readLock.unlock();
@@ -200,8 +200,8 @@ public class TaskTable implements Serializable {
*/
public CronPattern getPattern(int index) {
final Lock readLock = lock.readLock();
+ readLock.lock();
try {
- readLock.lock();
return patterns.get(index);
} finally {
readLock.unlock();
@@ -250,8 +250,8 @@ public class TaskTable implements Serializable {
*/
public void executeTaskIfMatch(long millis) {
final Lock readLock = lock.readLock();
+ readLock.lock();
try {
- readLock.lock();
executeTaskIfMatchInternal(millis);
} finally {
readLock.unlock();
diff --git a/hutool-crypto/pom.xml b/hutool-crypto/pom.xml
index 46f8e5247..f16d74ac6 100644
--- a/hutool-crypto/pom.xml
+++ b/hutool-crypto/pom.xml
@@ -9,7 +9,7 @@
cn.hutool
hutool-parent
- 5.4.1-SNAPSHOT
+ 5.4.2-SNAPSHOT
hutool-crypto
diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/RC4.java b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/RC4.java
index 1a3feb214..2cf2e477e 100644
--- a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/RC4.java
+++ b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/RC4.java
@@ -140,8 +140,8 @@ public class RC4 implements Serializable {
*/
public byte[] crypt(final byte[] msg) {
final ReadLock readLock = this.lock.readLock();
- readLock.lock();
byte[] code;
+ readLock.lock();
try {
final int[] sbox = this.sbox.clone();
code = new byte[msg.length];
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 27261779d..fdc994ecb 100644
--- a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java
+++ b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java
@@ -204,7 +204,7 @@ public class SymmetricCrypto implements Serializable {
} else {
cipher.init(Cipher.ENCRYPT_MODE, secretKey, params);
}
- return cipher.doFinal(paddingDataWithZero(data, cipher.getBlockSize()));
+ return cipher.doFinal(paddingDataWithZero(data, cipher.getBlockSize()));
} catch (Exception e) {
throw new CryptoException(e);
} finally {
diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/ECIESTest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/ECIESTest.java
similarity index 90%
rename from hutool-crypto/src/test/java/cn/hutool/crypto/test/ECIESTest.java
rename to hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/ECIESTest.java
index ca83c61ad..1b83fe4f0 100644
--- a/hutool-crypto/src/test/java/cn/hutool/crypto/test/ECIESTest.java
+++ b/hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/ECIESTest.java
@@ -1,4 +1,4 @@
-package cn.hutool.crypto.test;
+package cn.hutool.crypto.test.asymmetric;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.ECIES;
diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/RSATest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/RSATest.java
similarity index 97%
rename from hutool-crypto/src/test/java/cn/hutool/crypto/test/RSATest.java
rename to hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/RSATest.java
index fcb9faa70..f8c309612 100644
--- a/hutool-crypto/src/test/java/cn/hutool/crypto/test/RSATest.java
+++ b/hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/RSATest.java
@@ -1,4 +1,4 @@
-package cn.hutool.crypto.test;
+package cn.hutool.crypto.test.asymmetric;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.ArrayUtil;
diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/SM2Test.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/SM2Test.java
similarity index 90%
rename from hutool-crypto/src/test/java/cn/hutool/crypto/test/SM2Test.java
rename to hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/SM2Test.java
index a5ed710d8..56abb282d 100644
--- a/hutool-crypto/src/test/java/cn/hutool/crypto/test/SM2Test.java
+++ b/hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/SM2Test.java
@@ -1,4 +1,4 @@
-package cn.hutool.crypto.test;
+package cn.hutool.crypto.test.asymmetric;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.CharsetUtil;
@@ -19,9 +19,8 @@ import java.security.PublicKey;
/**
* SM2算法单元测试
- *
- * @author Looly, Gsealy
*
+ * @author Looly, Gsealy
*/
public class SM2Test {
@@ -71,7 +70,7 @@ public class SM2Test {
byte[] decrypt = sm2.decrypt(encrypt, KeyType.PrivateKey);
Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8));
}
-
+
@Test
public void sm2BcdTest() {
String text = "我是一段测试aaaa";
@@ -138,6 +137,19 @@ public class SM2Test {
KeyPair pair = SecureUtil.generateKeyPair("SM2");
+ final SM2 sm2 = new SM2(pair.getPrivate(), pair.getPublic());
+
+ byte[] sign = sm2.sign(content.getBytes());
+ boolean verify = sm2.verify(content.getBytes(), sign);
+ Assert.assertTrue(verify);
+ }
+
+ @Test
+ public void sm2SignAndVerifyUseKeyTest2() {
+ String content = "我是Hanley.";
+
+ KeyPair pair = SecureUtil.generateKeyPair("SM2");
+
final SM2 sm2 = new SM2(//
HexUtil.encodeHexStr(pair.getPrivate().getEncoded()), //
HexUtil.encodeHexStr(pair.getPublic().getEncoded())//
@@ -162,7 +174,7 @@ public class SM2Test {
}
@Test
- public void sm2WithPointTest(){
+ public void sm2WithPointTest() {
String d = "FAB8BBE670FAE338C9E9382B9FB6485225C11A3ECB84C938F10F20A93B6215F0";
String x = "9EF573019D9A03B16B0BE44FC8A5B4E8E098F56034C97B312282DD0B4810AFC3";
String y = "CC759673ED0FC9B9DC7E6FA38F0E2B121E02654BF37EA6B63FAF2A0D6013EADF";
@@ -176,7 +188,7 @@ public class SM2Test {
}
@Test
- public void sm2PlainWithPointTest(){
+ public void sm2PlainWithPointTest() {
// 测试地址:https://i.goto327.top/CryptTools/SM2.aspx?tdsourcetag=s_pctim_aiomsg
String d = "FAB8BBE670FAE338C9E9382B9FB6485225C11A3ECB84C938F10F20A93B6215F0";
diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/SignTest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/SignTest.java
similarity index 96%
rename from hutool-crypto/src/test/java/cn/hutool/crypto/test/SignTest.java
rename to hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/SignTest.java
index 33d88203e..a16d4f562 100644
--- a/hutool-crypto/src/test/java/cn/hutool/crypto/test/SignTest.java
+++ b/hutool-crypto/src/test/java/cn/hutool/crypto/test/asymmetric/SignTest.java
@@ -1,4 +1,4 @@
-package cn.hutool.crypto.test;
+package cn.hutool.crypto.test.asymmetric;
import cn.hutool.core.map.MapUtil;
import org.junit.Assert;
diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/HmacTest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/digest/HmacTest.java
similarity index 94%
rename from hutool-crypto/src/test/java/cn/hutool/crypto/test/HmacTest.java
rename to hutool-crypto/src/test/java/cn/hutool/crypto/test/digest/HmacTest.java
index 1fd247926..b29e6d47a 100644
--- a/hutool-crypto/src/test/java/cn/hutool/crypto/test/HmacTest.java
+++ b/hutool-crypto/src/test/java/cn/hutool/crypto/test/digest/HmacTest.java
@@ -1,4 +1,4 @@
-package cn.hutool.crypto.test;
+package cn.hutool.crypto.test.digest;
import org.junit.Assert;
import org.junit.Test;
diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/AESTest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/AESTest.java
similarity index 88%
rename from hutool-crypto/src/test/java/cn/hutool/crypto/test/AESTest.java
rename to hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/AESTest.java
index 87dd38f2f..f89c9cfc2 100644
--- a/hutool-crypto/src/test/java/cn/hutool/crypto/test/AESTest.java
+++ b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/AESTest.java
@@ -1,4 +1,4 @@
-package cn.hutool.crypto.test;
+package cn.hutool.crypto.test.symmetric;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/DesTest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/DesTest.java
similarity index 92%
rename from hutool-crypto/src/test/java/cn/hutool/crypto/test/DesTest.java
rename to hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/DesTest.java
index 649c35d2c..34554aeda 100644
--- a/hutool-crypto/src/test/java/cn/hutool/crypto/test/DesTest.java
+++ b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/DesTest.java
@@ -1,4 +1,4 @@
-package cn.hutool.crypto.test;
+package cn.hutool.crypto.test.symmetric;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.Mode;
diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/RC4Test.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/RC4Test.java
similarity index 92%
rename from hutool-crypto/src/test/java/cn/hutool/crypto/test/RC4Test.java
rename to hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/RC4Test.java
index 5785182af..7869edc6a 100644
--- a/hutool-crypto/src/test/java/cn/hutool/crypto/test/RC4Test.java
+++ b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/RC4Test.java
@@ -1,4 +1,4 @@
-package cn.hutool.crypto.test;
+package cn.hutool.crypto.test.symmetric;
import org.junit.Assert;
import org.junit.Test;
diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/SymmetricTest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/SymmetricTest.java
similarity index 95%
rename from hutool-crypto/src/test/java/cn/hutool/crypto/test/SymmetricTest.java
rename to hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/SymmetricTest.java
index 0580ac3fd..7b490c816 100644
--- a/hutool-crypto/src/test/java/cn/hutool/crypto/test/SymmetricTest.java
+++ b/hutool-crypto/src/test/java/cn/hutool/crypto/test/symmetric/SymmetricTest.java
@@ -1,4 +1,4 @@
-package cn.hutool.crypto.test;
+package cn.hutool.crypto.test.symmetric;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.RandomUtil;
diff --git a/hutool-db/pom.xml b/hutool-db/pom.xml
index 9d59554bc..0c1e421ac 100644
--- a/hutool-db/pom.xml
+++ b/hutool-db/pom.xml
@@ -9,7 +9,7 @@
cn.hutool
hutool-parent
- 5.4.1-SNAPSHOT
+ 5.4.2-SNAPSHOT
hutool-db
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 382c44ac7..3cf9bdadf 100644
--- a/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java
+++ b/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java
@@ -248,6 +248,25 @@ public abstract class AbstractDb implements Serializable {
}
}
+ /**
+ * 批量执行非查询语句
+ *
+ * @param sql SQL
+ * @param paramsBatch 批量的参数
+ * @return 每个SQL执行影响的行数
+ * @throws SQLException SQL执行异常
+ * @since 5.4.2
+ */
+ public int[] executeBatch(String sql, Iterable