mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-08-18 20:38:02 +08:00
fix comment
This commit is contained in:
@@ -44,10 +44,11 @@ public class AnnotationUtil {
|
||||
* 获取指定注解
|
||||
*
|
||||
* @param annotationEle {@link AnnotatedElement},可以是Class、Method、Field、Constructor、ReflectPermission
|
||||
* @param isToCombination 是否为转换为组合注解
|
||||
* @return 注解对象
|
||||
*/
|
||||
public static Annotation[] getAnnotations(AnnotatedElement annotationEle, boolean isCombination) {
|
||||
return (null == annotationEle) ? null : (isCombination ? toCombination(annotationEle) : annotationEle).getAnnotations();
|
||||
public static Annotation[] getAnnotations(AnnotatedElement annotationEle, boolean isToCombination) {
|
||||
return (null == annotationEle) ? null : (isToCombination ? toCombination(annotationEle) : annotationEle).getAnnotations();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -87,7 +87,7 @@ public class BeanUtil {
|
||||
final Method[] methods = clazz.getMethods();
|
||||
for (Method method : methods) {
|
||||
if (method.getParameterTypes().length == 0) {
|
||||
if(method.getName().startsWith("get") || method.getName().startsWith("is")) {
|
||||
if (method.getName().startsWith("get") || method.getName().startsWith("is")) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -160,6 +160,7 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------- PropertyDescriptor
|
||||
|
||||
/**
|
||||
* 获得Bean字段描述数组
|
||||
*
|
||||
@@ -186,7 +187,7 @@ public class BeanUtil {
|
||||
/**
|
||||
* 获得字段名和字段描述Map,获得的结果会缓存在 {@link BeanInfoCache}中
|
||||
*
|
||||
* @param clazz Bean类
|
||||
* @param clazz Bean类
|
||||
* @param ignoreCase 是否忽略大小写
|
||||
* @return 字段名和字段描述Map
|
||||
* @throws BeanException 获取属性异常
|
||||
@@ -203,7 +204,7 @@ public class BeanUtil {
|
||||
/**
|
||||
* 获得字段名和字段描述Map。内部使用,直接获取Bean类的PropertyDescriptor
|
||||
*
|
||||
* @param clazz Bean类
|
||||
* @param clazz Bean类
|
||||
* @param ignoreCase 是否忽略大小写
|
||||
* @return 字段名和字段描述Map
|
||||
* @throws BeanException 获取属性异常
|
||||
@@ -222,7 +223,7 @@ public class BeanUtil {
|
||||
/**
|
||||
* 获得Bean类属性描述,大小写敏感
|
||||
*
|
||||
* @param clazz Bean类
|
||||
* @param clazz Bean类
|
||||
* @param fieldName 字段名
|
||||
* @return PropertyDescriptor
|
||||
* @throws BeanException 获取属性异常
|
||||
@@ -234,8 +235,8 @@ public class BeanUtil {
|
||||
/**
|
||||
* 获得Bean类属性描述
|
||||
*
|
||||
* @param clazz Bean类
|
||||
* @param fieldName 字段名
|
||||
* @param clazz Bean类
|
||||
* @param fieldName 字段名
|
||||
* @param ignoreCase 是否忽略大小写
|
||||
* @return PropertyDescriptor
|
||||
* @throws BeanException 获取属性异常
|
||||
@@ -249,7 +250,7 @@ public class BeanUtil {
|
||||
* 获得字段值,通过反射直接获得字段值,并不调用getXXX方法<br>
|
||||
* 对象同样支持Map类型,fieldNameOrIndex即为key
|
||||
*
|
||||
* @param bean Bean对象
|
||||
* @param bean Bean对象
|
||||
* @param fieldNameOrIndex 字段名或序号,序号支持负数
|
||||
* @return 字段值
|
||||
*/
|
||||
@@ -273,11 +274,11 @@ public class BeanUtil {
|
||||
* 设置字段值,,通过反射设置字段值,并不调用setXXX方法<br>
|
||||
* 对象同样支持Map类型,fieldNameOrIndex即为key
|
||||
*
|
||||
* @param bean Bean
|
||||
* @param bean Bean
|
||||
* @param fieldNameOrIndex 字段名或序号,序号支持负数
|
||||
* @param value 值
|
||||
* @param value 值
|
||||
*/
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
public static void setFieldValue(Object bean, String fieldNameOrIndex, Object value) {
|
||||
if (bean instanceof Map) {
|
||||
((Map) bean).put(fieldNameOrIndex, value);
|
||||
@@ -294,7 +295,7 @@ public class BeanUtil {
|
||||
/**
|
||||
* 解析Bean中的属性值
|
||||
*
|
||||
* @param bean Bean对象,支持Map、List、Collection、Array
|
||||
* @param bean Bean对象,支持Map、List、Collection、Array
|
||||
* @param expression 表达式,例如:person.friend[5].name
|
||||
* @return Bean属性值
|
||||
* @see BeanPath#get(Object)
|
||||
@@ -307,8 +308,9 @@ public class BeanUtil {
|
||||
/**
|
||||
* 解析Bean中的属性值
|
||||
*
|
||||
* @param bean Bean对象,支持Map、List、Collection、Array
|
||||
* @param bean Bean对象,支持Map、List、Collection、Array
|
||||
* @param expression 表达式,例如:person.friend[5].name
|
||||
* @param value 属性值
|
||||
* @see BeanPath#get(Object)
|
||||
* @since 4.0.6
|
||||
*/
|
||||
@@ -317,12 +319,13 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------- mapToBean
|
||||
|
||||
/**
|
||||
* Map转换为Bean对象
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map {@link Map}
|
||||
* @param beanClass Bean Class
|
||||
* @param <T> Bean类型
|
||||
* @param map {@link Map}
|
||||
* @param beanClass Bean Class
|
||||
* @param isIgnoreError 是否忽略注入错误
|
||||
* @return Bean
|
||||
*/
|
||||
@@ -334,9 +337,9 @@ public class BeanUtil {
|
||||
* Map转换为Bean对象<br>
|
||||
* 忽略大小写
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param beanClass Bean Class
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param beanClass Bean Class
|
||||
* @param isIgnoreError 是否忽略注入错误
|
||||
* @return Bean
|
||||
*/
|
||||
@@ -347,9 +350,9 @@ public class BeanUtil {
|
||||
/**
|
||||
* Map转换为Bean对象
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map {@link Map}
|
||||
* @param beanClass Bean Class
|
||||
* @param <T> Bean类型
|
||||
* @param map {@link Map}
|
||||
* @param beanClass Bean Class
|
||||
* @param copyOptions 转Bean选项
|
||||
* @return Bean
|
||||
*/
|
||||
@@ -358,12 +361,13 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------- fillBeanWithMap
|
||||
|
||||
/**
|
||||
* 使用Map填充Bean对象
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param isIgnoreError 是否忽略注入错误
|
||||
* @return Bean
|
||||
*/
|
||||
@@ -374,9 +378,9 @@ public class BeanUtil {
|
||||
/**
|
||||
* 使用Map填充Bean对象,可配置将下划线转换为驼峰
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param isToCamelCase 是否将下划线模式转换为驼峰模式
|
||||
* @param isIgnoreError 是否忽略注入错误
|
||||
* @return Bean
|
||||
@@ -388,9 +392,9 @@ public class BeanUtil {
|
||||
/**
|
||||
* 使用Map填充Bean对象,忽略大小写
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param isIgnoreError 是否忽略注入错误
|
||||
* @return Bean
|
||||
*/
|
||||
@@ -401,9 +405,9 @@ public class BeanUtil {
|
||||
/**
|
||||
* 使用Map填充Bean对象
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param copyOptions 属性复制选项 {@link CopyOptions}
|
||||
* @return Bean
|
||||
*/
|
||||
@@ -414,11 +418,11 @@ public class BeanUtil {
|
||||
/**
|
||||
* 使用Map填充Bean对象
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param <T> Bean类型
|
||||
* @param map Map
|
||||
* @param bean Bean
|
||||
* @param isToCamelCase 是否将Map中的下划线风格key转换为驼峰风格
|
||||
* @param copyOptions 属性复制选项 {@link CopyOptions}
|
||||
* @param copyOptions 属性复制选项 {@link CopyOptions}
|
||||
* @return Bean
|
||||
* @since 3.3.1
|
||||
*/
|
||||
@@ -433,11 +437,13 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------- fillBean
|
||||
|
||||
/**
|
||||
* 对象或Map转Bean
|
||||
*
|
||||
* @param <T> 转换的Bean类型
|
||||
* @param source Bean对象或Map
|
||||
* @param clazz 目标的Bean类型
|
||||
* @param clazz 目标的Bean类型
|
||||
* @return Bean对象
|
||||
* @since 4.1.20
|
||||
*/
|
||||
@@ -450,10 +456,10 @@ public class BeanUtil {
|
||||
/**
|
||||
* ServletRequest 参数转Bean
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param beanClass Bean Class
|
||||
* @param <T> Bean类型
|
||||
* @param beanClass Bean Class
|
||||
* @param valueProvider 值提供者
|
||||
* @param copyOptions 拷贝选项,见 {@link CopyOptions}
|
||||
* @param copyOptions 拷贝选项,见 {@link CopyOptions}
|
||||
* @return Bean
|
||||
*/
|
||||
public static <T> T toBean(Class<T> beanClass, ValueProvider<String> valueProvider, CopyOptions copyOptions) {
|
||||
@@ -463,10 +469,10 @@ public class BeanUtil {
|
||||
/**
|
||||
* 填充Bean的核心方法
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param bean Bean
|
||||
* @param <T> Bean类型
|
||||
* @param bean Bean
|
||||
* @param valueProvider 值提供者
|
||||
* @param copyOptions 拷贝选项,见 {@link CopyOptions}
|
||||
* @param copyOptions 拷贝选项,见 {@link CopyOptions}
|
||||
* @return Bean
|
||||
*/
|
||||
public static <T> T fillBean(T bean, ValueProvider<String> valueProvider, CopyOptions copyOptions) {
|
||||
@@ -478,6 +484,7 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------- beanToMap
|
||||
|
||||
/**
|
||||
* 对象转Map,不进行驼峰转下划线,不忽略值为空的字段
|
||||
*
|
||||
@@ -491,22 +498,22 @@ public class BeanUtil {
|
||||
/**
|
||||
* 对象转Map
|
||||
*
|
||||
* @param bean bean对象
|
||||
* @param bean bean对象
|
||||
* @param isToUnderlineCase 是否转换为下划线模式
|
||||
* @param ignoreNullValue 是否忽略值为空的字段
|
||||
* @param ignoreNullValue 是否忽略值为空的字段
|
||||
* @return Map
|
||||
*/
|
||||
public static Map<String, Object> beanToMap(Object bean, boolean isToUnderlineCase, boolean ignoreNullValue) {
|
||||
return beanToMap(bean, new LinkedHashMap<String, Object>(), isToUnderlineCase, ignoreNullValue);
|
||||
return beanToMap(bean, new LinkedHashMap<>(), isToUnderlineCase, ignoreNullValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* 对象转Map
|
||||
*
|
||||
* @param bean bean对象
|
||||
* @param targetMap 目标的Map
|
||||
* @param bean bean对象
|
||||
* @param targetMap 目标的Map
|
||||
* @param isToUnderlineCase 是否转换为下划线模式
|
||||
* @param ignoreNullValue 是否忽略值为空的字段
|
||||
* @param ignoreNullValue 是否忽略值为空的字段
|
||||
* @return Map
|
||||
* @since 3.2.3
|
||||
*/
|
||||
@@ -534,10 +541,10 @@ public class BeanUtil {
|
||||
* 3. 自定义字段前缀或后缀等等
|
||||
* </pre>
|
||||
*
|
||||
* @param bean bean对象
|
||||
* @param targetMap 目标的Map
|
||||
* @param bean bean对象
|
||||
* @param targetMap 目标的Map
|
||||
* @param ignoreNullValue 是否忽略值为空的字段
|
||||
* @param keyEditor 属性字段(Map的key)编辑器,用于筛选、编辑key
|
||||
* @param keyEditor 属性字段(Map的key)编辑器,用于筛选、编辑key
|
||||
* @return Map
|
||||
* @since 4.0.5
|
||||
*/
|
||||
@@ -575,6 +582,7 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------------------- copyProperties
|
||||
|
||||
/**
|
||||
* 复制Bean对象属性
|
||||
*
|
||||
@@ -589,8 +597,8 @@ public class BeanUtil {
|
||||
* 复制Bean对象属性<br>
|
||||
* 限制类用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类
|
||||
*
|
||||
* @param source 源Bean对象
|
||||
* @param target 目标Bean对象
|
||||
* @param source 源Bean对象
|
||||
* @param target 目标Bean对象
|
||||
* @param ignoreProperties 不拷贝的的属性列表
|
||||
*/
|
||||
public static void copyProperties(Object source, Object target, String... ignoreProperties) {
|
||||
@@ -600,8 +608,8 @@ public class BeanUtil {
|
||||
/**
|
||||
* 复制Bean对象属性<br>
|
||||
*
|
||||
* @param source 源Bean对象
|
||||
* @param target 目标Bean对象
|
||||
* @param source 源Bean对象
|
||||
* @param target 目标Bean对象
|
||||
* @param ignoreCase 是否忽略大小写
|
||||
*/
|
||||
public static void copyProperties(Object source, Object target, boolean ignoreCase) {
|
||||
@@ -612,8 +620,8 @@ public class BeanUtil {
|
||||
* 复制Bean对象属性<br>
|
||||
* 限制类用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类
|
||||
*
|
||||
* @param source 源Bean对象
|
||||
* @param target 目标Bean对象
|
||||
* @param source 源Bean对象
|
||||
* @param target 目标Bean对象
|
||||
* @param copyOptions 拷贝选项,见 {@link CopyOptions}
|
||||
*/
|
||||
public static void copyProperties(Object source, Object target, CopyOptions copyOptions) {
|
||||
@@ -628,9 +636,9 @@ public class BeanUtil {
|
||||
* 如果isSimple为{@code false},则只匹配类名而忽略包名,例如:cn.hutool.TestEntity只匹配TestEntity<br>
|
||||
* 如果isSimple为{@code true},则匹配包括包名的全类名,例如:cn.hutool.TestEntity匹配cn.hutool.TestEntity
|
||||
*
|
||||
* @param bean Bean
|
||||
* @param bean Bean
|
||||
* @param beanClassName Bean的类名
|
||||
* @param isSimple 是否只匹配类名而忽略包名,true表示忽略包名
|
||||
* @param isSimple 是否只匹配类名而忽略包名,true表示忽略包名
|
||||
* @return 是否匹配
|
||||
* @since 4.0.6
|
||||
*/
|
||||
@@ -639,13 +647,14 @@ public class BeanUtil {
|
||||
}
|
||||
|
||||
/**
|
||||
* 把Bean里面的String属性做trim操作。
|
||||
*
|
||||
* 把Bean里面的String属性做trim操作。此方法直接对传入的Bean做修改。
|
||||
* <p>
|
||||
* 通常bean直接用来绑定页面的input,用户的输入可能首尾存在空格,通常保存数据库前需要把首尾空格去掉
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param bean Bean对象
|
||||
* @param <T> Bean类型
|
||||
* @param bean Bean对象
|
||||
* @param ignoreFields 不需要trim的Field名称列表(不区分大小写)
|
||||
* @return 处理后的Bean对象
|
||||
*/
|
||||
public static <T> T trimStrFields(T bean, String... ignoreFields) {
|
||||
if (bean == null) {
|
||||
|
||||
@@ -5,7 +5,6 @@ package cn.hutool.core.codec;
|
||||
* 算法来自:https://github.com/zhaorenjie110/SymmetricEncryptionAndDecryption
|
||||
*
|
||||
* @author looly
|
||||
*
|
||||
*/
|
||||
public class Caesar {
|
||||
|
||||
@@ -16,7 +15,7 @@ public class Caesar {
|
||||
* 传入明文,加密得到密文
|
||||
*
|
||||
* @param message 加密的消息
|
||||
* @param offset 偏移量
|
||||
* @param offset 偏移量
|
||||
* @return 加密后的内容
|
||||
*/
|
||||
public static String encode(String message, int offset) {
|
||||
@@ -36,15 +35,16 @@ public class Caesar {
|
||||
/**
|
||||
* 传入明文解密到密文
|
||||
*
|
||||
* @param ciphertext 密文
|
||||
* @param cipherText 密文
|
||||
* @param offset 偏移量
|
||||
* @return 解密后的内容
|
||||
*/
|
||||
public static String decode(String ciphertext, int offset) {
|
||||
final int len = ciphertext.length();
|
||||
final char[] plain = ciphertext.toCharArray();
|
||||
public static String decode(String cipherText, int offset) {
|
||||
final int len = cipherText.length();
|
||||
final char[] plain = cipherText.toCharArray();
|
||||
char c;
|
||||
for (int i = 0; i < len; i++) {
|
||||
c = ciphertext.charAt(i);
|
||||
c = cipherText.charAt(i);
|
||||
if (false == Character.isLetter(c)) {
|
||||
continue;
|
||||
}
|
||||
@@ -54,10 +54,11 @@ public class Caesar {
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------- Private method start
|
||||
|
||||
/**
|
||||
* 加密轮盘
|
||||
*
|
||||
* @param c 被加密字符
|
||||
* @param c 被加密字符
|
||||
* @param offset 偏移量
|
||||
* @return 加密后的字符
|
||||
*/
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,13 +1,38 @@
|
||||
package cn.hutool.core.comparator;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
||||
public class CompareUtil {
|
||||
|
||||
/**
|
||||
* 对象比较,比较结果取决于comparator,如果被比较对象为null,传入的comparator对象应处理此情况<br>
|
||||
* 如果传入comparator为null,则使用默认规则比较(此时被比较对象必须实现Comparable接口)
|
||||
*
|
||||
* <p>
|
||||
* 一般而言,如果c1 < c2,返回数小于0,c1==c2返回0,c1 > c2 大于0
|
||||
*
|
||||
* @param <T> 被比较对象类型
|
||||
* @param c1 对象1
|
||||
* @param c2 对象2
|
||||
* @param comparator 比较器
|
||||
* @return 比较结果
|
||||
* @see java.util.Comparator#compare(Object, Object)
|
||||
* @since 4.6.9
|
||||
*/
|
||||
@SuppressWarnings("rawtypes")
|
||||
public static <T> int compare(T c1, T c2, Comparator<T> comparator) {
|
||||
if (null == comparator) {
|
||||
return compare((Comparable)c1, (Comparable)c2);
|
||||
}
|
||||
return comparator.compare(c1, c2);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@code null}安全的对象比较,{@code null}对象小于任何对象
|
||||
*
|
||||
* @param <T> 被比较对象类型
|
||||
* @param c1 对象1,可以为{@code null}
|
||||
* @param c2 对象2,可以为{@code null}
|
||||
* @param c1 对象1,可以为{@code null}
|
||||
* @param c2 对象2,可以为{@code null}
|
||||
* @return 比较结果,如果c1 < c2,返回数小于0,c1==c2返回0,c1 > c2 大于0
|
||||
* @see java.util.Comparator#compare(Object, Object)
|
||||
*/
|
||||
@@ -18,9 +43,9 @@ public class CompareUtil {
|
||||
/**
|
||||
* {@code null}安全的对象比较
|
||||
*
|
||||
* @param <T> 被比较对象类型(必须实现Comparable接口)
|
||||
* @param c1 对象1,可以为{@code null}
|
||||
* @param c2 对象2,可以为{@code null}
|
||||
* @param <T> 被比较对象类型(必须实现Comparable接口)
|
||||
* @param c1 对象1,可以为{@code null}
|
||||
* @param c2 对象2,可以为{@code null}
|
||||
* @param isNullGreater 当被比较对象为null时是否排在前面,true表示null大于任何对象,false反之
|
||||
* @return 比较结果,如果c1 < c2,返回数小于0,c1==c2返回0,c1 > c2 大于0
|
||||
* @see java.util.Comparator#compare(Object, Object)
|
||||
@@ -46,12 +71,13 @@ public class CompareUtil {
|
||||
* 4、比较toString值
|
||||
* </pre>
|
||||
*
|
||||
* @param o1 对象1
|
||||
* @param o2 对象2
|
||||
* @param <T> 被比较对象类型
|
||||
* @param o1 对象1
|
||||
* @param o2 对象2
|
||||
* @param isNullGreater null值是否做为最大值
|
||||
* @return 比较结果,如果o1 < o2,返回数小于0,o1==o2返回0,o1 > o2 大于0
|
||||
*/
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
public static <T> int compare(T o1, T o2, boolean isNullGreater) {
|
||||
if (o1 == o2) {
|
||||
return 0;
|
||||
@@ -61,17 +87,17 @@ public class CompareUtil {
|
||||
return isNullGreater ? -1 : 1;
|
||||
}
|
||||
|
||||
if(o1 instanceof Comparable && o2 instanceof Comparable) {
|
||||
if (o1 instanceof Comparable && o2 instanceof Comparable) {
|
||||
//如果bean可比较,直接比较bean
|
||||
return ((Comparable)o1).compareTo(o2);
|
||||
return ((Comparable) o1).compareTo(o2);
|
||||
}
|
||||
|
||||
if(o1.equals(o2)) {
|
||||
if (o1.equals(o2)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int result = Integer.compare(o1.hashCode(), o2.hashCode());
|
||||
if(0 == result) {
|
||||
if (0 == result) {
|
||||
result = compare(o1.toString(), o2.toString());
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ public class PropertyComparator<T> implements Comparator<T>, Serializable {
|
||||
return compare(o1, o2, v1, v2);
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@SuppressWarnings({ "rawtypes"})
|
||||
private int compare(T o1, T o2, Comparable fieldValue1, Comparable fieldValue2) {
|
||||
int result = ObjectUtil.compare(fieldValue1, fieldValue2, isNullGreater);
|
||||
if(0 == result) {
|
||||
|
||||
@@ -528,6 +528,8 @@ public class Convert {
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param keyType 键类型
|
||||
* @param valueType 值类型
|
||||
* @param value 被转换的值
|
||||
* @return {@link Map}
|
||||
* @since 4.6.8
|
||||
|
||||
@@ -366,7 +366,9 @@ public class StopWatch {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取任务名Get the name of this task.
|
||||
* 获取任务名
|
||||
*
|
||||
* @return 任务名
|
||||
*/
|
||||
public String getTaskName() {
|
||||
return this.taskName;
|
||||
@@ -375,6 +377,7 @@ public class StopWatch {
|
||||
/**
|
||||
* 获取任务花费时间(单位:纳秒)
|
||||
*
|
||||
* @return 任务花费时间(单位:纳秒)
|
||||
* @see #getTimeMillis()
|
||||
* @see #getTimeSeconds()
|
||||
*/
|
||||
@@ -385,6 +388,7 @@ public class StopWatch {
|
||||
/**
|
||||
* 获取任务花费时间(单位:毫秒)
|
||||
*
|
||||
* @return 任务花费时间(单位:毫秒)
|
||||
* @see #getTimeNanos()
|
||||
* @see #getTimeSeconds()
|
||||
*/
|
||||
@@ -395,6 +399,7 @@ public class StopWatch {
|
||||
/**
|
||||
* 获取任务花费时间(单位:秒)
|
||||
*
|
||||
* @return 任务花费时间(单位:秒)
|
||||
* @see #getTimeMillis()
|
||||
* @see #getTimeNanos()
|
||||
*/
|
||||
|
||||
@@ -63,6 +63,7 @@ public class ExceptionUtil {
|
||||
/**
|
||||
* 包装一个异常
|
||||
*
|
||||
* @param <T> 被包装的异常类型
|
||||
* @param throwable 异常
|
||||
* @param wrapThrowable 包装后的异常类
|
||||
* @return 包装后的异常
|
||||
@@ -124,6 +125,7 @@ public class ExceptionUtil {
|
||||
/**
|
||||
* 获取指定层的堆栈信息
|
||||
*
|
||||
* @param i 层数
|
||||
* @return 指定层的堆栈信息
|
||||
* @since 4.1.4
|
||||
*/
|
||||
@@ -346,7 +348,7 @@ public class ExceptionUtil {
|
||||
* @since 4.6.2
|
||||
*/
|
||||
public static List<Throwable> getThrowableList(Throwable throwable) {
|
||||
final List<Throwable> list = new ArrayList<Throwable>();
|
||||
final List<Throwable> list = new ArrayList<>();
|
||||
while (throwable != null && false == list.contains(throwable)) {
|
||||
list.add(throwable);
|
||||
throwable = throwable.getCause();
|
||||
|
||||
@@ -45,16 +45,22 @@ import cn.hutool.core.util.StrUtil;
|
||||
* @author looly
|
||||
* @since 4.1.5
|
||||
*/
|
||||
public class Img implements Serializable{
|
||||
public class Img implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private BufferedImage srcImage;
|
||||
private Image targetImage;
|
||||
/** 目标图片文件格式,用于写出 */
|
||||
/**
|
||||
* 目标图片文件格式,用于写出
|
||||
*/
|
||||
private String targetImageType = ImgUtil.IMAGE_TYPE_JPG;
|
||||
/** 计算x,y坐标的时候是否从中心做为原始坐标开始计算 */
|
||||
/**
|
||||
* 计算x,y坐标的时候是否从中心做为原始坐标开始计算
|
||||
*/
|
||||
private boolean positionBaseCentre = true;
|
||||
/** 图片输出质量,用于压缩 */
|
||||
/**
|
||||
* 图片输出质量,用于压缩
|
||||
*/
|
||||
private float quality = -1;
|
||||
|
||||
/**
|
||||
@@ -154,6 +160,7 @@ public class Img implements Serializable{
|
||||
* 计算x,y坐标的时候是否从中心做为原始坐标开始计算
|
||||
*
|
||||
* @param positionBaseCentre 是否从中心做为原始坐标开始计算
|
||||
* @return this
|
||||
* @since 4.1.15
|
||||
*/
|
||||
public Img setPositionBaseCentre(boolean positionBaseCentre) {
|
||||
@@ -165,6 +172,7 @@ public class Img implements Serializable{
|
||||
* 设置图片输出质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩
|
||||
*
|
||||
* @param quality 质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩
|
||||
* @return this
|
||||
* @since 4.3.2
|
||||
*/
|
||||
public Img setQuality(double quality) {
|
||||
@@ -175,6 +183,7 @@ public class Img implements Serializable{
|
||||
* 设置图片输出质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩
|
||||
*
|
||||
* @param quality 质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩
|
||||
* @return this
|
||||
* @since 4.3.2
|
||||
*/
|
||||
public Img setQuality(float quality) {
|
||||
@@ -219,7 +228,7 @@ public class Img implements Serializable{
|
||||
* 缩放图像(按长宽缩放)<br>
|
||||
* 注意:目标长宽与原图不成比例会变形
|
||||
*
|
||||
* @param width 目标宽度
|
||||
* @param width 目标宽度
|
||||
* @param height 目标高度
|
||||
* @return this
|
||||
*/
|
||||
@@ -257,8 +266,8 @@ public class Img implements Serializable{
|
||||
* 等比缩放图像,此方法按照按照给定的长宽等比缩放图片,按照长宽缩放比最多的一边等比缩放,空白部分填充背景色<br>
|
||||
* 缩放后默认为jpeg格式
|
||||
*
|
||||
* @param width 缩放后的宽度
|
||||
* @param height 缩放后的高度
|
||||
* @param width 缩放后的宽度
|
||||
* @param height 缩放后的高度
|
||||
* @param fixedColor 比例不对时补充的颜色,不补充为<code>null</code>
|
||||
* @return this
|
||||
*/
|
||||
@@ -334,8 +343,8 @@ public class Img implements Serializable{
|
||||
/**
|
||||
* 图像切割为圆形(按指定起点坐标和半径切割)
|
||||
*
|
||||
* @param x 原图的x坐标起始位置
|
||||
* @param y 原图的y坐标起始位置
|
||||
* @param x 原图的x坐标起始位置
|
||||
* @param y 原图的y坐标起始位置
|
||||
* @param radius 半径,小于0表示填充满整个图片(直径取长宽最小值)
|
||||
* @return this
|
||||
* @since 4.1.15
|
||||
@@ -415,11 +424,11 @@ public class Img implements Serializable{
|
||||
* 此方法并不关闭流
|
||||
*
|
||||
* @param pressText 水印文字
|
||||
* @param color 水印的字体颜色
|
||||
* @param font {@link Font} 字体相关信息
|
||||
* @param x 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param y 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
|
||||
* @param color 水印的字体颜色
|
||||
* @param font {@link Font} 字体相关信息
|
||||
* @param x 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param y 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
|
||||
* @return 处理后的图像
|
||||
*/
|
||||
public Img pressText(String pressText, Color color, Font font, int x, int y, float alpha) {
|
||||
@@ -452,9 +461,9 @@ public class Img implements Serializable{
|
||||
* 给图片添加图片水印
|
||||
*
|
||||
* @param pressImg 水印图片,可以使用{@link ImageIO#read(File)}方法读取文件
|
||||
* @param x 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param y 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
|
||||
* @param x 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param y 修正值。 默认在中间,偏移量相对于中间偏移
|
||||
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
|
||||
* @return this
|
||||
*/
|
||||
public Img pressImage(Image pressImg, int x, int y, float alpha) {
|
||||
@@ -467,9 +476,9 @@ public class Img implements Serializable{
|
||||
/**
|
||||
* 给图片添加图片水印
|
||||
*
|
||||
* @param pressImg 水印图片,可以使用{@link ImageIO#read(File)}方法读取文件
|
||||
* @param pressImg 水印图片,可以使用{@link ImageIO#read(File)}方法读取文件
|
||||
* @param rectangle 矩形对象,表示矩形区域的x,y,width,height,x,y从背景图片中心计算
|
||||
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
|
||||
* @param alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
|
||||
* @return this
|
||||
* @since 4.1.14
|
||||
*/
|
||||
@@ -525,6 +534,7 @@ public class Img implements Serializable{
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------------------------- Write
|
||||
|
||||
/**
|
||||
* 获取处理过的图片
|
||||
*
|
||||
@@ -589,12 +599,13 @@ public class Img implements Serializable{
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------------------------------- Private method start
|
||||
|
||||
/**
|
||||
* 将图片绘制在背景上
|
||||
*
|
||||
* @param backgroundImg 背景图片
|
||||
* @param img 要绘制的图片
|
||||
* @param rectangle 矩形对象,表示矩形区域的x,y,width,height,x,y从背景图片中心计算
|
||||
* @param img 要绘制的图片
|
||||
* @param rectangle 矩形对象,表示矩形区域的x,y,width,height,x,y从背景图片中心计算
|
||||
* @return 绘制后的背景
|
||||
*/
|
||||
private static BufferedImage draw(BufferedImage backgroundImg, Image img, Rectangle rectangle, float alpha) {
|
||||
@@ -614,10 +625,10 @@ public class Img implements Serializable{
|
||||
*/
|
||||
private int getTypeInt() {
|
||||
switch (this.targetImageType) {
|
||||
case ImgUtil.IMAGE_TYPE_PNG:
|
||||
return BufferedImage.TYPE_INT_ARGB;
|
||||
default:
|
||||
return BufferedImage.TYPE_INT_RGB;
|
||||
case ImgUtil.IMAGE_TYPE_PNG:
|
||||
return BufferedImage.TYPE_INT_ARGB;
|
||||
default:
|
||||
return BufferedImage.TYPE_INT_RGB;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -633,8 +644,8 @@ public class Img implements Serializable{
|
||||
/**
|
||||
* 修正矩形框位置,如果{@link Img#setPositionBaseCentre(boolean)} 设为{@code true},则坐标修正为基于图形中心,否则基于左上角
|
||||
*
|
||||
* @param rectangle 矩形
|
||||
* @param baseWidth 参考宽
|
||||
* @param rectangle 矩形
|
||||
* @param baseWidth 参考宽
|
||||
* @param baseHeight 参考高
|
||||
* @return 修正后的{@link Rectangle}
|
||||
* @since 4.1.15
|
||||
@@ -653,16 +664,16 @@ public class Img implements Serializable{
|
||||
/**
|
||||
* 计算旋转后的图片尺寸
|
||||
*
|
||||
* @param width 宽度
|
||||
* @param width 宽度
|
||||
* @param height 高度
|
||||
* @param degree 旋转角度
|
||||
* @return 计算后目标尺寸
|
||||
* @since 4.1.20
|
||||
*/
|
||||
private static Rectangle calcRotatedSize(int width, int height, int degree) {
|
||||
if(degree < 0){
|
||||
if (degree < 0) {
|
||||
// 负数角度转换为正数角度
|
||||
degree += 360;
|
||||
degree += 360;
|
||||
}
|
||||
if (degree >= 90) {
|
||||
if (degree / 90 % 2 == 1) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -364,7 +364,7 @@ public class FileUtil {
|
||||
* 此方法会检查slip漏洞,漏洞说明见http://blog.nsfocus.net/zip-slip-2/
|
||||
*
|
||||
* @param directory 父目录
|
||||
* @param names 元素名(多层目录名)
|
||||
* @param names 元素名(多层目录名),由外到内依次传入
|
||||
* @return the file 文件
|
||||
* @since 4.0.6
|
||||
*/
|
||||
@@ -388,6 +388,7 @@ public class FileUtil {
|
||||
* <p>
|
||||
* 元素名(多层目录名)
|
||||
*
|
||||
* @param names 多层文件的文件名,由外到内依次传入
|
||||
* @return the file 文件
|
||||
* @since 4.0.6
|
||||
*/
|
||||
@@ -1397,6 +1398,7 @@ public class FileUtil {
|
||||
* @param file1 文件1
|
||||
* @param file2 文件2
|
||||
* @param charset 编码,null表示使用平台默认编码 两个文件内容一致返回true,否则false
|
||||
* @return 是否相同
|
||||
* @throws IORuntimeException IO异常
|
||||
* @since 4.0.6
|
||||
*/
|
||||
@@ -1550,7 +1552,7 @@ public class FileUtil {
|
||||
// 统一使用斜杠
|
||||
pathToUse = pathToUse.replaceAll("[/\\\\]+", StrUtil.SLASH).trim();
|
||||
//兼容Windows下的共享目录路径(原始路径如果以\\开头,则保留这种路径)
|
||||
if(path.startsWith("\\\\")){
|
||||
if (path.startsWith("\\\\")) {
|
||||
pathToUse = "\\" + pathToUse;
|
||||
}
|
||||
|
||||
@@ -3354,10 +3356,10 @@ public class FileUtil {
|
||||
* 获取指定层级的父路径
|
||||
*
|
||||
* <pre>
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 0) -> "d:/aaa/bbb/cc/ddd"
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 2) -> "d:/aaa/bbb"
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 4) -> "d:/"
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 5) -> null
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 0) -》 "d:/aaa/bbb/cc/ddd"
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 2) -》 "d:/aaa/bbb"
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 4) -》 "d:/"
|
||||
* getParent("d:/aaa/bbb/cc/ddd", 5) -》 null
|
||||
* </pre>
|
||||
*
|
||||
* @param filePath 目录或文件路径
|
||||
@@ -3378,10 +3380,10 @@ public class FileUtil {
|
||||
* 获取指定层级的父路径
|
||||
*
|
||||
* <pre>
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 0)) -> "d:/aaa/bbb/cc/ddd"
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 2)) -> "d:/aaa/bbb"
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 4)) -> "d:/"
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 5)) -> null
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 0)) -》 "d:/aaa/bbb/cc/ddd"
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 2)) -》 "d:/aaa/bbb"
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 4)) -》 "d:/"
|
||||
* getParent(file("d:/aaa/bbb/cc/ddd", 5)) -》 null
|
||||
* </pre>
|
||||
*
|
||||
* @param file 目录或文件
|
||||
|
||||
@@ -139,6 +139,7 @@ public class FileCopier extends SrcToDestCopier<File, FileCopier>{
|
||||
* 设置当拷贝来源是目录时是否只拷贝文件而忽略子目录
|
||||
*
|
||||
* @param isOnlyCopyFile 当拷贝来源是目录时是否只拷贝文件而忽略子目录
|
||||
* @return this
|
||||
* @since 4.1.5
|
||||
*/
|
||||
public FileCopier setOnlyCopyFile(boolean isOnlyCopyFile) {
|
||||
|
||||
@@ -16,7 +16,7 @@ public class MultiFileResource extends MultiResource{
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param files
|
||||
* @param files 文件资源列表
|
||||
*/
|
||||
public MultiFileResource(Collection<File> files) {
|
||||
super();
|
||||
@@ -26,7 +26,7 @@ public class MultiFileResource extends MultiResource{
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param files
|
||||
* @param files 文件资源列表
|
||||
*/
|
||||
public MultiFileResource(File... files) {
|
||||
super();
|
||||
|
||||
@@ -442,7 +442,7 @@ public class WatchMonitor extends Thread implements Closeable, Serializable {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置监听选项,例如监听频率等,可设置项包括:<p>
|
||||
* 设置监听选项,例如监听频率等,可设置项包括:
|
||||
*
|
||||
* <pre>
|
||||
* 1、com.sun.nio.file.StandardWatchEventKinds
|
||||
|
||||
@@ -525,14 +525,14 @@ public class Assert {
|
||||
* 检查下标(数组、集合、字符串)是否符合要求,下标必须满足:
|
||||
*
|
||||
* <pre>
|
||||
* 0 <= index < size
|
||||
* 0 ≤ index < size
|
||||
* </pre>
|
||||
*
|
||||
* @param index 下标
|
||||
* @param size 长度
|
||||
* @return 检查后的下标
|
||||
* @throws IllegalArgumentException 如果size < 0 抛出此异常
|
||||
* @throws IndexOutOfBoundsException 如果index < 0或者 index >= size 抛出此异常
|
||||
* @throws IllegalArgumentException 如果size < 0 抛出此异常
|
||||
* @throws IndexOutOfBoundsException 如果index < 0或者 index ≥ size 抛出此异常
|
||||
* @since 4.1.9
|
||||
*/
|
||||
public static int checkIndex(int index, int size) throws IllegalArgumentException, IndexOutOfBoundsException {
|
||||
@@ -543,7 +543,7 @@ public class Assert {
|
||||
* 检查下标(数组、集合、字符串)是否符合要求,下标必须满足:
|
||||
*
|
||||
* <pre>
|
||||
* 0 <= index < size
|
||||
* 0 ≤ index < size
|
||||
* </pre>
|
||||
*
|
||||
* @param index 下标
|
||||
@@ -551,8 +551,8 @@ public class Assert {
|
||||
* @param errorMsgTemplate 异常时的消息模板
|
||||
* @param params 参数列表
|
||||
* @return 检查后的下标
|
||||
* @throws IllegalArgumentException 如果size < 0 抛出此异常
|
||||
* @throws IndexOutOfBoundsException 如果index < 0或者 index >= size 抛出此异常
|
||||
* @throws IllegalArgumentException 如果size < 0 抛出此异常
|
||||
* @throws IndexOutOfBoundsException 如果index < 0或者 index ≥ size 抛出此异常
|
||||
* @since 4.1.9
|
||||
*/
|
||||
public static int checkIndex(int index, int size, String errorMsgTemplate, Object... params) throws IllegalArgumentException, IndexOutOfBoundsException {
|
||||
|
||||
@@ -18,7 +18,6 @@ import cn.hutool.core.util.URLUtil;
|
||||
* 外部Jar的类加载器
|
||||
*
|
||||
* @author Looly
|
||||
*
|
||||
*/
|
||||
public class JarClassLoader extends URLClassLoader {
|
||||
|
||||
@@ -50,7 +49,7 @@ public class JarClassLoader extends URLClassLoader {
|
||||
/**
|
||||
* 加载Jar文件到指定loader中
|
||||
*
|
||||
* @param loader {@link URLClassLoader}
|
||||
* @param loader {@link URLClassLoader}
|
||||
* @param jarFile 被加载的jar
|
||||
* @throws UtilException IO异常包装和执行异常
|
||||
*/
|
||||
@@ -61,7 +60,7 @@ public class JarClassLoader extends URLClassLoader {
|
||||
method.setAccessible(true);
|
||||
final List<File> jars = loopJar(jarFile);
|
||||
for (File jar : jars) {
|
||||
ReflectUtil.invoke(loader, method, new Object[] { jar.toURI().toURL() });
|
||||
ReflectUtil.invoke(loader, method, new Object[]{jar.toURI().toURL()});
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
@@ -82,11 +81,12 @@ public class JarClassLoader extends URLClassLoader {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------- Constructor start
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*/
|
||||
public JarClassLoader() {
|
||||
this(new URL[] {});
|
||||
this(new URL[]{});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -106,7 +106,7 @@ public class JarClassLoader extends URLClassLoader {
|
||||
* @return this
|
||||
*/
|
||||
public JarClassLoader addJar(File jarFileOrDir) {
|
||||
if(isJarFile(jarFileOrDir)) {
|
||||
if (isJarFile(jarFileOrDir)) {
|
||||
return addURL(jarFileOrDir);
|
||||
}
|
||||
final List<File> jars = loopJar(jarFileOrDir);
|
||||
@@ -126,6 +126,7 @@ public class JarClassLoader extends URLClassLoader {
|
||||
* 如果为目录,此目录用于搜索class文件,如果为文件,需为jar文件
|
||||
*
|
||||
* @param dir 目录
|
||||
* @return this
|
||||
* @since 4.4.2
|
||||
*/
|
||||
public JarClassLoader addURL(File dir) {
|
||||
@@ -134,6 +135,7 @@ public class JarClassLoader extends URLClassLoader {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------- Private method start
|
||||
|
||||
/**
|
||||
* 递归获得Jar文件
|
||||
*
|
||||
|
||||
@@ -15,7 +15,6 @@ import cn.hutool.core.util.StrUtil;
|
||||
* <p>
|
||||
* 这些通用标识符具有不同的变体。此类的方法用于操作 Leach-Salz 变体,不过构造方法允许创建任何 UUID 变体(将在下面进行描述)。
|
||||
* <p>
|
||||
*
|
||||
* 变体 2 (Leach-Salz) UUID 的布局如下: long 型数据的最高有效位由以下无符号字段组成:
|
||||
*
|
||||
* <pre>
|
||||
@@ -24,7 +23,7 @@ import cn.hutool.core.util.StrUtil;
|
||||
* 0x000000000000F000 version
|
||||
* 0x0000000000000FFF time_hi
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
* long 型数据的最低有效位由以下无符号字段组成:
|
||||
*
|
||||
* <pre>
|
||||
@@ -48,16 +47,19 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* {@link SecureRandom} 的单例
|
||||
*
|
||||
* @author looly
|
||||
*
|
||||
*/
|
||||
private static class Holder {
|
||||
static final SecureRandom numberGenerator = RandomUtil.getSecureRandom();
|
||||
}
|
||||
|
||||
/** 此UUID的最高64有效位 */
|
||||
/**
|
||||
* 此UUID的最高64有效位
|
||||
*/
|
||||
private final long mostSigBits;
|
||||
|
||||
/** 此UUID的最低64有效位 */
|
||||
/**
|
||||
* 此UUID的最低64有效位
|
||||
*/
|
||||
private final long leastSigBits;
|
||||
|
||||
/**
|
||||
@@ -82,7 +84,7 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
/**
|
||||
* 使用指定的数据构造新的 UUID。
|
||||
*
|
||||
* @param mostSigBits 用于 {@code UUID} 的最高有效 64 位
|
||||
* @param mostSigBits 用于 {@code UUID} 的最高有效 64 位
|
||||
* @param leastSigBits 用于 {@code UUID} 的最低有效 64 位
|
||||
*/
|
||||
public UUID(long mostSigBits, long leastSigBits) {
|
||||
@@ -130,7 +132,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。
|
||||
*
|
||||
* @param name 用于构造 UUID 的字节数组。
|
||||
*
|
||||
* @return 根据指定数组生成的 {@code UUID}
|
||||
*/
|
||||
public static UUID nameUUIDFromBytes(byte[] name) {
|
||||
@@ -154,7 +155,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* @param name 指定 {@code UUID} 字符串
|
||||
* @return 具有指定值的 {@code UUID}
|
||||
* @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常
|
||||
*
|
||||
*/
|
||||
public static UUID fromString(String name) {
|
||||
String[] components = name.split("-");
|
||||
@@ -247,6 +247,7 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。<br>
|
||||
* 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。
|
||||
*
|
||||
* @return 时间戳值
|
||||
* @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。
|
||||
*/
|
||||
public long timestamp() throws UnsupportedOperationException {
|
||||
@@ -265,7 +266,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。
|
||||
*
|
||||
* @return 此 {@code UUID} 的时钟序列
|
||||
*
|
||||
* @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1
|
||||
*/
|
||||
public int clockSequence() throws UnsupportedOperationException {
|
||||
@@ -283,7 +283,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。
|
||||
*
|
||||
* @return 此 {@code UUID} 的节点值
|
||||
*
|
||||
* @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1
|
||||
*/
|
||||
public long node() throws UnsupportedOperationException {
|
||||
@@ -312,8 +311,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* </blockquote>
|
||||
*
|
||||
* @return 此{@code UUID} 的字符串表现形式
|
||||
* @see #toString(boolean)
|
||||
*/
|
||||
@@ -341,8 +338,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* </blockquote>
|
||||
*
|
||||
* @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串
|
||||
* @return 此{@code UUID} 的字符串表现形式
|
||||
*/
|
||||
@@ -390,7 +385,6 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。
|
||||
*
|
||||
* @param obj 要与之比较的对象
|
||||
*
|
||||
* @return 如果对象相同,则返回 {@code true};否则返回 {@code false}
|
||||
*/
|
||||
public boolean equals(Object obj) {
|
||||
@@ -410,9 +404,7 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
* 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。
|
||||
*
|
||||
* @param val 与此 UUID 比较的 UUID
|
||||
*
|
||||
* @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。
|
||||
*
|
||||
*/
|
||||
public int compareTo(UUID val) {
|
||||
// The ordering is intentionally set up so that the UUIDs
|
||||
@@ -425,10 +417,11 @@ public final class UUID implements java.io.Serializable, Comparable<UUID> {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------------------------------- Private method start
|
||||
|
||||
/**
|
||||
* 返回指定数字对应的hex值
|
||||
*
|
||||
* @param val 值
|
||||
* @param val 值
|
||||
* @param digits 位
|
||||
* @return 值
|
||||
*/
|
||||
|
||||
@@ -15,46 +15,79 @@ import cn.hutool.core.util.StrUtil;
|
||||
* 字段验证器
|
||||
*
|
||||
* @author Looly
|
||||
*
|
||||
*/
|
||||
public class Validator {
|
||||
|
||||
private Validator() {
|
||||
}
|
||||
|
||||
/** 英文字母 、数字和下划线 */
|
||||
/**
|
||||
* 英文字母 、数字和下划线
|
||||
*/
|
||||
public final static Pattern GENERAL = PatternPool.GENERAL;
|
||||
/** 数字 */
|
||||
/**
|
||||
* 数字
|
||||
*/
|
||||
public final static Pattern NUMBERS = PatternPool.NUMBERS;
|
||||
/** 分组 */
|
||||
/**
|
||||
* 分组
|
||||
*/
|
||||
public final static Pattern GROUP_VAR = PatternPool.GROUP_VAR;
|
||||
/** IP v4 */
|
||||
/**
|
||||
* IP v4
|
||||
*/
|
||||
public final static Pattern IPV4 = PatternPool.IPV4;
|
||||
/** IP v6 */
|
||||
/**
|
||||
* IP v6
|
||||
*/
|
||||
public final static Pattern IPV6 = PatternPool.IPV6;
|
||||
/** 货币 */
|
||||
/**
|
||||
* 货币
|
||||
*/
|
||||
public final static Pattern MONEY = PatternPool.MONEY;
|
||||
/** 邮件 */
|
||||
/**
|
||||
* 邮件
|
||||
*/
|
||||
public final static Pattern EMAIL = PatternPool.EMAIL;
|
||||
/** 移动电话 */
|
||||
/**
|
||||
* 移动电话
|
||||
*/
|
||||
public final static Pattern MOBILE = PatternPool.MOBILE;
|
||||
/** 身份证号码 */
|
||||
/**
|
||||
* 身份证号码
|
||||
*/
|
||||
public final static Pattern CITIZEN_ID = PatternPool.CITIZEN_ID;
|
||||
/** 邮编 */
|
||||
/**
|
||||
* 邮编
|
||||
*/
|
||||
public final static Pattern ZIP_CODE = PatternPool.ZIP_CODE;
|
||||
/** 生日 */
|
||||
/**
|
||||
* 生日
|
||||
*/
|
||||
public final static Pattern BIRTHDAY = PatternPool.BIRTHDAY;
|
||||
/** URL */
|
||||
/**
|
||||
* URL
|
||||
*/
|
||||
public final static Pattern URL = PatternPool.URL;
|
||||
/** Http URL */
|
||||
/**
|
||||
* Http URL
|
||||
*/
|
||||
public final static Pattern URL_HTTP = PatternPool.URL_HTTP;
|
||||
/** 中文字、英文字母、数字和下划线 */
|
||||
/**
|
||||
* 中文字、英文字母、数字和下划线
|
||||
*/
|
||||
public final static Pattern GENERAL_WITH_CHINESE = PatternPool.GENERAL_WITH_CHINESE;
|
||||
/** UUID */
|
||||
/**
|
||||
* UUID
|
||||
*/
|
||||
public final static Pattern UUID = PatternPool.UUID;
|
||||
/** 不带横线的UUID */
|
||||
/**
|
||||
* 不带横线的UUID
|
||||
*/
|
||||
public final static Pattern UUID_SIMPLE = PatternPool.UUID_SIMPLE;
|
||||
/** 中国车牌号码 */
|
||||
/**
|
||||
* 中国车牌号码
|
||||
*/
|
||||
public final static Pattern PLATE_NUMBER = PatternPool.PLATE_NUMBER;
|
||||
|
||||
/**
|
||||
@@ -82,9 +115,9 @@ public class Validator {
|
||||
/**
|
||||
* 检查指定值是否为<code>true</code>
|
||||
*
|
||||
* @param value 值
|
||||
* @param value 值
|
||||
* @param errorMsgTemplate 错误消息内容模板(变量使用{}表示)
|
||||
* @param params 模板中变量替换后的值
|
||||
* @param params 模板中变量替换后的值
|
||||
* @return 检查过后的值
|
||||
* @throws ValidateException 检查不满足条件抛出的异常
|
||||
* @since 4.4.5
|
||||
@@ -99,9 +132,9 @@ public class Validator {
|
||||
/**
|
||||
* 检查指定值是否为<code>false</code>
|
||||
*
|
||||
* @param value 值
|
||||
* @param value 值
|
||||
* @param errorMsgTemplate 错误消息内容模板(变量使用{}表示)
|
||||
* @param params 模板中变量替换后的值
|
||||
* @param params 模板中变量替换后的值
|
||||
* @return 检查过后的值
|
||||
* @throws ValidateException 检查不满足条件抛出的异常
|
||||
* @since 4.4.5
|
||||
@@ -136,10 +169,10 @@ public class Validator {
|
||||
/**
|
||||
* 检查指定值是否为<code>null</code>
|
||||
*
|
||||
* @param <T> 被检查的对象类型
|
||||
* @param value 值
|
||||
* @param <T> 被检查的对象类型
|
||||
* @param value 值
|
||||
* @param errorMsgTemplate 错误消息内容模板(变量使用{}表示)
|
||||
* @param params 模板中变量替换后的值
|
||||
* @param params 模板中变量替换后的值
|
||||
* @return 检查过后的值
|
||||
* @throws ValidateException 检查不满足条件抛出的异常
|
||||
* @since 4.4.5
|
||||
@@ -154,10 +187,10 @@ public class Validator {
|
||||
/**
|
||||
* 检查指定值是否非<code>null</code>
|
||||
*
|
||||
* @param <T> 被检查的对象类型
|
||||
* @param value 值
|
||||
* @param <T> 被检查的对象类型
|
||||
* @param value 值
|
||||
* @param errorMsgTemplate 错误消息内容模板(变量使用{}表示)
|
||||
* @param params 模板中变量替换后的值
|
||||
* @param params 模板中变量替换后的值
|
||||
* @return 检查过后的值
|
||||
* @throws ValidateException 检查不满足条件抛出的异常
|
||||
*/
|
||||
@@ -194,7 +227,8 @@ public class Validator {
|
||||
* 验证是否为空,非空时抛出异常<br>
|
||||
* 对于String类型判定是否为empty(null 或 "")<br>
|
||||
*
|
||||
* @param value 值
|
||||
* @param <T> 值类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值,验证通过返回此值,空值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -210,7 +244,8 @@ public class Validator {
|
||||
* 验证是否为非空,为空时抛出异常<br>
|
||||
* 对于String类型判定是否为empty(null 或 "")<br>
|
||||
*
|
||||
* @param value 值
|
||||
* @param <T> 值类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值,验证通过返回此值,非空值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -237,8 +272,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否相等,不相等抛出异常<br>
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @param errorMsg 错误信息
|
||||
* @return 相同值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -253,8 +288,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否不等,相等抛出异常<br>
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @param errorMsg 错误信息
|
||||
* @throws ValidateException 验证异常
|
||||
*/
|
||||
@@ -269,8 +304,8 @@ public class Validator {
|
||||
* 当数据为空时抛出验证异常<br>
|
||||
* 当两值不等时抛出异常
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @param errorMsg 错误信息
|
||||
* @throws ValidateException 验证异常
|
||||
*/
|
||||
@@ -284,8 +319,8 @@ public class Validator {
|
||||
* 当数据为空时抛出验证异常<br>
|
||||
* 当两值相等时抛出异常
|
||||
*
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @param t1 对象1
|
||||
* @param t2 对象2
|
||||
* @param errorMsg 错误信息
|
||||
* @throws ValidateException 验证异常
|
||||
*/
|
||||
@@ -309,9 +344,9 @@ public class Validator {
|
||||
* 通过正则表达式验证<br>
|
||||
* 不符合正则抛出{@link ValidateException} 异常
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param regex 正则
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param regex 正则
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -327,7 +362,7 @@ public class Validator {
|
||||
* 通过正则表达式验证
|
||||
*
|
||||
* @param pattern 正则模式
|
||||
* @param value 值
|
||||
* @param value 值
|
||||
* @return 是否匹配正则
|
||||
*/
|
||||
public static boolean isMactchRegex(Pattern pattern, CharSequence value) {
|
||||
@@ -347,8 +382,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为英文字母 、数字和下划线
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -364,8 +399,8 @@ public class Validator {
|
||||
* 验证是否为给定长度范围的英文字母 、数字和下划线
|
||||
*
|
||||
* @param value 值
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param max 最大长度,0或负数表示不限制最大长度
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param max 最大长度,0或负数表示不限制最大长度
|
||||
* @return 是否为给定长度范围的英文字母 、数字和下划线
|
||||
*/
|
||||
public static boolean isGeneral(CharSequence value, int min, int max) {
|
||||
@@ -382,10 +417,10 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为给定长度范围的英文字母 、数字和下划线
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param max 最大长度,0或负数表示不限制最大长度
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param max 最大长度,0或负数表示不限制最大长度
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -401,7 +436,7 @@ public class Validator {
|
||||
* 验证是否为给定最小长度的英文字母 、数字和下划线
|
||||
*
|
||||
* @param value 值
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @return 是否为给定最小长度的英文字母 、数字和下划线
|
||||
*/
|
||||
public static boolean isGeneral(CharSequence value, int min) {
|
||||
@@ -411,9 +446,9 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为给定最小长度的英文字母 、数字和下划线
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param min 最小长度,负数自动识别为0
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -441,8 +476,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否全部为字母组成,包括大写和小写字母和汉字
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -474,8 +509,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证字符串是否全部为大写字母
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -507,8 +542,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证字符串是否全部为小写字母
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -534,7 +569,7 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为数字
|
||||
*
|
||||
* @param value 表单值
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -560,8 +595,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为字母(包括大写和小写字母)
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -587,8 +622,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为货币
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -614,8 +649,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为邮政编码(中国)
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -640,8 +675,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为可用邮箱地址
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -666,8 +701,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为手机号码(中国)
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -694,8 +729,8 @@ public class Validator {
|
||||
* 验证是否为身份证号码(18位中国)<br>
|
||||
* 出生日期只支持到到2999年
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -710,9 +745,9 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为生日
|
||||
*
|
||||
* @param year 年,从1900年开始计算
|
||||
* @param year 年,从1900年开始计算
|
||||
* @param month 月,从1开始计数
|
||||
* @param day 日,从1开始计数
|
||||
* @param day 日,从1开始计数
|
||||
* @return 是否为生日
|
||||
*/
|
||||
public static boolean isBirthday(int year, int month, int day) {
|
||||
@@ -772,8 +807,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证验证是否为生日
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -798,8 +833,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为IPV4地址
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -824,8 +859,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为IPV6地址
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -851,8 +886,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为MAC地址
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -879,8 +914,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为中国车牌号
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -911,8 +946,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为URL
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -937,8 +972,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为汉字
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 表单值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -963,8 +998,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为中文字、英文字母、数字和下划线
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -991,8 +1026,8 @@ public class Validator {
|
||||
* 验证是否为UUID<br>
|
||||
* 包括带横线标准格式和不带横线的简单模式
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -1018,8 +1053,8 @@ public class Validator {
|
||||
/**
|
||||
* 验证是否为Hex(16进制)字符串
|
||||
*
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param <T> 字符串类型
|
||||
* @param value 值
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @return 验证后的值
|
||||
* @throws ValidateException 验证异常
|
||||
@@ -1036,8 +1071,8 @@ public class Validator {
|
||||
* 检查给定的数字是否在指定范围内
|
||||
*
|
||||
* @param value 值
|
||||
* @param min 最小值(包含)
|
||||
* @param max 最大值(包含)
|
||||
* @param min 最小值(包含)
|
||||
* @param max 最大值(包含)
|
||||
* @return 是否满足
|
||||
* @since 4.1.10
|
||||
*/
|
||||
@@ -1052,9 +1087,9 @@ public class Validator {
|
||||
/**
|
||||
* 检查给定的数字是否在指定范围内
|
||||
*
|
||||
* @param value 值
|
||||
* @param min 最小值(包含)
|
||||
* @param max 最大值(包含)
|
||||
* @param value 值
|
||||
* @param min 最小值(包含)
|
||||
* @param max 最大值(包含)
|
||||
* @param errorMsg 验证错误的信息
|
||||
* @throws ValidateException 验证异常
|
||||
* @since 4.1.10
|
||||
|
||||
@@ -37,6 +37,7 @@ public class WeightRandom<T> implements Serializable {
|
||||
/**
|
||||
* 创建权重随机获取器
|
||||
*
|
||||
* @param <T> 权重随机获取的对象类型
|
||||
* @return {@link WeightRandom}
|
||||
*/
|
||||
public static <T> WeightRandom<T> create() {
|
||||
@@ -99,7 +100,7 @@ public class WeightRandom<T> implements Serializable {
|
||||
* @return this
|
||||
*/
|
||||
public WeightRandom<T> add(T obj, double weight) {
|
||||
return add(new WeightObj<T>(obj, weight));
|
||||
return add(new WeightObj<>(obj, weight));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -226,10 +227,7 @@ public class WeightRandom<T> implements Serializable {
|
||||
} else if (!this.obj.equals(other.obj)) {
|
||||
return false;
|
||||
}
|
||||
if (Double.doubleToLongBits(weight) != Double.doubleToLongBits(other.weight)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
return Double.doubleToLongBits(weight) == Double.doubleToLongBits(other.weight);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ public class MapProxy extends OptNullBasicTypeFromObjectGetter<Object> implement
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
|
||||
public Object invoke(Object proxy, Method method, Object[] args) {
|
||||
final Class<?>[] parameterTypes = method.getParameterTypes();
|
||||
if (ArrayUtil.isEmpty(parameterTypes)) {
|
||||
final Class<?> returnType = method.getReturnType();
|
||||
@@ -167,6 +167,7 @@ public class MapProxy extends OptNullBasicTypeFromObjectGetter<Object> implement
|
||||
/**
|
||||
* 将Map代理为指定接口的动态代理对象
|
||||
*
|
||||
* @param <T> 代理的Bean类型
|
||||
* @param interfaceClass 接口
|
||||
* @return 代理对象
|
||||
* @since 4.5.2
|
||||
|
||||
@@ -22,9 +22,13 @@ import cn.hutool.core.util.StrUtil;
|
||||
*/
|
||||
public class MapUtil {
|
||||
|
||||
/** 默认初始大小 */
|
||||
/**
|
||||
* 默认初始大小
|
||||
*/
|
||||
public static final int DEFAULT_INITIAL_CAPACITY = 16;
|
||||
/** 默认增长因子,当Map的size达到 容量*增长因子时,开始扩充Map */
|
||||
/**
|
||||
* 默认增长因子,当Map的size达到 容量*增长因子时,开始扩充Map
|
||||
*/
|
||||
public static final float DEFAULT_LOAD_FACTOR = 0.75f;
|
||||
|
||||
/**
|
||||
@@ -58,25 +62,26 @@ public class MapUtil {
|
||||
* @since 4.6.3
|
||||
*/
|
||||
public static <K, V> Map<K, V> emptyIfNull(Map<K, V> set) {
|
||||
return (null == set) ? Collections.<K, V>emptyMap() : set;
|
||||
return (null == set) ? Collections.emptyMap() : set;
|
||||
}
|
||||
|
||||
/**
|
||||
* 如果给定Map为空,返回默认Map
|
||||
*
|
||||
* @param <T> 集合类型
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param <T> 集合类型
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param defaultMap 默认Map
|
||||
* @return 非空(empty)的原Map或默认Map
|
||||
* @since 4.6.9
|
||||
*/
|
||||
public static <T extends Map<K, V>, K, V> T defaultIfEmpty(T map, T defaultMap){
|
||||
public static <T extends Map<K, V>, K, V> T defaultIfEmpty(T map, T defaultMap) {
|
||||
return isEmpty(map) ? defaultMap : map;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------- new HashMap
|
||||
|
||||
/**
|
||||
* 新建一个HashMap
|
||||
*
|
||||
@@ -91,23 +96,23 @@ public class MapUtil {
|
||||
/**
|
||||
* 新建一个HashMap
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param size 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75 + 1
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param size 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75 + 1
|
||||
* @param isOrder Map的Key是否有序,有序返回 {@link LinkedHashMap},否则返回 {@link HashMap}
|
||||
* @return HashMap对象
|
||||
* @since 3.0.4
|
||||
*/
|
||||
public static <K, V> HashMap<K, V> newHashMap(int size, boolean isOrder) {
|
||||
int initialCapacity = (int) (size / DEFAULT_LOAD_FACTOR) + 1;
|
||||
return isOrder ? new LinkedHashMap<K, V>(initialCapacity) : new HashMap<K, V>(initialCapacity);
|
||||
return isOrder ? new LinkedHashMap<>(initialCapacity) : new HashMap<>(initialCapacity);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新建一个HashMap
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param size 初始大小,由于默认负载因子0.75,传入的size会实际初始大小为size / 0.75 + 1
|
||||
* @return HashMap对象
|
||||
*/
|
||||
@@ -118,8 +123,8 @@ public class MapUtil {
|
||||
/**
|
||||
* 新建一个HashMap
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param isOrder Map的Key是否有序,有序返回 {@link LinkedHashMap},否则返回 {@link HashMap}
|
||||
* @return HashMap对象
|
||||
*/
|
||||
@@ -130,6 +135,8 @@ public class MapUtil {
|
||||
/**
|
||||
* 新建TreeMap,Key有序的Map
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param comparator Key比较器
|
||||
* @return TreeMap
|
||||
* @since 3.2.3
|
||||
@@ -141,7 +148,9 @@ public class MapUtil {
|
||||
/**
|
||||
* 新建TreeMap,Key有序的Map
|
||||
*
|
||||
* @param map Map
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map Map
|
||||
* @param comparator Key比较器
|
||||
* @return TreeMap
|
||||
* @since 3.2.3
|
||||
@@ -157,6 +166,9 @@ public class MapUtil {
|
||||
/**
|
||||
* 创建键不重复Map
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param size 初始容量
|
||||
* @return {@link IdentityHashMap}
|
||||
* @since 4.5.7
|
||||
*/
|
||||
@@ -179,8 +191,8 @@ public class MapUtil {
|
||||
* 新建一个ConcurrentHashMap
|
||||
*
|
||||
* @param size 初始容量,当传入的容量小于等于0时,容量为{@link MapUtil#DEFAULT_INITIAL_CAPACITY}
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @return ConcurrentHashMap
|
||||
*/
|
||||
public static <K, V> ConcurrentHashMap<K, V> newConcurrentHashMap(int size) {
|
||||
@@ -189,7 +201,7 @@ public class MapUtil {
|
||||
}
|
||||
|
||||
/**
|
||||
* 传入一个Map将其转化为ConcurrentHashMap类型
|
||||
* 传入一个Map将其转化为ConcurrentHashMap类型
|
||||
*
|
||||
* @param map map
|
||||
* @param <K> key的类型
|
||||
@@ -197,7 +209,7 @@ public class MapUtil {
|
||||
* @return ConcurrentHashMap
|
||||
*/
|
||||
public static <K, V> ConcurrentHashMap<K, V> newConcurrentHashMap(Map<K, V> map) {
|
||||
if(isEmpty(map)) {
|
||||
if (isEmpty(map)) {
|
||||
return new ConcurrentHashMap<>(DEFAULT_INITIAL_CAPACITY);
|
||||
}
|
||||
return new ConcurrentHashMap<>(map);
|
||||
@@ -207,8 +219,8 @@ public class MapUtil {
|
||||
* 创建Map<br>
|
||||
* 传入抽象Map{@link AbstractMap}和{@link Map}类将默认创建{@link HashMap}
|
||||
*
|
||||
* @param <K> map键类型
|
||||
* @param <V> map值类型
|
||||
* @param <K> map键类型
|
||||
* @param <V> map值类型
|
||||
* @param mapType map类型
|
||||
* @return {@link Map}实例
|
||||
*/
|
||||
@@ -222,12 +234,13 @@ public class MapUtil {
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------- value of
|
||||
|
||||
/**
|
||||
* 将单一键值对转换为Map
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param key 键
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param key 键
|
||||
* @param value 值
|
||||
* @return {@link HashMap}
|
||||
*/
|
||||
@@ -238,10 +251,10 @@ public class MapUtil {
|
||||
/**
|
||||
* 将单一键值对转换为Map
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param key 键
|
||||
* @param value 值
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param key 键
|
||||
* @param value 值
|
||||
* @param isOrder 是否有序
|
||||
* @return {@link HashMap}
|
||||
*/
|
||||
@@ -264,7 +277,7 @@ public class MapUtil {
|
||||
* <pre>
|
||||
* Map<Object, Object> colorMap = MapUtil.of(new String[][] { { "RED", "#FF0000" }, { "GREEN", "#00FF00" }, { "BLUE", "#0000FF" } });
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
* 参考:commons-lang
|
||||
*
|
||||
* @param array 数组。元素类型为Map.Entry、数组、Iterable、Iterator
|
||||
@@ -326,7 +339,7 @@ public class MapUtil {
|
||||
* {a: 4}
|
||||
* ]
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
* 结果是:
|
||||
*
|
||||
* <pre>
|
||||
@@ -337,8 +350,8 @@ public class MapUtil {
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param mapList Map列表
|
||||
* @return Map
|
||||
*/
|
||||
@@ -380,7 +393,7 @@ public class MapUtil {
|
||||
* c: [1]
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
* 结果是:
|
||||
*
|
||||
* <pre>
|
||||
@@ -392,8 +405,8 @@ public class MapUtil {
|
||||
* ]
|
||||
* </pre>
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param listMap 列表Map
|
||||
* @return Map列表
|
||||
*/
|
||||
@@ -435,6 +448,8 @@ public class MapUtil {
|
||||
* 将已知Map转换为key为驼峰风格的Map<br>
|
||||
* 如果KEY为非String类型,保留原值
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map 原Map
|
||||
* @return 驼峰风格Map
|
||||
* @since 3.3.1
|
||||
@@ -446,7 +461,7 @@ public class MapUtil {
|
||||
/**
|
||||
* 将键值对转换为二维数组,第一维是key,第二纬是value
|
||||
*
|
||||
* @param map Map<?, ?> map
|
||||
* @param map map
|
||||
* @return 数组
|
||||
* @since 4.1.9
|
||||
*/
|
||||
@@ -468,13 +483,14 @@ public class MapUtil {
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------- join
|
||||
|
||||
/**
|
||||
* 将map转成字符串
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param separator entry之间的连接符
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param separator entry之间的连接符
|
||||
* @param keyValueSeparator kv之间的连接符
|
||||
* @return 连接字符串
|
||||
* @since 3.1.1
|
||||
@@ -486,10 +502,10 @@ public class MapUtil {
|
||||
/**
|
||||
* 将map转成字符串,忽略null的键和值
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param separator entry之间的连接符
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param separator entry之间的连接符
|
||||
* @param keyValueSeparator kv之间的连接符
|
||||
* @return 连接后的字符串
|
||||
* @since 3.1.1
|
||||
@@ -501,12 +517,12 @@ public class MapUtil {
|
||||
/**
|
||||
* 将map转成字符串
|
||||
*
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param separator entry之间的连接符
|
||||
* @param <K> 键类型
|
||||
* @param <V> 值类型
|
||||
* @param map Map
|
||||
* @param separator entry之间的连接符
|
||||
* @param keyValueSeparator kv之间的连接符
|
||||
* @param isIgnoreNull 是否忽略null的键和值
|
||||
* @param isIgnoreNull 是否忽略null的键和值
|
||||
* @return 连接后的字符串
|
||||
* @since 3.1.1
|
||||
*/
|
||||
@@ -527,6 +543,7 @@ public class MapUtil {
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------- filter
|
||||
|
||||
/**
|
||||
* 过滤<br>
|
||||
* 过滤过程通过传入的Editor实现来返回需要的元素内容,这个Editor实现可以实现以下功能:
|
||||
@@ -536,9 +553,9 @@ public class MapUtil {
|
||||
* 2、修改元素对象,返回集合中为修改后的对象
|
||||
* </pre>
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map Map
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map Map
|
||||
* @param editor 编辑器接口
|
||||
* @return 过滤后的Map
|
||||
*/
|
||||
@@ -571,9 +588,9 @@ public class MapUtil {
|
||||
* 1、过滤出需要的对象,如果返回null表示这个元素对象抛弃
|
||||
* </pre>
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map Map
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map Map
|
||||
* @param filter 编辑器接口
|
||||
* @return 过滤后的Map
|
||||
* @since 3.1.0
|
||||
@@ -600,9 +617,9 @@ public class MapUtil {
|
||||
/**
|
||||
* 过滤Map保留指定键值对,如果键不存在跳过
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map 原始Map
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map 原始Map
|
||||
* @param keys 键列表
|
||||
* @return Map 结果,结果的Map类型与原Map保持一致
|
||||
* @since 4.0.10
|
||||
@@ -685,10 +702,12 @@ public class MapUtil {
|
||||
/**
|
||||
* 排序已有Map,Key有序的Map,使用默认Key排序方式(字母顺序)
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map Map
|
||||
* @return TreeMap
|
||||
* @since 4.0.1
|
||||
* @see #newTreeMap(Map, Comparator)
|
||||
* @since 4.0.1
|
||||
*/
|
||||
public static <K, V> TreeMap<K, V> sort(Map<K, V> map) {
|
||||
return sort(map, null);
|
||||
@@ -697,11 +716,13 @@ public class MapUtil {
|
||||
/**
|
||||
* 排序已有Map,Key有序的Map
|
||||
*
|
||||
* @param map Map
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map Map
|
||||
* @param comparator Key比较器
|
||||
* @return TreeMap
|
||||
* @since 4.0.1
|
||||
* @see #newTreeMap(Map, Comparator)
|
||||
* @since 4.0.1
|
||||
*/
|
||||
public static <K, V> TreeMap<K, V> sort(Map<K, V> map, Comparator<? super K> comparator) {
|
||||
TreeMap<K, V> result;
|
||||
@@ -734,6 +755,8 @@ public class MapUtil {
|
||||
* 创建Map包装类MapWrapper<br>
|
||||
* {@link MapWrapper}对Map做一次包装
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map 被代理的Map
|
||||
* @return {@link MapWrapper}
|
||||
* @since 4.5.4
|
||||
@@ -743,6 +766,7 @@ public class MapUtil {
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------- builder
|
||||
|
||||
/**
|
||||
* 创建链接调用map
|
||||
*
|
||||
@@ -751,7 +775,7 @@ public class MapUtil {
|
||||
* @return map创建类
|
||||
*/
|
||||
public static <K, V> MapBuilder<K, V> builder() {
|
||||
return builder(new HashMap<K, V>());
|
||||
return builder(new HashMap<>());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -771,8 +795,8 @@ public class MapUtil {
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param k key
|
||||
* @param v value
|
||||
* @param k key
|
||||
* @param v value
|
||||
* @return map创建类
|
||||
*/
|
||||
public static <K, V> MapBuilder<K, V> builder(K k, V v) {
|
||||
@@ -782,9 +806,9 @@ public class MapUtil {
|
||||
/**
|
||||
* 获取Map的部分key生成新的Map
|
||||
*
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map Map
|
||||
* @param <K> Key类型
|
||||
* @param <V> Value类型
|
||||
* @param map Map
|
||||
* @param keys 键列表
|
||||
* @return 新Map,只包含指定的key
|
||||
* @since 4.0.6
|
||||
@@ -911,9 +935,9 @@ public class MapUtil {
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为指定类型
|
||||
*
|
||||
* @param <T> 目标值类型
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @param <T> 目标值类型
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @param type 值类型
|
||||
* @return 值
|
||||
* @since 4.0.6
|
||||
@@ -925,9 +949,9 @@ public class MapUtil {
|
||||
/**
|
||||
* 获取Map指定key的值,并转换为指定类型
|
||||
*
|
||||
* @param <T> 目标值类型
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @param <T> 目标值类型
|
||||
* @param map Map
|
||||
* @param key 键
|
||||
* @param type 值类型
|
||||
* @return 值
|
||||
* @since 4.5.12
|
||||
@@ -941,7 +965,9 @@ public class MapUtil {
|
||||
* 实现方式为一处然后重新put,当旧的key不存在直接返回<br>
|
||||
* 当新的key存在,抛出{@link IllegalArgumentException} 异常
|
||||
*
|
||||
* @param map Map
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map Map
|
||||
* @param oldKey 原键
|
||||
* @param newKey 新键
|
||||
* @return map
|
||||
@@ -962,6 +988,8 @@ public class MapUtil {
|
||||
* 去除Map中值为{@code null}的键值对<br>
|
||||
* 注意:此方法在传入的Map上直接修改。
|
||||
*
|
||||
* @param <K> key的类型
|
||||
* @param <V> value的类型
|
||||
* @param map Map
|
||||
* @return map
|
||||
* @since 4.6.5
|
||||
@@ -973,9 +1001,9 @@ public class MapUtil {
|
||||
|
||||
final Iterator<Entry<K, V>> iter = map.entrySet().iterator();
|
||||
Entry<K, V> entry;
|
||||
while(iter.hasNext()) {
|
||||
while (iter.hasNext()) {
|
||||
entry = iter.next();
|
||||
if(null == entry.getValue()) {
|
||||
if (null == entry.getValue()) {
|
||||
iter.remove();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ public class LocalPortGenerater implements Serializable{
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param beginPort
|
||||
* @param beginPort 起始端口号
|
||||
*/
|
||||
public LocalPortGenerater(int beginPort) {
|
||||
alternativePort = new AtomicInteger(beginPort);
|
||||
|
||||
@@ -175,6 +175,7 @@ public class NetUtil {
|
||||
* 获取多个本地可用端口<br>
|
||||
* 来自org.springframework.util.SocketUtils
|
||||
*
|
||||
* @param numRequested 尝试次数
|
||||
* @param minPort 端口最小值(包含)
|
||||
* @param maxPort 端口最大值(包含)
|
||||
* @return 可用的端口
|
||||
@@ -311,7 +312,7 @@ public class NetUtil {
|
||||
return null;
|
||||
}
|
||||
|
||||
return CollectionUtil.addAll(new ArrayList<NetworkInterface>(), networkInterfaces);
|
||||
return CollectionUtil.addAll(new ArrayList<>(), networkInterfaces);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -17,7 +17,7 @@ import cn.hutool.core.util.HexUtil;
|
||||
* 1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码;
|
||||
* 2.将空格转换为%20 ;
|
||||
* 3.将非文本内容转换成"%xy"的形式,xy是两位16进制的数值;
|
||||
* 4.在每个 name=value 对之间放置 & 符号。
|
||||
* 4.在每个 name=value 对之间放置 & 符号。
|
||||
* </pre>
|
||||
*
|
||||
* @author looly,
|
||||
@@ -34,7 +34,7 @@ public class URLEncoder implements Serializable{
|
||||
* <pre>
|
||||
* pchar = unreserved(不处理) / pct-encoded / sub-delims(子分隔符) / ":" / "@"
|
||||
* unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
|
||||
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
|
||||
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
|
||||
* </pre>
|
||||
*/
|
||||
public static final URLEncoder DEFAULT = createDefault();
|
||||
@@ -46,7 +46,7 @@ public class URLEncoder implements Serializable{
|
||||
* <pre>
|
||||
* 0x20 ' ' =》 '+'
|
||||
* 0x2A, 0x2D, 0x2E, 0x30 to 0x39, 0x41 to 0x5A, 0x5F, 0x61 to 0x7A as-is
|
||||
* '*', '-', '.', '0' to '9', 'A' to 'Z', '_', 'a' to 'z' Also '=' and '&' 不编码
|
||||
* '*', '-', '.', '0' to '9', 'A' to 'Z', '_', 'a' to 'z' Also '=' and '&' 不编码
|
||||
* 其它编码为 %nn 形式
|
||||
* </pre>
|
||||
*
|
||||
@@ -61,7 +61,7 @@ public class URLEncoder implements Serializable{
|
||||
* <pre>
|
||||
* pchar = unreserved(不处理) / pct-encoded / sub-delims(子分隔符) / ":" / "@"
|
||||
* unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
|
||||
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
|
||||
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
|
||||
* </pre>
|
||||
*
|
||||
* @return {@link URLEncoder}
|
||||
@@ -100,7 +100,7 @@ public class URLEncoder implements Serializable{
|
||||
* <pre>
|
||||
* 0x20 ' ' =》 '+'
|
||||
* 0x2A, 0x2D, 0x2E, 0x30 to 0x39, 0x41 to 0x5A, 0x5F, 0x61 to 0x7A as-is
|
||||
* '*', '-', '.', '0' to '9', 'A' to 'Z', '_', 'a' to 'z' Also '=' and '&' 不编码
|
||||
* '*', '-', '.', '0' to '9', 'A' to 'Z', '_', 'a' to 'z' Also '=' and '&' 不编码
|
||||
* 其它编码为 %nn 形式
|
||||
* </pre>
|
||||
*
|
||||
|
||||
@@ -97,7 +97,7 @@ public class ClipboardUtil {
|
||||
/**
|
||||
* 从剪贴板的{@link Transferable}获取文本
|
||||
*
|
||||
* @param content
|
||||
* @param content {@link Transferable}
|
||||
* @return 文本
|
||||
* @since 4.5.6
|
||||
*/
|
||||
@@ -126,7 +126,7 @@ public class ClipboardUtil {
|
||||
/**
|
||||
* 从剪贴板的{@link Transferable}获取图片
|
||||
*
|
||||
* @param content
|
||||
* @param content {@link Transferable}
|
||||
* @return 图片
|
||||
* @since 4.5.6
|
||||
*/
|
||||
|
||||
@@ -57,7 +57,7 @@ public class Simhash {
|
||||
this.hammingThresh = hammingThresh;
|
||||
this.storage = new ArrayList<>(fracCount);
|
||||
for (int i = 0; i < fracCount; i++) {
|
||||
storage.add(new HashMap<String, List<Long>>());
|
||||
storage.add(new HashMap<>());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ public class Simhash {
|
||||
}
|
||||
|
||||
/**
|
||||
* 按照(frac, <simhash, content>)索引进行存储
|
||||
* 按照(frac, 《simhash, content》)索引进行存储
|
||||
*
|
||||
* @param simhash Simhash值
|
||||
*/
|
||||
@@ -146,7 +146,7 @@ public class Simhash {
|
||||
if (fracMap.containsKey(frac)) {
|
||||
fracMap.get(frac).add(simhash);
|
||||
} else {
|
||||
final List<Long> ls = new ArrayList<Long>();
|
||||
final List<Long> ls = new ArrayList<>();
|
||||
ls.add(simhash);
|
||||
fracMap.put(frac, ls);
|
||||
}
|
||||
@@ -184,7 +184,7 @@ public class Simhash {
|
||||
final int bitNum = this.bitNum;
|
||||
final int fracBitNum = this.fracBitNum;
|
||||
|
||||
final List<String> ls = new ArrayList<String>();
|
||||
final List<String> ls = new ArrayList<>();
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < bitNum; i++) {
|
||||
sb.append(simhash >> i & 1);
|
||||
|
||||
@@ -155,7 +155,8 @@ public class StrBuilder implements CharSequence, Appendable, Serializable {
|
||||
/**
|
||||
* 追加对象,对象会被转换为字符串
|
||||
*
|
||||
* @param obj 对象
|
||||
* @param index 插入位置
|
||||
* @param obj 对象
|
||||
* @return this
|
||||
*/
|
||||
public StrBuilder insert(int index, Object obj) {
|
||||
@@ -392,7 +393,7 @@ public class StrBuilder implements CharSequence, Appendable, Serializable {
|
||||
* @param start 开始位置,负数按照0处理(包括)
|
||||
* @param end 结束位置,超出最大长度按照最大长度处理(不包括)
|
||||
* @return this
|
||||
* @throws StringIndexOutOfBoundsException 当start > end抛出此异常
|
||||
* @throws StringIndexOutOfBoundsException 当start > end抛出此异常
|
||||
*/
|
||||
public StrBuilder del(int start, int end) throws StringIndexOutOfBoundsException {
|
||||
if (start < 0) {
|
||||
|
||||
@@ -13,6 +13,7 @@ import java.nio.charset.Charset;
|
||||
public class CsvUtil {
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------- Reader
|
||||
|
||||
/**
|
||||
* 获取CSV读取器
|
||||
*
|
||||
@@ -33,11 +34,13 @@ public class CsvUtil {
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------- Writer
|
||||
|
||||
/**
|
||||
* 获取CSV生成器(写出器),使用默认配置,覆盖已有文件(如果存在)
|
||||
*
|
||||
* @param filePath File CSV文件路径
|
||||
* @param charset 编码
|
||||
* @param charset 编码
|
||||
* @return {@link CsvWriter}
|
||||
*/
|
||||
public static CsvWriter getWriter(String filePath, Charset charset) {
|
||||
return new CsvWriter(filePath, charset);
|
||||
@@ -46,8 +49,9 @@ public class CsvUtil {
|
||||
/**
|
||||
* 获取CSV生成器(写出器),使用默认配置,覆盖已有文件(如果存在)
|
||||
*
|
||||
* @param file File CSV文件
|
||||
* @param file File CSV文件
|
||||
* @param charset 编码
|
||||
* @return {@link CsvWriter}
|
||||
*/
|
||||
public static CsvWriter getWriter(File file, Charset charset) {
|
||||
return new CsvWriter(file, charset);
|
||||
@@ -57,8 +61,9 @@ public class CsvUtil {
|
||||
* 获取CSV生成器(写出器),使用默认配置
|
||||
*
|
||||
* @param filePath File CSV文件路径
|
||||
* @param charset 编码
|
||||
* @param charset 编码
|
||||
* @param isAppend 是否追加
|
||||
* @return {@link CsvWriter}
|
||||
*/
|
||||
public static CsvWriter getWriter(String filePath, Charset charset, boolean isAppend) {
|
||||
return new CsvWriter(filePath, charset, isAppend);
|
||||
@@ -67,9 +72,10 @@ public class CsvUtil {
|
||||
/**
|
||||
* 获取CSV生成器(写出器),使用默认配置
|
||||
*
|
||||
* @param file File CSV文件
|
||||
* @param charset 编码
|
||||
* @param file File CSV文件
|
||||
* @param charset 编码
|
||||
* @param isAppend 是否追加
|
||||
* @return {@link CsvWriter}
|
||||
*/
|
||||
public static CsvWriter getWriter(File file, Charset charset, boolean isAppend) {
|
||||
return new CsvWriter(file, charset, isAppend);
|
||||
@@ -78,10 +84,11 @@ public class CsvUtil {
|
||||
/**
|
||||
* 获取CSV生成器(写出器)
|
||||
*
|
||||
* @param file File CSV文件
|
||||
* @param charset 编码
|
||||
* @param file File CSV文件
|
||||
* @param charset 编码
|
||||
* @param isAppend 是否追加
|
||||
* @param config 写出配置,null则使用默认配置
|
||||
* @param config 写出配置,null则使用默认配置
|
||||
* @return {@link CsvWriter}
|
||||
*/
|
||||
public static CsvWriter getWriter(File file, Charset charset, boolean isAppend, CsvWriteConfig config) {
|
||||
return new CsvWriter(file, charset, isAppend, config);
|
||||
|
||||
@@ -9,7 +9,7 @@ import cn.hutool.core.date.TimeInterval;
|
||||
* ps:
|
||||
* //模拟1000个线程并发
|
||||
* ConcurrencyTester ct = new ConcurrencyTester(1000);
|
||||
* ct.test(() -> {
|
||||
* ct.test(() -> {
|
||||
* // 需要并发测试的业务代码
|
||||
* });
|
||||
* </pre>
|
||||
@@ -30,6 +30,7 @@ public class ConcurrencyTester {
|
||||
* 执行测试
|
||||
*
|
||||
* @param runnable 要测试的内容
|
||||
* @return this
|
||||
*/
|
||||
public ConcurrencyTester test(Runnable runnable) {
|
||||
timeInterval.start();
|
||||
|
||||
@@ -16,7 +16,7 @@ import cn.hutool.core.exceptions.UtilException;
|
||||
* ps:
|
||||
* //模拟1000个线程并发
|
||||
* SyncFinisher sf = new SyncFinisher(1000);
|
||||
* concurrencyTestUtil.run(() -> {
|
||||
* concurrencyTestUtil.run(() -> {
|
||||
* // 需要并发测试的业务代码
|
||||
* });
|
||||
* </pre>
|
||||
@@ -46,7 +46,7 @@ public class SyncFinisher {
|
||||
this.beginLatch = new CountDownLatch(1);
|
||||
this.threadSize = threadSize;
|
||||
this.executorService = ThreadUtil.newExecutor(threadSize);
|
||||
this.workers = new LinkedHashSet<Worker>();
|
||||
this.workers = new LinkedHashSet<>();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -55,7 +55,7 @@ public class ThreadUtil {
|
||||
* 获得一个新的线程池<br>
|
||||
* 如果maximumPoolSize =》 corePoolSize,在没有新任务加入的情况下,多出的线程将最多保留60s
|
||||
*
|
||||
* @param corePoolSize 初始线程池大小
|
||||
* @param corePoolSize 初始线程池大小
|
||||
* @param maximumPoolSize 最大线程池大小
|
||||
* @return {@link ThreadPoolExecutor}
|
||||
*/
|
||||
@@ -68,7 +68,7 @@ public class ThreadUtil {
|
||||
* 传入阻塞系数,线程池的大小计算公式为:CPU可用核心数 / (1 - 阻塞因子)<br>
|
||||
* Blocking Coefficient(阻塞系数) = 阻塞时间/(阻塞时间+使用CPU的时间)<br>
|
||||
* 计算密集型任务的阻塞系数为0,而IO密集型任务的阻塞系数则接近于1。
|
||||
*
|
||||
* <p>
|
||||
* see: http://blog.csdn.net/partner4java/article/details/9417663
|
||||
*
|
||||
* @param blockingCoefficient 阻塞系数,阻塞因子介于0~1之间的数,阻塞因子越大,线程池中的线程数越多。
|
||||
@@ -118,7 +118,7 @@ public class ThreadUtil {
|
||||
* 执行有返回值的异步方法<br>
|
||||
* Future代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞
|
||||
*
|
||||
* @param <T> 回调对象类型
|
||||
* @param <T> 回调对象类型
|
||||
* @param task {@link Callable}
|
||||
* @return Future
|
||||
*/
|
||||
@@ -153,7 +153,7 @@ public class ThreadUtil {
|
||||
* 新建一个CompletionService,调用其submit方法可以异步执行多个任务,最后调用take方法按照完成的顺序获得其结果。<br>
|
||||
* 若未完成,则会阻塞
|
||||
*
|
||||
* @param <T> 回调对象类型
|
||||
* @param <T> 回调对象类型
|
||||
* @param executor 执行器 {@link ExecutorService}
|
||||
* @return CompletionService
|
||||
*/
|
||||
@@ -175,7 +175,7 @@ public class ThreadUtil {
|
||||
* 创建新线程,非守护线程,正常优先级,线程组与当前线程的线程组一致
|
||||
*
|
||||
* @param runnable {@link Runnable}
|
||||
* @param name 线程名
|
||||
* @param name 线程名
|
||||
* @return {@link Thread}
|
||||
* @since 3.1.2
|
||||
*/
|
||||
@@ -191,7 +191,7 @@ public class ThreadUtil {
|
||||
* 创建新线程
|
||||
*
|
||||
* @param runnable {@link Runnable}
|
||||
* @param name 线程名
|
||||
* @param name 线程名
|
||||
* @param isDaemon 是否守护线程
|
||||
* @return {@link Thread}
|
||||
* @since 4.1.2
|
||||
@@ -205,7 +205,7 @@ public class ThreadUtil {
|
||||
/**
|
||||
* 挂起当前线程
|
||||
*
|
||||
* @param timeout 挂起的时长
|
||||
* @param timeout 挂起的时长
|
||||
* @param timeUnit 时长单位
|
||||
* @return 被中断返回false,否则true
|
||||
*/
|
||||
@@ -240,9 +240,9 @@ public class ThreadUtil {
|
||||
/**
|
||||
* 考虑{@link Thread#sleep(long)}方法有可能时间不足给定毫秒数,此方法保证sleep时间不小于给定的毫秒数
|
||||
*
|
||||
* @see ThreadUtil#sleep(Number)
|
||||
* @param millis 给定的sleep时间
|
||||
* @return 被中断返回false,否则true
|
||||
* @see ThreadUtil#sleep(Number)
|
||||
*/
|
||||
public static boolean safeSleep(Number millis) {
|
||||
long millisLong = millis.longValue();
|
||||
@@ -282,7 +282,7 @@ public class ThreadUtil {
|
||||
/**
|
||||
* 创建本地线程对象
|
||||
*
|
||||
* @param <T> 持有对象类型
|
||||
* @param <T> 持有对象类型
|
||||
* @param isInheritable 是否为子线程提供从父线程那里继承的值
|
||||
* @return 本地线程
|
||||
*/
|
||||
@@ -326,7 +326,7 @@ public class ThreadUtil {
|
||||
* @param thread 线程
|
||||
*/
|
||||
public static void waitForDie(Thread thread) {
|
||||
if(null == thread){
|
||||
if (null == thread) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -395,8 +395,9 @@ public class ThreadUtil {
|
||||
/**
|
||||
* 创建线程工厂
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
* @param prefix 线程名前缀
|
||||
* @param isDaemon 是否守护线程
|
||||
* @return {@link ThreadFactory}
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public static ThreadFactory newNamedThreadFactory(String prefix, boolean isDaemon) {
|
||||
@@ -406,9 +407,10 @@ public class ThreadUtil {
|
||||
/**
|
||||
* 创建线程工厂
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
* @param prefix 线程名前缀
|
||||
* @param threadGroup 线程组,可以为null
|
||||
* @param isDaemon 是否守护线程
|
||||
* @param isDaemon 是否守护线程
|
||||
* @return {@link ThreadFactory}
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDaemon) {
|
||||
@@ -418,10 +420,11 @@ public class ThreadUtil {
|
||||
/**
|
||||
* 创建线程工厂
|
||||
*
|
||||
* @param prefix 线程名前缀
|
||||
* @param prefix 线程名前缀
|
||||
* @param threadGroup 线程组,可以为null
|
||||
* @param isDaemon 是否守护线程
|
||||
* @param handler 未捕获异常处理
|
||||
* @param isDaemon 是否守护线程
|
||||
* @param handler 未捕获异常处理
|
||||
* @return {@link ThreadFactory}
|
||||
* @since 4.0.0
|
||||
*/
|
||||
public static ThreadFactory newNamedThreadFactory(String prefix, ThreadGroup threadGroup, boolean isDaemon, UncaughtExceptionHandler handler) {
|
||||
@@ -451,7 +454,7 @@ public class ThreadUtil {
|
||||
* 结束后可调用{@link ConcurrencyTester#getInterval()} 方法获取执行时间
|
||||
*
|
||||
* @param threadSize 并发线程数
|
||||
* @param runnable 执行的逻辑实现
|
||||
* @param runnable 执行的逻辑实现
|
||||
* @return {@link ConcurrencyTester}
|
||||
* @since 4.5.8
|
||||
*/
|
||||
|
||||
@@ -829,6 +829,7 @@ public class ArrayUtil {
|
||||
/**
|
||||
* 去除{@code null} 元素
|
||||
*
|
||||
* @param <T> 数组元素类型
|
||||
* @param array 数组
|
||||
* @return 处理后的数组
|
||||
* @since 3.2.2
|
||||
@@ -846,6 +847,7 @@ public class ArrayUtil {
|
||||
/**
|
||||
* 去除{@code null}或者"" 元素
|
||||
*
|
||||
* @param <T> 数组元素类型
|
||||
* @param array 数组
|
||||
* @return 处理后的数组
|
||||
* @since 3.2.2
|
||||
@@ -862,6 +864,7 @@ public class ArrayUtil {
|
||||
/**
|
||||
* 去除{@code null}或者""或者空白字符串 元素
|
||||
*
|
||||
* @param <T> 数组元素类型
|
||||
* @param array 数组
|
||||
* @return 处理后的数组
|
||||
* @since 3.2.2
|
||||
@@ -1901,6 +1904,7 @@ public class ArrayUtil {
|
||||
/**
|
||||
* 获取子数组
|
||||
*
|
||||
* @param <T> 数组元素类型
|
||||
* @param array 数组
|
||||
* @param start 开始位置(包括)
|
||||
* @param end 结束位置(不包括)
|
||||
@@ -3886,6 +3890,7 @@ public class ArrayUtil {
|
||||
* 去重数组中的元素,去重后生成新的数组,原数组不变<br>
|
||||
* 此方法通过{@link LinkedHashSet} 去重
|
||||
*
|
||||
* @param <T> 数组元素类型
|
||||
* @param array 数组
|
||||
* @return 去重后的数组
|
||||
*/
|
||||
|
||||
@@ -53,13 +53,13 @@ public class EnumUtil {
|
||||
/**
|
||||
* 字符串转枚举,调用{@link Enum#valueOf(Class, String)}
|
||||
*
|
||||
* @param <T> 枚举类型泛型
|
||||
* @param <E> 枚举类型泛型
|
||||
* @param enumClass 枚举类
|
||||
* @param value 值
|
||||
* @param value 值
|
||||
* @return 枚举值
|
||||
* @since 4.1.13
|
||||
*/
|
||||
public static <T extends Enum<T>> T fromString(Class<T> enumClass, String value) {
|
||||
public static <E extends Enum<E>> E fromString(Class<E> enumClass, String value) {
|
||||
return Enum.valueOf(enumClass, value);
|
||||
}
|
||||
|
||||
@@ -67,28 +67,28 @@ public class EnumUtil {
|
||||
* 字符串转枚举,调用{@link Enum#valueOf(Class, String)}<br>
|
||||
* 如果无枚举值,返回默认值
|
||||
*
|
||||
* @param <T> 枚举类型泛型
|
||||
* @param enumClass 枚举类
|
||||
* @param value 值
|
||||
* @param <E> 枚举类型泛型
|
||||
* @param enumClass 枚举类
|
||||
* @param value 值
|
||||
* @param defaultValue 无对应枚举值返回的默认值
|
||||
* @return 枚举值
|
||||
* @since 4.5.18
|
||||
*/
|
||||
public static <T extends Enum<T>> T fromString(Class<T> enumClass, String value, T defaultValue) {
|
||||
public static <E extends Enum<E>> E fromString(Class<E> enumClass, String value, E defaultValue) {
|
||||
return ObjectUtil.defaultIfNull(fromStringQuietly(enumClass, value), defaultValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* 字符串转枚举,调用{@link Enum#valueOf(Class, String)},转换失败返回{@code null} 而非报错
|
||||
*
|
||||
* @param <T> 枚举类型泛型
|
||||
* @param <E> 枚举类型泛型
|
||||
* @param enumClass 枚举类
|
||||
* @param value 值
|
||||
* @param value 值
|
||||
* @return 枚举值
|
||||
* @since 4.5.18
|
||||
*/
|
||||
public static <T extends Enum<T>> T fromStringQuietly(Class<T> enumClass, String value) {
|
||||
if(null == enumClass || StrUtil.isBlank(value)) {
|
||||
public static <E extends Enum<E>> E fromStringQuietly(Class<E> enumClass, String value) {
|
||||
if (null == enumClass || StrUtil.isBlank(value)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -102,12 +102,13 @@ public class EnumUtil {
|
||||
/**
|
||||
* 模糊匹配转换为枚举,给定一个值,匹配枚举中定义的所有字段名(包括name属性),一旦匹配到返回这个枚举对象,否则返回null
|
||||
*
|
||||
* @param <E> 枚举类型
|
||||
* @param enumClass 枚举类
|
||||
* @param value 值
|
||||
* @param value 值
|
||||
* @return 匹配到的枚举对象,未匹配到返回null
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T extends Enum<T>> T likeValueOf(Class<T> enumClass, Object value) {
|
||||
public static <E extends Enum<E>> E likeValueOf(Class<E> enumClass, Object value) {
|
||||
if (value instanceof CharSequence) {
|
||||
value = value.toString().trim();
|
||||
}
|
||||
@@ -123,7 +124,7 @@ public class EnumUtil {
|
||||
}
|
||||
for (Enum<?> enumObj : enums) {
|
||||
if (ObjectUtil.equal(value, ReflectUtil.getFieldValue(enumObj, field))) {
|
||||
return (T) enumObj;
|
||||
return (E) enumObj;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -151,7 +152,7 @@ public class EnumUtil {
|
||||
/**
|
||||
* 获得枚举类中各枚举对象下指定字段的值
|
||||
*
|
||||
* @param clazz 枚举类
|
||||
* @param clazz 枚举类
|
||||
* @param fieldName 字段名,最终调用getXXX方法
|
||||
* @return 字段值列表
|
||||
*/
|
||||
@@ -199,6 +200,7 @@ public class EnumUtil {
|
||||
* 获取枚举字符串值和枚举对象的Map对应,使用LinkedHashMap保证有序<br>
|
||||
* 结果中键为枚举名,值为枚举对象
|
||||
*
|
||||
* @param <E> 枚举类型
|
||||
* @param enumClass 枚举类
|
||||
* @return 枚举字符串值和枚举对象的Map对应,使用LinkedHashMap保证有序
|
||||
* @since 4.0.2
|
||||
@@ -215,7 +217,7 @@ public class EnumUtil {
|
||||
* 获得枚举名对应指定字段值的Map<br>
|
||||
* 键为枚举名,值为字段值
|
||||
*
|
||||
* @param clazz 枚举类
|
||||
* @param clazz 枚举类
|
||||
* @param fieldName 字段名,最终调用getXXX方法
|
||||
* @return 枚举名对应指定字段值的Map
|
||||
*/
|
||||
@@ -234,9 +236,9 @@ public class EnumUtil {
|
||||
/**
|
||||
* 判断某个值是存在枚举中
|
||||
*
|
||||
* @param <E> 枚举类型
|
||||
* @param enumClass 枚举类
|
||||
* @param val 需要查找的值
|
||||
* @param <E>
|
||||
* @param val 需要查找的值
|
||||
* @return 是否存在
|
||||
*/
|
||||
public static <E extends Enum<E>> boolean contains(final Class<E> enumClass, String val) {
|
||||
@@ -246,9 +248,9 @@ public class EnumUtil {
|
||||
/**
|
||||
* 判断某个值是不存在枚举中
|
||||
*
|
||||
* @param <E> 枚举类型
|
||||
* @param enumClass 枚举类
|
||||
* @param val 需要查找的值
|
||||
* @param <E>
|
||||
* @param val 需要查找的值
|
||||
* @return 是否不存在
|
||||
*/
|
||||
public static <E extends Enum<E>> boolean notContains(final Class<E> enumClass, String val) {
|
||||
@@ -258,7 +260,7 @@ public class EnumUtil {
|
||||
/**
|
||||
* 忽略大小检查某个枚举值是否匹配指定值
|
||||
*
|
||||
* @param e 枚举值
|
||||
* @param e 枚举值
|
||||
* @param val 需要判断的值
|
||||
* @return 是非匹配
|
||||
*/
|
||||
@@ -269,7 +271,7 @@ public class EnumUtil {
|
||||
/**
|
||||
* 检查某个枚举值是否匹配指定值
|
||||
*
|
||||
* @param e 枚举值
|
||||
* @param e 枚举值
|
||||
* @param val 需要判断的值
|
||||
* @return 是非匹配
|
||||
*/
|
||||
|
||||
@@ -467,6 +467,7 @@ public class RandomUtil {
|
||||
/**
|
||||
* 带有权重的随机生成器
|
||||
*
|
||||
* @param <T> 随机对象类型
|
||||
* @param weightObjs 带有权重的对象列表
|
||||
* @return {@link WeightRandom}
|
||||
* @since 4.0.3
|
||||
@@ -478,6 +479,7 @@ public class RandomUtil {
|
||||
/**
|
||||
* 带有权重的随机生成器
|
||||
*
|
||||
* @param <T> 随机对象类型
|
||||
* @param weightObjs 带有权重的对象列表
|
||||
* @return {@link WeightRandom}
|
||||
* @since 4.0.3
|
||||
|
||||
@@ -830,6 +830,7 @@ public class ReflectUtil {
|
||||
*
|
||||
* @param <T> AccessibleObject的子类,比如Class、Method、Field等
|
||||
* @param accessibleObject 可设置访问权限的对象,比如Class、Method、Field等
|
||||
* @return 被设置可访问的对象
|
||||
* @since 4.6.8
|
||||
*/
|
||||
public static <T extends AccessibleObject> T setAccessible(T accessibleObject) {
|
||||
|
||||
@@ -3495,11 +3495,13 @@ public class StrUtil {
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回字符串 searchStr 在字符串 str 中第 ordinal 次出现的位置。<br>
|
||||
* 如果 str=null 或 searchStr=null 或 ordinal<=0 则返回-1<br>
|
||||
* 返回字符串 searchStr 在字符串 str 中第 ordinal 次出现的位置。
|
||||
*
|
||||
* <p>
|
||||
* 如果 str=null 或 searchStr=null 或 ordinal≥0 则返回-1<br>
|
||||
* 此方法来自:Apache-Commons-Lang
|
||||
*
|
||||
* 栗子(*代表任意字符):
|
||||
* 例子(*代表任意字符):
|
||||
*
|
||||
* <pre>
|
||||
* StrUtil.ordinalIndexOf(null, *, *) = -1
|
||||
|
||||
@@ -50,16 +50,20 @@ import cn.hutool.core.lang.Assert;
|
||||
* 工具类封装了XML文档的创建、读取、写出和部分XML操作
|
||||
*
|
||||
* @author xiaoleilu
|
||||
*
|
||||
*/
|
||||
public class XmlUtil {
|
||||
|
||||
/** 在XML中无效的字符 正则 */
|
||||
/**
|
||||
* 在XML中无效的字符 正则
|
||||
*/
|
||||
public final static String INVALID_REGEX = "[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]";
|
||||
/** XML格式化输出默认缩进量 */
|
||||
/**
|
||||
* XML格式化输出默认缩进量
|
||||
*/
|
||||
public final static int INDENT_DEFAULT = 2;
|
||||
|
||||
// -------------------------------------------------------------------------------------- Read
|
||||
|
||||
/**
|
||||
* 读取解析XML文件
|
||||
*
|
||||
@@ -165,7 +169,7 @@ public class XmlUtil {
|
||||
/**
|
||||
* 从XML中读取对象 Reads serialized object from the XML file.
|
||||
*
|
||||
* @param <T> 对象类型
|
||||
* @param <T> 对象类型
|
||||
* @param source XML文件
|
||||
* @return 对象
|
||||
*/
|
||||
@@ -176,7 +180,7 @@ public class XmlUtil {
|
||||
/**
|
||||
* 从XML中读取对象 Reads serialized object from the XML file.
|
||||
*
|
||||
* @param <T> 对象类型
|
||||
* @param <T> 对象类型
|
||||
* @param xmlStr XML内容
|
||||
* @return 对象
|
||||
* @since 3.2.0
|
||||
@@ -188,7 +192,7 @@ public class XmlUtil {
|
||||
/**
|
||||
* 从XML中读取对象 Reads serialized object from the XML file.
|
||||
*
|
||||
* @param <T> 对象类型
|
||||
* @param <T> 对象类型
|
||||
* @param source {@link InputSource}
|
||||
* @return 对象
|
||||
* @since 3.2.0
|
||||
@@ -207,6 +211,7 @@ public class XmlUtil {
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------- Write
|
||||
|
||||
/**
|
||||
* 将XML文档转换为String<br>
|
||||
* 字符编码使用XML文档中的编码,获取不到则使用UTF-8<br>
|
||||
@@ -223,7 +228,7 @@ public class XmlUtil {
|
||||
* 将XML文档转换为String<br>
|
||||
* 字符编码使用XML文档中的编码,获取不到则使用UTF-8
|
||||
*
|
||||
* @param doc XML文档
|
||||
* @param doc XML文档
|
||||
* @param isPretty 是否格式化输出
|
||||
* @return XML字符串
|
||||
* @since 3.0.9
|
||||
@@ -236,8 +241,8 @@ public class XmlUtil {
|
||||
* 将XML文档转换为String<br>
|
||||
* 字符编码使用XML文档中的编码,获取不到则使用UTF-8
|
||||
*
|
||||
* @param doc XML文档
|
||||
* @param charset 编码
|
||||
* @param doc XML文档
|
||||
* @param charset 编码
|
||||
* @param isPretty 是否格式化输出
|
||||
* @return XML字符串
|
||||
* @since 3.0.9
|
||||
@@ -278,7 +283,7 @@ public class XmlUtil {
|
||||
* 将XML文档写入到文件<br>
|
||||
* 使用Document中的编码
|
||||
*
|
||||
* @param doc XML文档
|
||||
* @param doc XML文档
|
||||
* @param absolutePath 文件绝对路径,不存在会自动创建
|
||||
*/
|
||||
public static void toFile(Document doc, String absolutePath) {
|
||||
@@ -288,8 +293,8 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将XML文档写入到文件<br>
|
||||
*
|
||||
* @param doc XML文档
|
||||
* @param path 文件路径绝对路径或相对ClassPath路径,不存在会自动创建
|
||||
* @param doc XML文档
|
||||
* @param path 文件路径绝对路径或相对ClassPath路径,不存在会自动创建
|
||||
* @param charset 自定义XML文件的编码,如果为{@code null} 读取XML文档中的编码,否则默认UTF-8
|
||||
*/
|
||||
public static void toFile(Document doc, String path, String charset) {
|
||||
@@ -312,10 +317,10 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将XML文档写出
|
||||
*
|
||||
* @param node {@link Node} XML文档节点或文档本身
|
||||
* @param writer 写出的Writer,Writer决定了输出XML的编码
|
||||
* @param node {@link Node} XML文档节点或文档本身
|
||||
* @param writer 写出的Writer,Writer决定了输出XML的编码
|
||||
* @param charset 编码
|
||||
* @param indent 格式化输出中缩进量,小于1表示不格式化输出
|
||||
* @param indent 格式化输出中缩进量,小于1表示不格式化输出
|
||||
* @since 3.0.9
|
||||
*/
|
||||
public static void write(Node node, Writer writer, String charset, int indent) {
|
||||
@@ -325,10 +330,10 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将XML文档写出
|
||||
*
|
||||
* @param node {@link Node} XML文档节点或文档本身
|
||||
* @param out 写出的Writer,Writer决定了输出XML的编码
|
||||
* @param node {@link Node} XML文档节点或文档本身
|
||||
* @param out 写出的Writer,Writer决定了输出XML的编码
|
||||
* @param charset 编码
|
||||
* @param indent 格式化输出中缩进量,小于1表示不格式化输出
|
||||
* @param indent 格式化输出中缩进量,小于1表示不格式化输出
|
||||
* @since 4.0.8
|
||||
*/
|
||||
public static void write(Node node, OutputStream out, String charset, int indent) {
|
||||
@@ -339,10 +344,10 @@ public class XmlUtil {
|
||||
* 将XML文档写出<br>
|
||||
* 格式化输出逻辑参考:https://stackoverflow.com/questions/139076/how-to-pretty-print-xml-from-java
|
||||
*
|
||||
* @param source 源
|
||||
* @param result 目标
|
||||
* @param source 源
|
||||
* @param result 目标
|
||||
* @param charset 编码
|
||||
* @param indent 格式化输出中缩进量,小于1表示不格式化输出
|
||||
* @param indent 格式化输出中缩进量,小于1表示不格式化输出
|
||||
* @since 4.0.9
|
||||
*/
|
||||
public static void transform(Source source, Result result, String charset, int indent) {
|
||||
@@ -363,6 +368,7 @@ public class XmlUtil {
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------- Create
|
||||
|
||||
/**
|
||||
* 创建XML文档<br>
|
||||
* 创建的XML默认是utf8编码,修改编码的过程是在toStr和toFile方法里,即XML在转为文本的时候才定义编码
|
||||
@@ -407,6 +413,7 @@ public class XmlUtil {
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------- Function
|
||||
|
||||
/**
|
||||
* 获得XML文档根节点
|
||||
*
|
||||
@@ -481,8 +488,8 @@ public class XmlUtil {
|
||||
/**
|
||||
* 根据节点名获得第一个子节点
|
||||
*
|
||||
* @param element 节点
|
||||
* @param tagName 节点名
|
||||
* @param element 节点
|
||||
* @param tagName 节点名
|
||||
* @param defaultValue 默认值
|
||||
* @return 节点中的值
|
||||
*/
|
||||
@@ -506,7 +513,7 @@ public class XmlUtil {
|
||||
* 非Element节点将被忽略
|
||||
*
|
||||
* @param parentEle 父节点,如果指定将返回此节点的所有直接子节点,null返回所有就节点
|
||||
* @param nodeList NodeList
|
||||
* @param nodeList NodeList
|
||||
* @return Element列表
|
||||
*/
|
||||
public static List<Element> transElements(Element parentEle, NodeList nodeList) {
|
||||
@@ -561,7 +568,7 @@ public class XmlUtil {
|
||||
* Xpath相关文章:https://www.ibm.com/developerworks/cn/xml/x-javaxpathapi.html
|
||||
*
|
||||
* @param expression XPath表达式
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @return 匹配返回类型的值
|
||||
* @since 4.0.9
|
||||
*/
|
||||
@@ -574,7 +581,7 @@ public class XmlUtil {
|
||||
* Xpath相关文章:https://www.ibm.com/developerworks/cn/xml/x-javaxpathapi.html
|
||||
*
|
||||
* @param expression XPath表达式
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @return NodeList
|
||||
* @since 4.0.9
|
||||
*/
|
||||
@@ -587,7 +594,7 @@ public class XmlUtil {
|
||||
* Xpath相关文章:https://www.ibm.com/developerworks/cn/xml/x-javaxpathapi.html
|
||||
*
|
||||
* @param expression XPath表达式
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @return 匹配返回类型的值
|
||||
* @since 4.0.9
|
||||
*/
|
||||
@@ -600,7 +607,7 @@ public class XmlUtil {
|
||||
* Xpath相关文章:https://www.ibm.com/developerworks/cn/xml/x-javaxpathapi.html
|
||||
*
|
||||
* @param expression XPath表达式
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @param source 资源,可以是Docunent、Node节点等
|
||||
* @param returnType 返回类型,{@link javax.xml.xpath.XPathConstants}
|
||||
* @return 匹配返回类型的值
|
||||
* @since 3.2.0
|
||||
@@ -637,23 +644,23 @@ public class XmlUtil {
|
||||
for (int i = 0, length = string.length(); i < length; i++) {
|
||||
char c = string.charAt(i);
|
||||
switch (c) {
|
||||
case '&':
|
||||
sb.append("&");
|
||||
break;
|
||||
case '<':
|
||||
sb.append("<");
|
||||
break;
|
||||
case '>':
|
||||
sb.append(">");
|
||||
break;
|
||||
case '"':
|
||||
sb.append(""");
|
||||
break;
|
||||
case '\'':
|
||||
sb.append("'");
|
||||
break;
|
||||
default:
|
||||
sb.append(c);
|
||||
case '&':
|
||||
sb.append("&");
|
||||
break;
|
||||
case '<':
|
||||
sb.append("<");
|
||||
break;
|
||||
case '>':
|
||||
sb.append(">");
|
||||
break;
|
||||
case '"':
|
||||
sb.append(""");
|
||||
break;
|
||||
case '\'':
|
||||
sb.append("'");
|
||||
break;
|
||||
default:
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
@@ -701,7 +708,7 @@ public class XmlUtil {
|
||||
/**
|
||||
* XML节点转换为Map
|
||||
*
|
||||
* @param node XML节点
|
||||
* @param node XML节点
|
||||
* @param result 结果Map类型
|
||||
* @return XML数据转换后的Map
|
||||
* @since 4.0.8
|
||||
@@ -728,7 +735,8 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将Map转换为XML格式的字符串
|
||||
*
|
||||
* @param data Map类型数据
|
||||
* @param data Map类型数据
|
||||
* @param rootName 根节点名
|
||||
* @return XML格式的字符串
|
||||
* @since 4.0.8
|
||||
*/
|
||||
@@ -739,7 +747,8 @@ public class XmlUtil {
|
||||
/**
|
||||
* 将Map转换为XML
|
||||
*
|
||||
* @param data Map类型数据
|
||||
* @param data Map类型数据
|
||||
* @param rootName 根节点名
|
||||
* @return XML
|
||||
* @since 4.0.9
|
||||
*/
|
||||
@@ -765,7 +774,7 @@ public class XmlUtil {
|
||||
/**
|
||||
* 在已有节点上创建子节点
|
||||
*
|
||||
* @param node 节点
|
||||
* @param node 节点
|
||||
* @param tagName 标签名
|
||||
* @return 子节点
|
||||
* @since 4.0.9
|
||||
@@ -778,12 +787,13 @@ public class XmlUtil {
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------------------- Private method start
|
||||
|
||||
/**
|
||||
* 将Map转换为XML格式的字符串
|
||||
*
|
||||
* @param doc {@link Document}
|
||||
* @param doc {@link Document}
|
||||
* @param element 节点
|
||||
* @param data Map类型数据
|
||||
* @param data Map类型数据
|
||||
* @since 4.0.8
|
||||
*/
|
||||
private static void mapToXml(Document doc, Element element, Map<?, ?> data) {
|
||||
|
||||
@@ -51,8 +51,9 @@ public class BCUtil {
|
||||
* 解码恢复EC压缩公钥,支持Base64和Hex编码,(基于BouncyCastle)<br>
|
||||
* 见:https://www.cnblogs.com/xinzhao/p/8963724.html
|
||||
*
|
||||
* @param encode 压缩公钥
|
||||
* @param encode 压缩公钥
|
||||
* @param curveName EC曲线名
|
||||
* @return 公钥
|
||||
* @since 4.4.4
|
||||
*/
|
||||
public static PublicKey decodeECPoint(String encode, String curveName) {
|
||||
@@ -64,7 +65,8 @@ public class BCUtil {
|
||||
* 见:https://www.cnblogs.com/xinzhao/p/8963724.html
|
||||
*
|
||||
* @param encodeByte 压缩公钥
|
||||
* @param curveName EC曲线名,例如{@link KeyUtil#SM2_DEFAULT_CURVE}
|
||||
* @param curveName EC曲线名,例如{@link KeyUtil#SM2_DEFAULT_CURVE}
|
||||
* @return 公钥
|
||||
* @since 4.4.4
|
||||
*/
|
||||
public static PublicKey decodeECPoint(byte[] encodeByte, String curveName) {
|
||||
@@ -108,7 +110,7 @@ public class BCUtil {
|
||||
*/
|
||||
public static PublicKey readPublicKey(InputStream pemStream) {
|
||||
final Certificate certificate = KeyUtil.readX509Certificate(pemStream);
|
||||
if(null == certificate) {
|
||||
if (null == certificate) {
|
||||
return null;
|
||||
}
|
||||
return certificate.getPublicKey();
|
||||
|
||||
@@ -588,6 +588,7 @@ public class KeyUtil {
|
||||
/**
|
||||
* 获取主体算法名,例如RSA/ECB/PKCS1Padding的主体算法是RSA
|
||||
*
|
||||
* @param algorithm XXXwithXXX算法
|
||||
* @return 主体算法名
|
||||
* @since 4.5.2
|
||||
*/
|
||||
@@ -823,6 +824,7 @@ public class KeyUtil {
|
||||
*
|
||||
* @param encode 压缩公钥
|
||||
* @param curveName EC曲线名
|
||||
* @return 公钥
|
||||
* @since 4.4.4
|
||||
*/
|
||||
public static PublicKey decodeECPoint(String encode, String curveName) {
|
||||
@@ -835,6 +837,7 @@ public class KeyUtil {
|
||||
*
|
||||
* @param encodeByte 压缩公钥
|
||||
* @param curveName EC曲线名
|
||||
* @return 公钥
|
||||
* @since 4.4.4
|
||||
*/
|
||||
public static PublicKey decodeECPoint(byte[] encodeByte, String curveName) {
|
||||
|
||||
@@ -50,7 +50,6 @@ import cn.hutool.crypto.symmetric.SymmetricCrypto;
|
||||
* 3、摘要加密(digest),例如:MD5、SHA-1、SHA-256、HMAC等<br>
|
||||
*
|
||||
* @author xiaoleilu, Gsealy
|
||||
*
|
||||
*/
|
||||
public final class SecureUtil {
|
||||
|
||||
@@ -79,7 +78,7 @@ public final class SecureUtil {
|
||||
* 生成 {@link SecretKey},仅用于对称加密和摘要算法密钥生成
|
||||
*
|
||||
* @param algorithm 算法,支持PBE算法
|
||||
* @param keySize 密钥长度
|
||||
* @param keySize 密钥长度
|
||||
* @return {@link SecretKey}
|
||||
* @since 3.1.2
|
||||
*/
|
||||
@@ -91,7 +90,7 @@ public final class SecureUtil {
|
||||
* 生成 {@link SecretKey},仅用于对称加密和摘要算法密钥生成
|
||||
*
|
||||
* @param algorithm 算法
|
||||
* @param key 密钥,如果为{@code null} 自动生成随机密钥
|
||||
* @param key 密钥,如果为{@code null} 自动生成随机密钥
|
||||
* @return {@link SecretKey}
|
||||
*/
|
||||
public static SecretKey generateKey(String algorithm, byte[] key) {
|
||||
@@ -102,7 +101,7 @@ public final class SecureUtil {
|
||||
* 生成 {@link SecretKey}
|
||||
*
|
||||
* @param algorithm DES算法,包括DES、DESede等
|
||||
* @param key 密钥
|
||||
* @param key 密钥
|
||||
* @return {@link SecretKey}
|
||||
*/
|
||||
public static SecretKey generateDESKey(String algorithm, byte[] key) {
|
||||
@@ -113,7 +112,7 @@ public final class SecureUtil {
|
||||
* 生成PBE {@link SecretKey}
|
||||
*
|
||||
* @param algorithm PBE算法,包括:PBEWithMD5AndDES、PBEWithSHA1AndDESede、PBEWithSHA1AndRC2_40等
|
||||
* @param key 密钥
|
||||
* @param key 密钥
|
||||
* @return {@link SecretKey}
|
||||
*/
|
||||
public static SecretKey generatePBEKey(String algorithm, char[] key) {
|
||||
@@ -124,7 +123,7 @@ public final class SecureUtil {
|
||||
* 生成 {@link SecretKey},仅用于对称加密和摘要算法
|
||||
*
|
||||
* @param algorithm 算法
|
||||
* @param keySpec {@link KeySpec}
|
||||
* @param keySpec {@link KeySpec}
|
||||
* @return {@link SecretKey}
|
||||
*/
|
||||
public static SecretKey generateKey(String algorithm, KeySpec keySpec) {
|
||||
@@ -136,7 +135,7 @@ public final class SecureUtil {
|
||||
* 算法见:https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyFactory
|
||||
*
|
||||
* @param algorithm 算法
|
||||
* @param key 密钥
|
||||
* @param key 密钥
|
||||
* @return 私钥 {@link PrivateKey}
|
||||
*/
|
||||
public static PrivateKey generatePrivateKey(String algorithm, byte[] key) {
|
||||
@@ -148,7 +147,7 @@ public final class SecureUtil {
|
||||
* 算法见:https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyFactory
|
||||
*
|
||||
* @param algorithm 算法
|
||||
* @param keySpec {@link KeySpec}
|
||||
* @param keySpec {@link KeySpec}
|
||||
* @return 私钥 {@link PrivateKey}
|
||||
* @since 3.1.1
|
||||
*/
|
||||
@@ -160,7 +159,7 @@ public final class SecureUtil {
|
||||
* 生成私钥,仅用于非对称加密
|
||||
*
|
||||
* @param keyStore {@link KeyStore}
|
||||
* @param alias 别名
|
||||
* @param alias 别名
|
||||
* @param password 密码
|
||||
* @return 私钥 {@link PrivateKey}
|
||||
*/
|
||||
@@ -173,7 +172,7 @@ public final class SecureUtil {
|
||||
* 算法见:https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyFactory
|
||||
*
|
||||
* @param algorithm 算法
|
||||
* @param key 密钥
|
||||
* @param key 密钥
|
||||
* @return 公钥 {@link PublicKey}
|
||||
*/
|
||||
public static PublicKey generatePublicKey(String algorithm, byte[] key) {
|
||||
@@ -185,7 +184,7 @@ public final class SecureUtil {
|
||||
* 算法见:https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyFactory
|
||||
*
|
||||
* @param algorithm 算法
|
||||
* @param keySpec {@link KeySpec}
|
||||
* @param keySpec {@link KeySpec}
|
||||
* @return 公钥 {@link PublicKey}
|
||||
* @since 3.1.1
|
||||
*/
|
||||
@@ -209,7 +208,7 @@ public final class SecureUtil {
|
||||
* 密钥对生成算法见:https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator
|
||||
*
|
||||
* @param algorithm 非对称加密算法
|
||||
* @param keySize 密钥模(modulus )长度
|
||||
* @param keySize 密钥模(modulus )长度
|
||||
* @return {@link KeyPair}
|
||||
*/
|
||||
public static KeyPair generateKeyPair(String algorithm, int keySize) {
|
||||
@@ -221,8 +220,8 @@ public final class SecureUtil {
|
||||
* 密钥对生成算法见:https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator
|
||||
*
|
||||
* @param algorithm 非对称加密算法
|
||||
* @param keySize 密钥模(modulus )长度
|
||||
* @param seed 种子
|
||||
* @param keySize 密钥模(modulus )长度
|
||||
* @param seed 种子
|
||||
* @return {@link KeyPair}
|
||||
*/
|
||||
public static KeyPair generateKeyPair(String algorithm, int keySize, byte[] seed) {
|
||||
@@ -234,7 +233,7 @@ public final class SecureUtil {
|
||||
* 密钥对生成算法见:https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator
|
||||
*
|
||||
* @param algorithm 非对称加密算法
|
||||
* @param params {@link AlgorithmParameterSpec}
|
||||
* @param params {@link AlgorithmParameterSpec}
|
||||
* @return {@link KeyPair}
|
||||
* @since 4.3.3
|
||||
*/
|
||||
@@ -247,8 +246,8 @@ public final class SecureUtil {
|
||||
* 密钥对生成算法见:https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator
|
||||
*
|
||||
* @param algorithm 非对称加密算法
|
||||
* @param seed 种子
|
||||
* @param params {@link AlgorithmParameterSpec}
|
||||
* @param seed 种子
|
||||
* @param params {@link AlgorithmParameterSpec}
|
||||
* @return {@link KeyPair}
|
||||
* @since 4.3.3
|
||||
*/
|
||||
@@ -271,7 +270,7 @@ public final class SecureUtil {
|
||||
* 生成算法,格式为XXXwithXXX
|
||||
*
|
||||
* @param asymmetricAlgorithm 非对称算法
|
||||
* @param digestAlgorithm 摘要算法
|
||||
* @param digestAlgorithm 摘要算法
|
||||
* @return 算法
|
||||
* @since 4.4.1
|
||||
*/
|
||||
@@ -284,7 +283,7 @@ public final class SecureUtil {
|
||||
* 生成签名对象,仅用于非对称加密
|
||||
*
|
||||
* @param asymmetricAlgorithm {@link AsymmetricAlgorithm} 非对称加密算法
|
||||
* @param digestAlgorithm {@link DigestAlgorithm} 摘要算法
|
||||
* @param digestAlgorithm {@link DigestAlgorithm} 摘要算法
|
||||
* @return {@link Signature}
|
||||
*/
|
||||
public static Signature generateSignature(AsymmetricAlgorithm asymmetricAlgorithm, DigestAlgorithm digestAlgorithm) {
|
||||
@@ -300,7 +299,7 @@ public final class SecureUtil {
|
||||
* KeyStore文件用于数字证书的密钥对保存<br>
|
||||
* see: http://snowolf.iteye.com/blog/391931
|
||||
*
|
||||
* @param in {@link InputStream} 如果想从文件读取.keystore文件,使用 {@link FileUtil#getInputStream(java.io.File)} 读取
|
||||
* @param in {@link InputStream} 如果想从文件读取.keystore文件,使用 {@link FileUtil#getInputStream(java.io.File)} 读取
|
||||
* @param password 密码
|
||||
* @return {@link KeyStore}
|
||||
*/
|
||||
@@ -313,8 +312,8 @@ public final class SecureUtil {
|
||||
* KeyStore文件用于数字证书的密钥对保存<br>
|
||||
* see: http://snowolf.iteye.com/blog/391931
|
||||
*
|
||||
* @param type 类型
|
||||
* @param in {@link InputStream} 如果想从文件读取.keystore文件,使用 {@link FileUtil#getInputStream(java.io.File)} 读取
|
||||
* @param type 类型
|
||||
* @param in {@link InputStream} 如果想从文件读取.keystore文件,使用 {@link FileUtil#getInputStream(java.io.File)} 读取
|
||||
* @param password 密码
|
||||
* @return {@link KeyStore}
|
||||
*/
|
||||
@@ -327,9 +326,9 @@ public final class SecureUtil {
|
||||
* Certification为证书文件<br>
|
||||
* see: http://snowolf.iteye.com/blog/391931
|
||||
*
|
||||
* @param in {@link InputStream} 如果想从文件读取.cer文件,使用 {@link FileUtil#getInputStream(java.io.File)} 读取
|
||||
* @param in {@link InputStream} 如果想从文件读取.cer文件,使用 {@link FileUtil#getInputStream(java.io.File)} 读取
|
||||
* @param password 密码
|
||||
* @param alias 别名
|
||||
* @param alias 别名
|
||||
* @return {@link KeyStore}
|
||||
* @since 4.4.1
|
||||
*/
|
||||
@@ -355,10 +354,10 @@ public final class SecureUtil {
|
||||
* Certification为证书文件<br>
|
||||
* see: http://snowolf.iteye.com/blog/391931
|
||||
*
|
||||
* @param type 类型,例如X.509
|
||||
* @param in {@link InputStream} 如果想从文件读取.cer文件,使用 {@link FileUtil#getInputStream(java.io.File)} 读取
|
||||
* @param type 类型,例如X.509
|
||||
* @param in {@link InputStream} 如果想从文件读取.cer文件,使用 {@link FileUtil#getInputStream(java.io.File)} 读取
|
||||
* @param password 密码
|
||||
* @param alias 别名
|
||||
* @param alias 别名
|
||||
* @return {@link KeyStore}
|
||||
* @since 4.4.1
|
||||
*/
|
||||
@@ -372,7 +371,7 @@ public final class SecureUtil {
|
||||
* see: http://snowolf.iteye.com/blog/391931
|
||||
*
|
||||
* @param type 类型,例如X.509
|
||||
* @param in {@link InputStream} 如果想从文件读取.cer文件,使用 {@link FileUtil#getInputStream(java.io.File)} 读取
|
||||
* @param in {@link InputStream} 如果想从文件读取.cer文件,使用 {@link FileUtil#getInputStream(java.io.File)} 读取
|
||||
* @return {@link Certificate}
|
||||
*/
|
||||
public static Certificate readCertificate(String type, InputStream in) {
|
||||
@@ -383,7 +382,7 @@ public final class SecureUtil {
|
||||
* 获得 Certification
|
||||
*
|
||||
* @param keyStore {@link KeyStore}
|
||||
* @param alias 别名
|
||||
* @param alias 别名
|
||||
* @return {@link Certificate}
|
||||
*/
|
||||
public static Certificate getCertificate(KeyStore keyStore, String alias) {
|
||||
@@ -490,6 +489,7 @@ public final class SecureUtil {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------- 摘要算法
|
||||
|
||||
/**
|
||||
* MD5加密<br>
|
||||
* 例:
|
||||
@@ -627,7 +627,7 @@ public final class SecureUtil {
|
||||
* 创建HMac对象,调用digest方法可获得hmac值
|
||||
*
|
||||
* @param algorithm {@link HmacAlgorithm}
|
||||
* @param key 密钥,如果为<code>null</code>生成随机密钥
|
||||
* @param key 密钥,如果为<code>null</code>生成随机密钥
|
||||
* @return {@link HMac}
|
||||
* @since 3.3.0
|
||||
*/
|
||||
@@ -639,7 +639,7 @@ public final class SecureUtil {
|
||||
* 创建HMac对象,调用digest方法可获得hmac值
|
||||
*
|
||||
* @param algorithm {@link HmacAlgorithm}
|
||||
* @param key 密钥,如果为<code>null</code>生成随机密钥
|
||||
* @param key 密钥,如果为<code>null</code>生成随机密钥
|
||||
* @return {@link HMac}
|
||||
* @since 3.0.3
|
||||
*/
|
||||
@@ -651,7 +651,7 @@ public final class SecureUtil {
|
||||
* 创建HMac对象,调用digest方法可获得hmac值
|
||||
*
|
||||
* @param algorithm {@link HmacAlgorithm}
|
||||
* @param key 密钥{@link SecretKey},如果为<code>null</code>生成随机密钥
|
||||
* @param key 密钥{@link SecretKey},如果为<code>null</code>生成随机密钥
|
||||
* @return {@link HMac}
|
||||
* @since 3.0.3
|
||||
*/
|
||||
@@ -756,7 +756,7 @@ public final class SecureUtil {
|
||||
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
|
||||
*
|
||||
* @param privateKeyBase64 私钥Base64
|
||||
* @param publicKeyBase64 公钥Base64
|
||||
* @param publicKeyBase64 公钥Base64
|
||||
* @return {@link RSA}
|
||||
* @since 3.0.5
|
||||
*/
|
||||
@@ -770,7 +770,7 @@ public final class SecureUtil {
|
||||
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
|
||||
*
|
||||
* @param privateKey 私钥
|
||||
* @param publicKey 公钥
|
||||
* @param publicKey 公钥
|
||||
* @return {@link RSA}
|
||||
* @since 3.0.5
|
||||
*/
|
||||
@@ -795,9 +795,9 @@ public final class SecureUtil {
|
||||
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
|
||||
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做签名或验证
|
||||
*
|
||||
* @param algorithm 签名算法
|
||||
* @param algorithm 签名算法
|
||||
* @param privateKeyBase64 私钥Base64
|
||||
* @param publicKeyBase64 公钥Base64
|
||||
* @param publicKeyBase64 公钥Base64
|
||||
* @return {@link Sign}
|
||||
* @since 3.3.0
|
||||
*/
|
||||
@@ -810,8 +810,9 @@ public final class SecureUtil {
|
||||
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
|
||||
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做签名或验证
|
||||
*
|
||||
* @param algorithm 算法枚举
|
||||
* @param privateKey 私钥
|
||||
* @param publicKey 公钥
|
||||
* @param publicKey 公钥
|
||||
* @return {@link Sign}
|
||||
* @since 3.3.0
|
||||
*/
|
||||
@@ -837,11 +838,11 @@ public final class SecureUtil {
|
||||
* 对参数做签名<br>
|
||||
* 参数签名为对Map参数按照key的顺序排序后拼接为字符串,然后根据提供的签名算法生成签名字符串
|
||||
*
|
||||
* @param crypto 对称加密算法
|
||||
* @param params 参数
|
||||
* @param separator entry之间的连接符
|
||||
* @param crypto 对称加密算法
|
||||
* @param params 参数
|
||||
* @param separator entry之间的连接符
|
||||
* @param keyValueSeparator kv之间的连接符
|
||||
* @param isIgnoreNull 是否忽略null的键和值
|
||||
* @param isIgnoreNull 是否忽略null的键和值
|
||||
* @return 签名
|
||||
* @since 4.0.1
|
||||
*/
|
||||
@@ -898,7 +899,7 @@ public final class SecureUtil {
|
||||
* 拼接后的字符串键值对之间无符号,键值对之间无符号,忽略null值
|
||||
*
|
||||
* @param digestAlgorithm 摘要算法
|
||||
* @param params 参数
|
||||
* @param params 参数
|
||||
* @return 签名
|
||||
* @since 4.0.1
|
||||
*/
|
||||
@@ -910,11 +911,11 @@ public final class SecureUtil {
|
||||
* 对参数做签名<br>
|
||||
* 参数签名为对Map参数按照key的顺序排序后拼接为字符串,然后根据提供的签名算法生成签名字符串
|
||||
*
|
||||
* @param digestAlgorithm 摘要算法
|
||||
* @param params 参数
|
||||
* @param separator entry之间的连接符
|
||||
* @param digestAlgorithm 摘要算法
|
||||
* @param params 参数
|
||||
* @param separator entry之间的连接符
|
||||
* @param keyValueSeparator kv之间的连接符
|
||||
* @param isIgnoreNull 是否忽略null的键和值
|
||||
* @param isIgnoreNull 是否忽略null的键和值
|
||||
* @return 签名
|
||||
* @since 4.0.1
|
||||
*/
|
||||
@@ -927,6 +928,7 @@ public final class SecureUtil {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------- UUID
|
||||
|
||||
/**
|
||||
* 简化的UUID,去掉了横线
|
||||
*
|
||||
@@ -972,6 +974,7 @@ public final class SecureUtil {
|
||||
* 创建{@link Cipher}
|
||||
*
|
||||
* @param algorithm 算法
|
||||
* @return {@link Cipher}
|
||||
* @since 4.5.2
|
||||
*/
|
||||
public static Cipher createCipher(String algorithm) {
|
||||
@@ -991,6 +994,7 @@ public final class SecureUtil {
|
||||
* 创建{@link MessageDigest}
|
||||
*
|
||||
* @param algorithm 算法
|
||||
* @return {@link MessageDigest}
|
||||
* @since 4.5.2
|
||||
*/
|
||||
public static MessageDigest createMessageDigest(String algorithm) {
|
||||
@@ -1010,6 +1014,7 @@ public final class SecureUtil {
|
||||
* 创建{@link Mac}
|
||||
*
|
||||
* @param algorithm 算法
|
||||
* @return {@link Mac}
|
||||
* @since 4.5.13
|
||||
*/
|
||||
public static Mac createMac(String algorithm) {
|
||||
|
||||
@@ -150,6 +150,7 @@ public abstract class AbstractAsymmetricCrypto<T extends AbstractAsymmetricCrypt
|
||||
* 编码为Base64字符串
|
||||
*
|
||||
* @param data 被加密的字符串
|
||||
* @param charset 编码
|
||||
* @param keyType 私钥或公钥 {@link KeyType}
|
||||
* @return Base64字符串
|
||||
* @since 4.0.1
|
||||
|
||||
@@ -12,7 +12,7 @@ import cn.hutool.core.util.CharsetUtil;
|
||||
* 使用方法如下:
|
||||
* <p>
|
||||
* <code>
|
||||
* String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); <br />
|
||||
* String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
|
||||
* </code>
|
||||
* <p>
|
||||
* 使用checkpw方法检查被加密的字符串是否与原始字符串匹配:
|
||||
@@ -24,8 +24,8 @@ import cn.hutool.core.util.CharsetUtil;
|
||||
* gensalt方法提供了可选参数 (log_rounds) 来定义加盐多少,也决定了加密的复杂度:
|
||||
* <p>
|
||||
* <code>
|
||||
* String strong_salt = BCrypt.gensalt(10)<br />
|
||||
* String stronger_salt = BCrypt.gensalt(12)<br />
|
||||
* String strong_salt = BCrypt.gensalt(10);
|
||||
* String stronger_salt = BCrypt.gensalt(12);
|
||||
* </code>
|
||||
*
|
||||
* @author Damien Miller
|
||||
@@ -192,7 +192,7 @@ public class BCrypt {
|
||||
* @throws IllegalArgumentException if maxolen is invalid
|
||||
*/
|
||||
private static byte[] decodeBase64(String s, int maxolen) throws IllegalArgumentException {
|
||||
StringBuffer rs = new StringBuffer();
|
||||
final StringBuilder rs = new StringBuilder();
|
||||
int off = 0, slen = s.length(), olen = 0;
|
||||
byte[] ret;
|
||||
byte c1, c2, c3, c4, o;
|
||||
|
||||
@@ -12,11 +12,11 @@ import cn.hutool.core.util.CharsetUtil;
|
||||
* 摘要算法工具类
|
||||
*
|
||||
* @author Looly
|
||||
*
|
||||
*/
|
||||
public class DigestUtil {
|
||||
|
||||
// ------------------------------------------------------------------------------------------- MD5
|
||||
|
||||
/**
|
||||
* 计算32位MD5摘要值
|
||||
*
|
||||
@@ -30,7 +30,7 @@ public class DigestUtil {
|
||||
/**
|
||||
* 计算32位MD5摘要值
|
||||
*
|
||||
* @param data 被摘要数据
|
||||
* @param data 被摘要数据
|
||||
* @param charset 编码
|
||||
* @return MD5摘要
|
||||
*/
|
||||
@@ -81,7 +81,7 @@ public class DigestUtil {
|
||||
/**
|
||||
* 计算32位MD5摘要值,并转为16进制字符串
|
||||
*
|
||||
* @param data 被摘要数据
|
||||
* @param data 被摘要数据
|
||||
* @param charset 编码
|
||||
* @return MD5摘要的16进制表示
|
||||
*/
|
||||
@@ -92,7 +92,7 @@ public class DigestUtil {
|
||||
/**
|
||||
* 计算32位MD5摘要值,并转为16进制字符串
|
||||
*
|
||||
* @param data 被摘要数据
|
||||
* @param data 被摘要数据
|
||||
* @param charset 编码
|
||||
* @return MD5摘要的16进制表示
|
||||
* @since 4.6.0
|
||||
@@ -132,6 +132,7 @@ public class DigestUtil {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------- MD5 16
|
||||
|
||||
/**
|
||||
* 计算16位MD5摘要值,并转为16进制字符串
|
||||
*
|
||||
@@ -146,7 +147,7 @@ public class DigestUtil {
|
||||
/**
|
||||
* 计算16位MD5摘要值,并转为16进制字符串
|
||||
*
|
||||
* @param data 被摘要数据
|
||||
* @param data 被摘要数据
|
||||
* @param charset 编码
|
||||
* @return MD5摘要的16进制表示
|
||||
* @since 4.6.0
|
||||
@@ -200,6 +201,7 @@ public class DigestUtil {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------- SHA-1
|
||||
|
||||
/**
|
||||
* 计算SHA-1摘要值
|
||||
*
|
||||
@@ -213,7 +215,7 @@ public class DigestUtil {
|
||||
/**
|
||||
* 计算SHA-1摘要值
|
||||
*
|
||||
* @param data 被摘要数据
|
||||
* @param data 被摘要数据
|
||||
* @param charset 编码
|
||||
* @return SHA-1摘要
|
||||
*/
|
||||
@@ -264,7 +266,7 @@ public class DigestUtil {
|
||||
/**
|
||||
* 计算SHA-1摘要值,并转为16进制字符串
|
||||
*
|
||||
* @param data 被摘要数据
|
||||
* @param data 被摘要数据
|
||||
* @param charset 编码
|
||||
* @return SHA-1摘要的16进制表示
|
||||
*/
|
||||
@@ -303,6 +305,7 @@ public class DigestUtil {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------- SHA-256
|
||||
|
||||
/**
|
||||
* 计算SHA-256摘要值
|
||||
*
|
||||
@@ -317,7 +320,7 @@ public class DigestUtil {
|
||||
/**
|
||||
* 计算SHA-256摘要值
|
||||
*
|
||||
* @param data 被摘要数据
|
||||
* @param data 被摘要数据
|
||||
* @param charset 编码
|
||||
* @return SHA-256摘要
|
||||
* @since 3.0.8
|
||||
@@ -373,7 +376,7 @@ public class DigestUtil {
|
||||
/**
|
||||
* 计算SHA-256摘要值,并转为16进制字符串
|
||||
*
|
||||
* @param data 被摘要数据
|
||||
* @param data 被摘要数据
|
||||
* @param charset 编码
|
||||
* @return SHA-256摘要的16进制表示
|
||||
* @since 3.0.8
|
||||
@@ -416,11 +419,12 @@ public class DigestUtil {
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------- Hmac
|
||||
|
||||
/**
|
||||
* 创建HMac对象,调用digest方法可获得hmac值
|
||||
*
|
||||
* @param algorithm {@link HmacAlgorithm}
|
||||
* @param key 密钥,如果为<code>null</code>生成随机密钥
|
||||
* @param key 密钥,如果为<code>null</code>生成随机密钥
|
||||
* @return {@link HMac}
|
||||
* @since 3.0.3
|
||||
*/
|
||||
@@ -432,7 +436,7 @@ public class DigestUtil {
|
||||
* 创建HMac对象,调用digest方法可获得hmac值
|
||||
*
|
||||
* @param algorithm {@link HmacAlgorithm}
|
||||
* @param key 密钥{@link SecretKey},如果为<code>null</code>生成随机密钥
|
||||
* @param key 密钥{@link SecretKey},如果为<code>null</code>生成随机密钥
|
||||
* @return {@link HMac}
|
||||
* @since 3.0.3
|
||||
*/
|
||||
@@ -477,6 +481,7 @@ public class DigestUtil {
|
||||
* 验证密码是否与Bcrypt加密后的密文匹配
|
||||
*
|
||||
* @param password 明文密码
|
||||
* @param hashed hash值(加密后的值)
|
||||
* @return 是否匹配
|
||||
* @since 4.1.1
|
||||
*/
|
||||
|
||||
@@ -29,21 +29,23 @@ import cn.hutool.db.sql.Wrapper;
|
||||
* 提供抽象方法getConnection和closeConnection,用于自定义数据库连接的打开和关闭
|
||||
*
|
||||
* @author Luxiaolei
|
||||
*
|
||||
*/
|
||||
public abstract class AbstractDb implements Serializable{
|
||||
public abstract class AbstractDb implements Serializable {
|
||||
private static final long serialVersionUID = 3858951941916349062L;
|
||||
|
||||
protected DataSource ds;
|
||||
/** 是否支持事务 */
|
||||
/**
|
||||
* 是否支持事务
|
||||
*/
|
||||
protected Boolean isSupportTransaction = null;
|
||||
protected SqlConnRunner runner;
|
||||
|
||||
// ------------------------------------------------------- Constructor start
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param ds 数据源
|
||||
* @param ds 数据源
|
||||
* @param dialect 数据库方言
|
||||
*/
|
||||
public AbstractDb(DataSource ds, Dialect dialect) {
|
||||
@@ -71,7 +73,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
/**
|
||||
* 查询
|
||||
*
|
||||
* @param sql 查询语句
|
||||
* @param sql 查询语句
|
||||
* @param params 参数
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -84,11 +86,10 @@ public abstract class AbstractDb implements Serializable{
|
||||
/**
|
||||
* 查询
|
||||
*
|
||||
* @param <T> 结果集需要处理的对象类型
|
||||
*
|
||||
* @param sql 查询语句
|
||||
* @param <T> 结果集需要处理的对象类型
|
||||
* @param sql 查询语句
|
||||
* @param beanClass 元素Bean类型
|
||||
* @param params 参数
|
||||
* @param params 参数
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
* @since 3.2.2
|
||||
@@ -100,7 +101,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
/**
|
||||
* 查询单条记录
|
||||
*
|
||||
* @param sql 查询语句
|
||||
* @param sql 查询语句
|
||||
* @param params 参数
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -112,7 +113,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
/**
|
||||
* 查询单条单个字段记录,并将其转换为Number
|
||||
*
|
||||
* @param sql 查询语句
|
||||
* @param sql 查询语句
|
||||
* @param params 参数
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -124,7 +125,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
/**
|
||||
* 查询单条单个字段记录,并将其转换为String
|
||||
*
|
||||
* @param sql 查询语句
|
||||
* @param sql 查询语句
|
||||
* @param params 参数
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -136,9 +137,9 @@ public abstract class AbstractDb implements Serializable{
|
||||
/**
|
||||
* 查询
|
||||
*
|
||||
* @param <T> 结果集需要处理的对象类型
|
||||
* @param sql 查询语句
|
||||
* @param rsh 结果集处理对象
|
||||
* @param <T> 结果集需要处理的对象类型
|
||||
* @param sql 查询语句
|
||||
* @param rsh 结果集处理对象
|
||||
* @param params 参数
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -157,7 +158,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 执行非查询语句<br>
|
||||
* 语句包括 插入、更新、删除
|
||||
*
|
||||
* @param sql SQL
|
||||
* @param sql SQL
|
||||
* @param params 参数
|
||||
* @return 影响行数
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -176,7 +177,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 执行非查询语句<br>
|
||||
* 语句包括 插入、更新、删除
|
||||
*
|
||||
* @param sql SQL
|
||||
* @param sql SQL
|
||||
* @param params 参数
|
||||
* @return 主键
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -194,7 +195,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
/**
|
||||
* 批量执行非查询语句
|
||||
*
|
||||
* @param sql SQL
|
||||
* @param sql SQL
|
||||
* @param paramsBatch 批量的参数
|
||||
* @return 每个SQL执行影响的行数
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -228,6 +229,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------- CRUD start
|
||||
|
||||
/**
|
||||
* 插入数据
|
||||
*
|
||||
@@ -250,7 +252,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 根据给定的字段名查询数据,如果存在则更新这些数据,否则执行插入
|
||||
*
|
||||
* @param record 记录
|
||||
* @param keys 需要检查唯一性的字段
|
||||
* @param keys 需要检查唯一性的字段
|
||||
* @return 插入行数
|
||||
* @throws SQLException SQL执行异常
|
||||
* @since 4.0.10
|
||||
@@ -322,8 +324,8 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 删除数据
|
||||
*
|
||||
* @param tableName 表名
|
||||
* @param field 字段名,最好是主键
|
||||
* @param value 值,值可以是列表或数组,被当作IN查询处理
|
||||
* @param field 字段名,最好是主键
|
||||
* @param value 值,值可以是列表或数组,被当作IN查询处理
|
||||
* @return 删除行数
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -353,7 +355,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 更新条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param record 记录
|
||||
* @param where 条件
|
||||
* @param where 条件
|
||||
* @return 影响行数
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -368,14 +370,15 @@ public abstract class AbstractDb implements Serializable{
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------- Get start
|
||||
|
||||
/**
|
||||
* 根据某个字段(最好是唯一字段)查询单个记录<br>
|
||||
* 当有多条返回时,只显示查询到的第一条
|
||||
*
|
||||
* @param <T> 字段值类型
|
||||
* @param <T> 字段值类型
|
||||
* @param tableName 表名
|
||||
* @param field 字段名
|
||||
* @param value 字段值
|
||||
* @param field 字段名
|
||||
* @param value 字段值
|
||||
* @return 记录
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -400,10 +403,10 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 查询<br>
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param <T> 需要处理成的结果对象类型
|
||||
* @param <T> 需要处理成的结果对象类型
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param rsh 结果集处理对象
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param rsh 结果集处理对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -422,7 +425,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @return 结果Entity列表
|
||||
* @throws SQLException SQL执行异常
|
||||
* @since 4.5.16
|
||||
@@ -435,9 +438,9 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 查询<br>
|
||||
* Query为查询所需数据的一个实体类,此对象中可以定义返回字段、查询条件,查询的表、分页等信息
|
||||
*
|
||||
* @param <T> 需要处理成的结果对象类型
|
||||
* @param <T> 需要处理成的结果对象类型
|
||||
* @param query {@link Query}对象,此对象中可以定义返回字段、查询条件,查询的表、分页等信息
|
||||
* @param rsh 结果集处理对象
|
||||
* @param rsh 结果集处理对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
* @since 4.0.0
|
||||
@@ -456,9 +459,9 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 查询,返回所有字段<br>
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param <T> 需要处理成的结果对象类型
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param rsh 结果集处理对象
|
||||
* @param <T> 需要处理成的结果对象类型
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param rsh 结果集处理对象
|
||||
* @param fields 字段列表,可变长参数如果无值表示查询全部字段
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -484,8 +487,9 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 查询数据列表,返回字段由where参数指定<br>
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param <T> Bean类型
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param beanClass Bean类
|
||||
* @return 数据对象列表
|
||||
* @throws SQLException SQL执行异常
|
||||
* @since 3.2.2
|
||||
@@ -510,7 +514,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 查询数据列表,返回所有字段<br>
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param <T> Bean类型
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @return 数据对象列表
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -535,8 +539,8 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 根据某个字段名条件查询数据列表,返回所有字段
|
||||
*
|
||||
* @param tableName 表名
|
||||
* @param field 字段名
|
||||
* @param value 字段值
|
||||
* @param field 字段名
|
||||
* @param value 字段值
|
||||
* @return 数据对象列表
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -548,7 +552,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 根据多个条件查询数据列表,返回所有字段
|
||||
*
|
||||
* @param tableName 表名
|
||||
* @param wheres 字段名
|
||||
* @param wheres 字段名
|
||||
* @return 数据对象列表
|
||||
* @throws SQLException SQL执行异常
|
||||
* @since 4.0.0
|
||||
@@ -562,9 +566,9 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 根据某个字段名条件查询数据列表,返回所有字段
|
||||
*
|
||||
* @param tableName 表名
|
||||
* @param field 字段名
|
||||
* @param value 字段值
|
||||
* @param likeType {@link LikeType}
|
||||
* @param field 字段名
|
||||
* @param value 字段值
|
||||
* @param likeType {@link LikeType}
|
||||
* @return 数据对象列表
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -593,12 +597,12 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 分页查询<br>
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param <T> 结果对象类型
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 页码,0表示第一页
|
||||
* @param <T> 结果对象类型
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 页码,0表示第一页
|
||||
* @param numPerPage 每页条目数
|
||||
* @param rsh 结果集处理对象
|
||||
* @param rsh 结果集处理对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -616,11 +620,11 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 分页查询<br>
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param <T> 结果对象类型
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 页码,0表示第一页
|
||||
* @param <T> 结果对象类型
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 页码,0表示第一页
|
||||
* @param numPerPage 每页条目数
|
||||
* @param rsh 结果集处理对象
|
||||
* @param rsh 结果集处理对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
* @since 3.2.2
|
||||
@@ -633,8 +637,8 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 分页查询,结果为Entity列表,不计算总数<br>
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 页码,0表示第一页
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 页码,0表示第一页
|
||||
* @param numPerPage 每页条目数
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -649,7 +653,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @param page 分页对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
* @since 3.2.2
|
||||
@@ -662,10 +666,10 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 分页查询<br>
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param <T> 结果对象类型
|
||||
* @param <T> 结果对象类型
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @param rsh 结果集处理对象
|
||||
* @param page 分页对象
|
||||
* @param rsh 结果集处理对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
* @since 3.2.2
|
||||
@@ -678,11 +682,11 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 分页查询<br>
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param <T> 结果对象类型
|
||||
* @param <T> 结果对象类型
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @param rsh 结果集处理对象
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @param rsh 结果集处理对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -700,9 +704,9 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 分页查询<br>
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @param numPerPage 每页条目数
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -722,8 +726,8 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -741,8 +745,8 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 分页查询<br>
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 页码
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 页码
|
||||
* @param numPerPage 每页条目数
|
||||
* @return 分页结果集
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -757,7 +761,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
|
||||
*
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @param page 分页对象
|
||||
* @return 分页结果集
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -767,6 +771,7 @@ public abstract class AbstractDb implements Serializable{
|
||||
// ---------------------------------------------------------------------------- CRUD end
|
||||
|
||||
// ---------------------------------------------------------------------------- Getters and Setters start
|
||||
|
||||
/**
|
||||
* 获取{@link SqlConnRunner}
|
||||
*
|
||||
@@ -821,11 +826,12 @@ public abstract class AbstractDb implements Serializable{
|
||||
// ---------------------------------------------------------------------------- Getters and Setters end
|
||||
|
||||
// ---------------------------------------------------------------------------- protected method start
|
||||
|
||||
/**
|
||||
* 检查数据库是否支持事务,此项检查同一个数据源只检查一次,如果不支持抛出DbRuntimeException异常
|
||||
*
|
||||
* @param conn Connection
|
||||
* @throws SQLException 获取元数据信息失败
|
||||
* @throws SQLException 获取元数据信息失败
|
||||
* @throws DbRuntimeException 不支持事务
|
||||
*/
|
||||
protected void checkTransactionSupported(Connection conn) throws SQLException, DbRuntimeException {
|
||||
|
||||
@@ -123,8 +123,6 @@ public class Session extends AbstractDb implements Closeable {
|
||||
public void commit() throws SQLException {
|
||||
try {
|
||||
getConnection().commit();
|
||||
} catch (SQLException e) {
|
||||
throw e;
|
||||
} finally {
|
||||
try {
|
||||
getConnection().setAutoCommit(true); // 事务结束,恢复自动提交
|
||||
@@ -142,8 +140,6 @@ public class Session extends AbstractDb implements Closeable {
|
||||
public void rollback() throws SQLException {
|
||||
try {
|
||||
getConnection().rollback();
|
||||
} catch (SQLException e) {
|
||||
throw e;
|
||||
} finally {
|
||||
try {
|
||||
getConnection().setAutoCommit(true); // 事务结束,恢复自动提交
|
||||
@@ -180,8 +176,6 @@ public class Session extends AbstractDb implements Closeable {
|
||||
public void rollback(Savepoint savepoint) throws SQLException {
|
||||
try {
|
||||
getConnection().rollback(savepoint);
|
||||
} catch (SQLException e) {
|
||||
throw e;
|
||||
} finally {
|
||||
try {
|
||||
getConnection().setAutoCommit(true); // 事务结束,恢复自动提交
|
||||
@@ -195,9 +189,8 @@ public class Session extends AbstractDb implements Closeable {
|
||||
* 静默回滚到某个保存点,保存点的设置请使用setSavepoint方法
|
||||
*
|
||||
* @param savepoint 保存点
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public void quietRollback(Savepoint savepoint) throws SQLException {
|
||||
public void quietRollback(Savepoint savepoint) {
|
||||
try {
|
||||
getConnection().rollback(savepoint);
|
||||
} catch (Exception e) {
|
||||
@@ -255,7 +248,7 @@ public class Session extends AbstractDb implements Closeable {
|
||||
* 在事务中执行操作,通过实现{@link VoidFunc0}接口的call方法执行多条SQL语句从而完成事务
|
||||
*
|
||||
* @param func 函数抽象,在函数中执行多个SQL操作,多个操作会被合并为同一事务
|
||||
* @throws SQLException
|
||||
* @throws SQLException SQL异常
|
||||
* @since 3.2.3
|
||||
*/
|
||||
public void tx(VoidFunc1<Session> func) throws SQLException {
|
||||
|
||||
@@ -28,10 +28,10 @@ import java.util.List;
|
||||
* SQL执行类<br>
|
||||
* 此执行类只接受方言参数,不需要数据源,只有在执行方法时需要数据库连接对象<br>
|
||||
* 此对象存在的意义在于,可以由使用者自定义数据库连接对象,并执行多个方法,方便事务的统一控制或减少连接对象的创建关闭
|
||||
* @author Luxiaolei
|
||||
*
|
||||
* @author Luxiaolei
|
||||
*/
|
||||
public class SqlConnRunner{
|
||||
public class SqlConnRunner {
|
||||
private Dialect dialect;
|
||||
|
||||
/**
|
||||
@@ -65,8 +65,10 @@ public class SqlConnRunner{
|
||||
}
|
||||
|
||||
//------------------------------------------------------- Constructor start
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param dialect 方言
|
||||
*/
|
||||
public SqlConnRunner(Dialect dialect) {
|
||||
@@ -75,6 +77,7 @@ public class SqlConnRunner{
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param driverClassName 驱动类名,,用于识别方言
|
||||
*/
|
||||
public SqlConnRunner(String driverClassName) {
|
||||
@@ -83,17 +86,19 @@ public class SqlConnRunner{
|
||||
//------------------------------------------------------- Constructor end
|
||||
|
||||
//---------------------------------------------------------------------------- CRUD start
|
||||
|
||||
/**
|
||||
* 插入数据<br>
|
||||
* 此方法不会关闭Connection
|
||||
* @param conn 数据库连接
|
||||
*
|
||||
* @param conn 数据库连接
|
||||
* @param record 记录
|
||||
* @return 插入行数
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public int insert(Connection conn, Entity record) throws SQLException {
|
||||
checkConn(conn);
|
||||
if(CollectionUtil.isEmpty(record)){
|
||||
if (CollectionUtil.isEmpty(record)) {
|
||||
throw new SQLException("Empty entity provided!");
|
||||
}
|
||||
PreparedStatement ps = null;
|
||||
@@ -109,17 +114,17 @@ public class SqlConnRunner{
|
||||
* 插入或更新数据<br>
|
||||
* 此方法不会关闭Connection
|
||||
*
|
||||
* @param conn 数据库连接
|
||||
* @param conn 数据库连接
|
||||
* @param record 记录
|
||||
* @param keys 需要检查唯一性的字段
|
||||
* @param keys 需要检查唯一性的字段
|
||||
* @return 插入行数
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public int insertOrUpdate(Connection conn, Entity record, String... keys) throws SQLException {
|
||||
final Entity where = record.filter(keys);
|
||||
if(MapUtil.isNotEmpty(where) && count(conn, where) > 0) {
|
||||
if (MapUtil.isNotEmpty(where) && count(conn, where) > 0) {
|
||||
return update(conn, record, where);
|
||||
}else {
|
||||
} else {
|
||||
return insert(conn, record);
|
||||
}
|
||||
}
|
||||
@@ -130,7 +135,7 @@ public class SqlConnRunner{
|
||||
* 也就是说假如第一条数据只有2个字段,后边数据多于这两个字段的部分将被抛弃。
|
||||
* 此方法不会关闭Connection
|
||||
*
|
||||
* @param conn 数据库连接
|
||||
* @param conn 数据库连接
|
||||
* @param records 记录列表,记录KV必须严格一致
|
||||
* @return 插入行数
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -144,20 +149,20 @@ public class SqlConnRunner{
|
||||
* 批量插入必须严格保持Entity的结构一致,不一致会导致插入数据出现不可预知的结果<br>
|
||||
* 此方法不会关闭Connection
|
||||
*
|
||||
* @param conn 数据库连接
|
||||
* @param conn 数据库连接
|
||||
* @param records 记录列表,记录KV必须严格一致
|
||||
* @return 插入行数
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public int[] insert(Connection conn, Entity... records) throws SQLException {
|
||||
checkConn(conn);
|
||||
if(ArrayUtil.isEmpty(records)){
|
||||
if (ArrayUtil.isEmpty(records)) {
|
||||
return new int[]{0};
|
||||
}
|
||||
|
||||
//单条单独处理
|
||||
if(1 == records.length) {
|
||||
return new int[] { insert(conn, records[0])};
|
||||
if (1 == records.length) {
|
||||
return new int[]{insert(conn, records[0])};
|
||||
}
|
||||
|
||||
PreparedStatement ps = null;
|
||||
@@ -172,14 +177,15 @@ public class SqlConnRunner{
|
||||
/**
|
||||
* 插入数据<br>
|
||||
* 此方法不会关闭Connection
|
||||
* @param conn 数据库连接
|
||||
*
|
||||
* @param conn 数据库连接
|
||||
* @param record 记录
|
||||
* @return 主键列表
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public List<Object> insertForGeneratedKeys(Connection conn, Entity record) throws SQLException {
|
||||
checkConn(conn);
|
||||
if(CollectionUtil.isEmpty(record)){
|
||||
if (CollectionUtil.isEmpty(record)) {
|
||||
throw new SQLException("Empty entity provided!");
|
||||
}
|
||||
|
||||
@@ -196,14 +202,15 @@ public class SqlConnRunner{
|
||||
/**
|
||||
* 插入数据<br>
|
||||
* 此方法不会关闭Connection
|
||||
* @param conn 数据库连接
|
||||
*
|
||||
* @param conn 数据库连接
|
||||
* @param record 记录
|
||||
* @return 自增主键
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public Long insertForGeneratedKey(Connection conn, Entity record) throws SQLException {
|
||||
checkConn(conn);
|
||||
if(CollectionUtil.isEmpty(record)){
|
||||
if (CollectionUtil.isEmpty(record)) {
|
||||
throw new SQLException("Empty entity provided!");
|
||||
}
|
||||
|
||||
@@ -220,14 +227,15 @@ public class SqlConnRunner{
|
||||
/**
|
||||
* 删除数据<br>
|
||||
* 此方法不会关闭Connection
|
||||
* @param conn 数据库连接
|
||||
*
|
||||
* @param conn 数据库连接
|
||||
* @param where 条件
|
||||
* @return 影响行数
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public int del(Connection conn, Entity where) throws SQLException {
|
||||
checkConn(conn);
|
||||
if(CollectionUtil.isEmpty(where)){
|
||||
if (CollectionUtil.isEmpty(where)) {
|
||||
//不允许做全表删除
|
||||
throw new SQLException("Empty entity provided!");
|
||||
}
|
||||
@@ -245,25 +253,26 @@ public class SqlConnRunner{
|
||||
/**
|
||||
* 更新数据<br>
|
||||
* 此方法不会关闭Connection
|
||||
* @param conn 数据库连接
|
||||
*
|
||||
* @param conn 数据库连接
|
||||
* @param record 记录
|
||||
* @param where 条件
|
||||
* @param where 条件
|
||||
* @return 影响行数
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public int update(Connection conn, Entity record, Entity where) throws SQLException {
|
||||
checkConn(conn);
|
||||
if(CollectionUtil.isEmpty(record)){
|
||||
if (CollectionUtil.isEmpty(record)) {
|
||||
throw new SQLException("Empty entity provided!");
|
||||
}
|
||||
if(CollectionUtil.isEmpty(where)){
|
||||
if (CollectionUtil.isEmpty(where)) {
|
||||
//不允许做全表更新
|
||||
throw new SQLException("Empty where provided!");
|
||||
}
|
||||
|
||||
//表名可以从被更新记录的Entity中获得,也可以从Where中获得
|
||||
String tableName = record.getTableName();
|
||||
if(StrUtil.isBlank(tableName)){
|
||||
if (StrUtil.isBlank(tableName)) {
|
||||
tableName = where.getTableName();
|
||||
record.setTableName(tableName);
|
||||
}
|
||||
@@ -282,10 +291,10 @@ public class SqlConnRunner{
|
||||
* 查询<br>
|
||||
* 此方法不会关闭Connection
|
||||
*
|
||||
* @param <T> 结果对象类型
|
||||
* @param conn 数据库连接对象
|
||||
* @param <T> 结果对象类型
|
||||
* @param conn 数据库连接对象
|
||||
* @param query {@link Query}
|
||||
* @param rsh 结果集处理对象
|
||||
* @param rsh 结果集处理对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -306,11 +315,11 @@ public class SqlConnRunner{
|
||||
* 查询<br>
|
||||
* 此方法不会关闭Connection
|
||||
*
|
||||
* @param <T> 结果对象类型
|
||||
* @param conn 数据库连接对象
|
||||
* @param <T> 结果对象类型
|
||||
* @param conn 数据库连接对象
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param rsh 结果集处理对象
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param rsh 结果集处理对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -324,10 +333,10 @@ public class SqlConnRunner{
|
||||
* 查询,返回指定字段列表<br>
|
||||
* 此方法不会关闭Connection
|
||||
*
|
||||
* @param <T> 结果对象类型
|
||||
* @param conn 数据库连接对象
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param rsh 结果集处理对象
|
||||
* @param <T> 结果对象类型
|
||||
* @param conn 数据库连接对象
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param rsh 结果集处理对象
|
||||
* @param fields 字段列表,可变长参数如果无值表示查询全部字段
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -339,86 +348,87 @@ public class SqlConnRunner{
|
||||
/**
|
||||
* 查询数据列表,返回字段在where参数中定义
|
||||
*
|
||||
* @param conn 数据库连接对象
|
||||
* @param conn 数据库连接对象
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @return 数据对象列表
|
||||
* @throws SQLException SQL执行异常
|
||||
* @since 3.2.1
|
||||
*/
|
||||
public List<Entity> find(Connection conn, Entity where) throws SQLException{
|
||||
public List<Entity> find(Connection conn, Entity where) throws SQLException {
|
||||
return find(conn, where.getFieldNames(), where, EntityListHandler.create());
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询数据列表,返回所有字段
|
||||
*
|
||||
* @param conn 数据库连接对象
|
||||
* @param conn 数据库连接对象
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @return 数据对象列表
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public List<Entity> findAll(Connection conn, Entity where) throws SQLException{
|
||||
public List<Entity> findAll(Connection conn, Entity where) throws SQLException {
|
||||
return find(conn, where, EntityListHandler.create());
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询数据列表,返回所有字段
|
||||
*
|
||||
* @param conn 数据库连接对象
|
||||
* @param conn 数据库连接对象
|
||||
* @param tableName 表名
|
||||
* @return 数据对象列表
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public List<Entity> findAll(Connection conn, String tableName) throws SQLException{
|
||||
public List<Entity> findAll(Connection conn, String tableName) throws SQLException {
|
||||
return findAll(conn, Entity.create(tableName));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据某个字段名条件查询数据列表,返回所有字段
|
||||
*
|
||||
* @param conn 数据库连接对象
|
||||
* @param conn 数据库连接对象
|
||||
* @param tableName 表名
|
||||
* @param field 字段名
|
||||
* @param value 字段值
|
||||
* @param field 字段名
|
||||
* @param value 字段值
|
||||
* @return 数据对象列表
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public List<Entity> findBy(Connection conn, String tableName, String field, Object value) throws SQLException{
|
||||
public List<Entity> findBy(Connection conn, String tableName, String field, Object value) throws SQLException {
|
||||
return findAll(conn, Entity.create(tableName).set(field, value));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据某个字段名条件查询数据列表,返回所有字段
|
||||
*
|
||||
* @param conn 数据库连接对象
|
||||
* @param conn 数据库连接对象
|
||||
* @param tableName 表名
|
||||
* @param field 字段名
|
||||
* @param value 字段值
|
||||
* @param likeType {@link LikeType}
|
||||
* @param field 字段名
|
||||
* @param value 字段值
|
||||
* @param likeType {@link LikeType}
|
||||
* @return 数据对象列表
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public List<Entity> findLike(Connection conn, String tableName, String field, String value, LikeType likeType) throws SQLException{
|
||||
public List<Entity> findLike(Connection conn, String tableName, String field, String value, LikeType likeType) throws SQLException {
|
||||
return findAll(conn, Entity.create(tableName).set(field, SqlUtil.buildLikeValue(value, likeType, true)));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据某个字段名条件查询数据列表,返回所有字段
|
||||
*
|
||||
* @param conn 数据库连接对象
|
||||
* @param conn 数据库连接对象
|
||||
* @param tableName 表名
|
||||
* @param field 字段名
|
||||
* @param values 字段值列表
|
||||
* @param field 字段名
|
||||
* @param values 字段值列表
|
||||
* @return 数据对象列表
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public List<Entity> findIn(Connection conn, String tableName, String field, Object... values) throws SQLException{
|
||||
public List<Entity> findIn(Connection conn, String tableName, String field, Object... values) throws SQLException {
|
||||
return findAll(conn, Entity.create(tableName).set(field, values));
|
||||
}
|
||||
|
||||
/**
|
||||
* 结果的条目数
|
||||
* @param conn 数据库连接对象
|
||||
*
|
||||
* @param conn 数据库连接对象
|
||||
* @param where 查询条件
|
||||
* @return 复合条件的结果数
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -440,13 +450,13 @@ public class SqlConnRunner{
|
||||
* 分页查询<br>
|
||||
* 此方法不会关闭Connection
|
||||
*
|
||||
* @param <T> 结果对象类型
|
||||
* @param conn 数据库连接对象
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param <T> 结果对象类型
|
||||
* @param conn 数据库连接对象
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param pageNumber 页码
|
||||
* @param numPerPage 每页条目数
|
||||
* @param rsh 结果集处理对象
|
||||
* @param rsh 结果集处理对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -458,18 +468,18 @@ public class SqlConnRunner{
|
||||
* 分页查询<br>
|
||||
* 此方法不会关闭Connection
|
||||
*
|
||||
* @param <T> 结果对象类型
|
||||
* @param conn 数据库连接对象
|
||||
* @param <T> 结果对象类型
|
||||
* @param conn 数据库连接对象
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @param rsh 结果集处理对象
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @param rsh 结果集处理对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
public <T> T page(Connection conn, Collection<String> fields, Entity where, Page page, RsHandler<T> rsh) throws SQLException {
|
||||
checkConn(conn);
|
||||
if(null == page){
|
||||
if (null == page) {
|
||||
return this.find(conn, fields, where, rsh);
|
||||
}
|
||||
|
||||
@@ -483,10 +493,10 @@ public class SqlConnRunner{
|
||||
* 分页查询<br>
|
||||
* 此方法不会关闭Connection
|
||||
*
|
||||
* @param conn 数据库连接对象
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 页码
|
||||
* @param conn 数据库连接对象
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 页码
|
||||
* @param numPerPage 每页条目数
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
@@ -503,10 +513,10 @@ public class SqlConnRunner{
|
||||
* 分页查询<br>
|
||||
* 此方法不会关闭Connection
|
||||
*
|
||||
* @param conn 数据库连接对象
|
||||
* @param conn 数据库连接对象
|
||||
* @param fields 返回的字段列表,null则返回所有字段
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -514,7 +524,7 @@ public class SqlConnRunner{
|
||||
checkConn(conn);
|
||||
|
||||
//查询全部
|
||||
if(null == page){
|
||||
if (null == page) {
|
||||
List<Entity> entityList = this.find(conn, fields, where, new EntityListHandler());
|
||||
final PageResult<Entity> pageResult = new PageResult<>(0, entityList.size(), entityList.size());
|
||||
pageResult.addAll(entityList);
|
||||
@@ -530,9 +540,9 @@ public class SqlConnRunner{
|
||||
* 分页全字段查询<br>
|
||||
* 此方法不会关闭Connection
|
||||
*
|
||||
* @param conn 数据库连接对象
|
||||
* @param conn 数据库连接对象
|
||||
* @param where 条件实体类(包含表名)
|
||||
* @param page 分页对象
|
||||
* @param page 分页对象
|
||||
* @return 结果对象
|
||||
* @throws SQLException SQL执行异常
|
||||
*/
|
||||
@@ -542,15 +552,19 @@ public class SqlConnRunner{
|
||||
//---------------------------------------------------------------------------- CRUD end
|
||||
|
||||
//---------------------------------------------------------------------------- Getters and Setters end
|
||||
|
||||
/**
|
||||
* @return SQL方言
|
||||
*/
|
||||
public Dialect getDialect() {
|
||||
return dialect;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置SQL方言
|
||||
*
|
||||
* @param dialect 方言
|
||||
* @return this
|
||||
*/
|
||||
public SqlConnRunner setDialect(Dialect dialect) {
|
||||
this.dialect = dialect;
|
||||
@@ -559,6 +573,7 @@ public class SqlConnRunner{
|
||||
|
||||
/**
|
||||
* 设置包装器,包装器用于对表名、字段名进行符号包装(例如双引号),防止关键字与这些表名或字段冲突
|
||||
*
|
||||
* @param wrapperChar 包装字符,字符会在SQL生成时位于表名和字段名两边,null时表示取消包装
|
||||
* @return this
|
||||
* @since 4.0.0
|
||||
@@ -569,6 +584,7 @@ public class SqlConnRunner{
|
||||
|
||||
/**
|
||||
* 设置包装器,包装器用于对表名、字段名进行符号包装(例如双引号),防止关键字与这些表名或字段冲突
|
||||
*
|
||||
* @param wrapper 包装器,null表示取消包装
|
||||
* @return this
|
||||
* @since 4.0.0
|
||||
@@ -580,8 +596,8 @@ public class SqlConnRunner{
|
||||
//---------------------------------------------------------------------------- Getters and Setters end
|
||||
|
||||
//---------------------------------------------------------------------------- Private method start
|
||||
private void checkConn(Connection conn){
|
||||
if(null == conn){
|
||||
private void checkConn(Connection conn) {
|
||||
if (null == conn) {
|
||||
throw new NullPointerException("Connection object is null!");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ public enum ThreadLocalConnection {
|
||||
*
|
||||
* @param ds 数据源
|
||||
* @return Connection
|
||||
* @throws SQLException
|
||||
* @throws SQLException SQL异常
|
||||
*/
|
||||
public Connection get(DataSource ds) throws SQLException {
|
||||
Connection conn = connMap.get(ds);
|
||||
|
||||
@@ -140,7 +140,7 @@ public abstract class DSFactory implements Closeable, Serializable{
|
||||
/**
|
||||
* 创建数据源实现工厂<br>
|
||||
* 此方法通过“试错”方式查找引入项目的连接池库,按照优先级寻找,一旦寻找到则创建对应的数据源工厂<br>
|
||||
* 连接池优先级:Hikari > Druid > Tomcat > Dbcp > C3p0 > Hutool Pooled
|
||||
* 连接池优先级:Hikari > Druid > Tomcat > Dbcp > C3p0 > Hutool Pooled
|
||||
*
|
||||
* @return 日志实现类
|
||||
*/
|
||||
@@ -153,7 +153,7 @@ public abstract class DSFactory implements Closeable, Serializable{
|
||||
/**
|
||||
* 创建数据源实现工厂<br>
|
||||
* 此方法通过“试错”方式查找引入项目的连接池库,按照优先级寻找,一旦寻找到则创建对应的数据源工厂<br>
|
||||
* 连接池优先级:Hikari > Druid > Tomcat > Dbcp > C3p0 > Hutool Pooled
|
||||
* 连接池优先级:Hikari > Druid > Tomcat > Dbcp > C3p0 > Hutool Pooled
|
||||
*
|
||||
* @return 日志实现类
|
||||
* @since 4.1.3
|
||||
|
||||
@@ -29,8 +29,9 @@ public class DataSourceWrapper implements DataSource, Closeable, Cloneable {
|
||||
/**
|
||||
* 包装指定的DataSource
|
||||
*
|
||||
* @param ds 原始的DataSource
|
||||
* @param ds 原始的DataSource
|
||||
* @param driver 数据库驱动类名
|
||||
* @return {@link DataSourceWrapper}
|
||||
*/
|
||||
public static DataSourceWrapper wrap(DataSource ds, String driver) {
|
||||
return new DataSourceWrapper(ds, driver);
|
||||
@@ -39,7 +40,7 @@ public class DataSourceWrapper implements DataSource, Closeable, Cloneable {
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param ds 原始的DataSource
|
||||
* @param ds 原始的DataSource
|
||||
* @param driver 数据库驱动类名
|
||||
*/
|
||||
public DataSourceWrapper(DataSource ds, String driver) {
|
||||
|
||||
@@ -30,6 +30,7 @@ public class HandleHelper {
|
||||
/**
|
||||
* 处理单条数据
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param columnCount 列数
|
||||
* @param meta ResultSetMetaData
|
||||
* @param rs 数据集
|
||||
@@ -45,6 +46,7 @@ public class HandleHelper {
|
||||
/**
|
||||
* 处理单条数据
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param columnCount 列数
|
||||
* @param meta ResultSetMetaData
|
||||
* @param rs 数据集
|
||||
@@ -84,8 +86,8 @@ public class HandleHelper {
|
||||
final Map<String, PropDesc> propMap = BeanUtil.getBeanDesc(beanClass).getPropMap(true);
|
||||
String columnLabel;
|
||||
PropDesc pd;
|
||||
Method setter = null;
|
||||
Object value = null;
|
||||
Method setter;
|
||||
Object value;
|
||||
for (int i = 1; i <= columnCount; i++) {
|
||||
columnLabel = meta.getColumnLabel(i);
|
||||
pd = propMap.get(columnLabel);
|
||||
|
||||
@@ -30,6 +30,7 @@ public enum SqlLog {
|
||||
* @param isShowSql 是否显示SQL
|
||||
* @param isFormatSql 是否格式化显示的SQL
|
||||
* @param isShowParams 是否打印参数
|
||||
* @param level 日志级别
|
||||
*/
|
||||
public void init(boolean isShowSql, boolean isFormatSql, boolean isShowParams, Level level) {
|
||||
this.showSql = isShowSql;
|
||||
|
||||
@@ -31,7 +31,7 @@ public class SqlUtil {
|
||||
* 构件相等条件的where语句<br>
|
||||
* 如果没有条件语句,泽返回空串,表示没有条件
|
||||
*
|
||||
* @param entity 条件实体
|
||||
* @param entity 条件实体
|
||||
* @param paramValues 条件值得存放List
|
||||
* @return 带where关键字的SQL部分
|
||||
*/
|
||||
@@ -89,7 +89,7 @@ public class SqlUtil {
|
||||
* 2、LikeType.EndWith: value%
|
||||
* 3、LikeType.Contains: %value%
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
* 如果withLikeKeyword为true,则结果为:
|
||||
*
|
||||
* <pre>
|
||||
@@ -98,8 +98,9 @@ public class SqlUtil {
|
||||
* 3、LikeType.Contains: LIKE %value%
|
||||
* </pre>
|
||||
*
|
||||
* @param value 被查找值
|
||||
* @param likeType LIKE值类型 {@link LikeType}
|
||||
* @param value 被查找值
|
||||
* @param likeType LIKE值类型 {@link LikeType}
|
||||
* @param withLikeKeyword 是否包含LIKE关键字
|
||||
* @return 拼接后的like值
|
||||
*/
|
||||
public static String buildLikeValue(String value, LikeType likeType, boolean withLikeKeyword) {
|
||||
@@ -109,18 +110,18 @@ public class SqlUtil {
|
||||
|
||||
StringBuilder likeValue = StrUtil.builder(withLikeKeyword ? "LIKE " : "");
|
||||
switch (likeType) {
|
||||
case StartWith:
|
||||
likeValue.append('%').append(value);
|
||||
break;
|
||||
case EndWith:
|
||||
likeValue.append(value).append('%');
|
||||
break;
|
||||
case Contains:
|
||||
likeValue.append('%').append(value).append('%');
|
||||
break;
|
||||
case StartWith:
|
||||
likeValue.append('%').append(value);
|
||||
break;
|
||||
case EndWith:
|
||||
likeValue.append(value).append('%');
|
||||
break;
|
||||
case Contains:
|
||||
likeValue.append('%').append(value).append('%');
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return likeValue.toString();
|
||||
}
|
||||
@@ -167,7 +168,7 @@ public class SqlUtil {
|
||||
/**
|
||||
* Blob字段值转字符串
|
||||
*
|
||||
* @param blob {@link Blob}
|
||||
* @param blob {@link Blob}
|
||||
* @param charset 编码
|
||||
* @return 字符串
|
||||
* @since 3.0.6
|
||||
@@ -187,8 +188,8 @@ public class SqlUtil {
|
||||
/**
|
||||
* 创建Blob对象
|
||||
*
|
||||
* @param conn {@link Connection}
|
||||
* @param dataStream 数据流,使用完毕后关闭
|
||||
* @param conn {@link Connection}
|
||||
* @param dataStream 数据流,使用完毕后关闭
|
||||
* @param closeAfterUse 使用完毕是否关闭流
|
||||
* @return {@link Blob}
|
||||
* @since 4.5.13
|
||||
|
||||
@@ -42,30 +42,42 @@ import cn.hutool.setting.dialect.Props;
|
||||
* </pre>
|
||||
*
|
||||
* @author looly
|
||||
*
|
||||
*/
|
||||
public class Setting extends AbsSetting implements Map<String, String> {
|
||||
private static final long serialVersionUID = 3618305164959883393L;
|
||||
|
||||
/** 默认字符集 */
|
||||
/**
|
||||
* 默认字符集
|
||||
*/
|
||||
public final static Charset DEFAULT_CHARSET = CharsetUtil.CHARSET_UTF_8;
|
||||
/** 默认配置文件扩展名 */
|
||||
/**
|
||||
* 默认配置文件扩展名
|
||||
*/
|
||||
public final static String EXT_NAME = "setting";
|
||||
|
||||
/** 附带分组的键值对存储 */
|
||||
/**
|
||||
* 附带分组的键值对存储
|
||||
*/
|
||||
private final GroupedMap groupedMap = new GroupedMap();
|
||||
|
||||
/** 本设置对象的字符集 */
|
||||
/**
|
||||
* 本设置对象的字符集
|
||||
*/
|
||||
protected Charset charset;
|
||||
/** 是否使用变量 */
|
||||
/**
|
||||
* 是否使用变量
|
||||
*/
|
||||
protected boolean isUseVariable;
|
||||
/** 设定文件的URL */
|
||||
/**
|
||||
* 设定文件的URL
|
||||
*/
|
||||
protected URL settingUrl;
|
||||
|
||||
private SettingLoader settingLoader;
|
||||
private WatchMonitor watchMonitor;
|
||||
|
||||
// ------------------------------------------------------------------------------------- Constructor start
|
||||
|
||||
/**
|
||||
* 空构造
|
||||
*/
|
||||
@@ -85,7 +97,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param path 相对路径或绝对路径
|
||||
* @param path 相对路径或绝对路径
|
||||
* @param isUseVariable 是否使用变量
|
||||
*/
|
||||
public Setting(String path, boolean isUseVariable) {
|
||||
@@ -95,8 +107,8 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
/**
|
||||
* 构造,使用相对于Class文件根目录的相对路径
|
||||
*
|
||||
* @param path 相对路径或绝对路径
|
||||
* @param charset 字符集
|
||||
* @param path 相对路径或绝对路径
|
||||
* @param charset 字符集
|
||||
* @param isUseVariable 是否使用变量
|
||||
*/
|
||||
public Setting(String path, Charset charset, boolean isUseVariable) {
|
||||
@@ -107,8 +119,8 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param configFile 配置文件对象
|
||||
* @param charset 字符集
|
||||
* @param configFile 配置文件对象
|
||||
* @param charset 字符集
|
||||
* @param isUseVariable 是否使用变量
|
||||
*/
|
||||
public Setting(File configFile, Charset charset, boolean isUseVariable) {
|
||||
@@ -119,9 +131,9 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
/**
|
||||
* 构造,相对于classes读取文件
|
||||
*
|
||||
* @param path 相对ClassPath路径或绝对路径
|
||||
* @param clazz 基准类
|
||||
* @param charset 字符集
|
||||
* @param path 相对ClassPath路径或绝对路径
|
||||
* @param clazz 基准类
|
||||
* @param charset 字符集
|
||||
* @param isUseVariable 是否使用变量
|
||||
*/
|
||||
public Setting(String path, Class<?> clazz, Charset charset, boolean isUseVariable) {
|
||||
@@ -132,8 +144,8 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param url 设定文件的URL
|
||||
* @param charset 字符集
|
||||
* @param url 设定文件的URL
|
||||
* @param charset 字符集
|
||||
* @param isUseVariable 是否使用变量
|
||||
*/
|
||||
public Setting(URL url, Charset charset, boolean isUseVariable) {
|
||||
@@ -145,8 +157,8 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
/**
|
||||
* 初始化设定文件
|
||||
*
|
||||
* @param resource {@link Resource}
|
||||
* @param charset 字符集
|
||||
* @param resource {@link Resource}
|
||||
* @param charset 字符集
|
||||
* @param isUseVariable 是否使用变量
|
||||
* @return 成功初始化与否
|
||||
*/
|
||||
@@ -305,6 +317,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------- Functions
|
||||
|
||||
/**
|
||||
* 持久化当前设置,会覆盖掉之前的设置<br>
|
||||
* 持久化不会保留之前的分组
|
||||
@@ -359,6 +372,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
* 正则只能有一个group表示变量本身,剩余为字符 例如 \$\{(name)\}表示${name}变量名为name的一个变量表示
|
||||
*
|
||||
* @param regex 正则
|
||||
* @return this
|
||||
*/
|
||||
public Setting setVarRegex(String regex) {
|
||||
if (null == this.settingLoader) {
|
||||
@@ -381,6 +395,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
}
|
||||
|
||||
// ------------------------------------------------- Map interface with group
|
||||
|
||||
/**
|
||||
* 某个分组对应的键值对是否为空
|
||||
*
|
||||
@@ -395,7 +410,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
* 指定分组中是否包含指定key
|
||||
*
|
||||
* @param group 分组
|
||||
* @param key 键
|
||||
* @param key 键
|
||||
* @return 是否包含key
|
||||
*/
|
||||
public boolean containsKey(String group, String key) {
|
||||
@@ -417,7 +432,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
* 获取分组对应的值,如果分组不存在或者值不存在则返回null
|
||||
*
|
||||
* @param group 分组
|
||||
* @param key 键
|
||||
* @param key 键
|
||||
* @return 值,如果分组不存在或者值不存在则返回null
|
||||
*/
|
||||
public String get(String group, String key) {
|
||||
@@ -428,7 +443,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
* 将键值对加入到对应分组中
|
||||
*
|
||||
* @param group 分组
|
||||
* @param key 键
|
||||
* @param key 键
|
||||
* @param value 值
|
||||
* @return 此key之前存在的值,如果没有返回null
|
||||
*/
|
||||
@@ -440,7 +455,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
* 从指定分组中删除指定值
|
||||
*
|
||||
* @param group 分组
|
||||
* @param key 键
|
||||
* @param key 键
|
||||
* @return 被删除的值,如果值不存在,返回null
|
||||
*/
|
||||
public String remove(String group, Object key) {
|
||||
@@ -451,7 +466,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
* 加入多个键值对到某个分组下
|
||||
*
|
||||
* @param group 分组
|
||||
* @param m 键值对
|
||||
* @param m 键值对
|
||||
* @return this
|
||||
*/
|
||||
public Setting putAll(String group, Map<? extends String, ? extends String> m) {
|
||||
@@ -503,7 +518,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
/**
|
||||
* 设置值
|
||||
*
|
||||
* @param key 键
|
||||
* @param key 键
|
||||
* @param value 值
|
||||
* @return this
|
||||
* @since 3.3.1
|
||||
@@ -517,7 +532,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
* 将键值对加入到对应分组中
|
||||
*
|
||||
* @param group 分组
|
||||
* @param key 键
|
||||
* @param key 键
|
||||
* @param value 值
|
||||
* @return 此key之前存在的值,如果没有返回null
|
||||
*/
|
||||
@@ -568,7 +583,7 @@ public class Setting extends AbsSetting implements Map<String, String> {
|
||||
/**
|
||||
* 将指定键值对加入到默认分组(空分组)中
|
||||
*
|
||||
* @param key 键
|
||||
* @param key 键
|
||||
* @param value 值
|
||||
* @return 加入的值
|
||||
*/
|
||||
|
||||
@@ -485,6 +485,7 @@ public final class Props extends Properties implements BasicTypeGetter<String>,
|
||||
* ['person']['friends'][5]['name']
|
||||
* </pre>
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param beanClass Bean类
|
||||
* @return Bean对象
|
||||
* @since 4.6.3
|
||||
@@ -505,6 +506,7 @@ public final class Props extends Properties implements BasicTypeGetter<String>,
|
||||
* ['person']['friends'][5]['name']
|
||||
* </pre>
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param beanClass Bean类
|
||||
* @param prefix 公共前缀,不指定前缀传null,当指定前缀后非此前缀的属性被忽略
|
||||
* @return Bean对象
|
||||
@@ -527,6 +529,7 @@ public final class Props extends Properties implements BasicTypeGetter<String>,
|
||||
* ['person']['friends'][5]['name']
|
||||
* </pre>
|
||||
*
|
||||
* @param <T> Bean类型
|
||||
* @param bean Bean对象
|
||||
* @param prefix 公共前缀,不指定前缀传null,当指定前缀后非此前缀的属性被忽略
|
||||
* @return Bean对象
|
||||
|
||||
Reference in New Issue
Block a user