1、双循环查询
public class ProcessInPageUtils {
private ProcessInPageUtils() {
}
public static <T> void doInPage(int pageSize, QueryListCallBack<T> queryListCallBack,
Processor<T> processor) {
int currentPage = 1;
List<T> ts = queryListCallBack.queryList(currentPage, pageSize);
while (ts != null && !ts.isEmpty()) {
ts.forEach(processor::process);
currentPage++;
ts = queryListCallBack.queryList(currentPage, pageSize);
}
}
public interface QueryListCallBack<T> {
List<T> queryList(int currentPage, int pageSize);
}
public interface Processor<T>{
void process(T t);
}
}
//使用方法 适用于双循环的查询
ProcessInPageUtils.doInPage(PAGE_SIZE,
(curPage, pageSize) -> this.productItemRepository.selectByBrandId(brandId, curPage, pageSize),
attributeDO -> replenishmentManager.replenishCalculated(attributeDO.getItemCode(), dateStr, channelId, brandId));
2、DESUtils
package com.hema.cloud.util;
import java.security.Key;
import java.util.Base64;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import lombok.extern.slf4j.Slf4j;
/**
* @Author lh
* @Date 2020/4/1
* @Description
*/
@Slf4j
public class DESUtil {
/**
* 偏移变量,固定占8位字节
*/
private final static String IV_PARAMETER = "12345678";
/**
* 密钥算法
*/
private static final String ALGORITHM = "DES";
/**
* 加密/解密算法-工作模式-填充模式
*/
private static final String CIPHER_ALGORITHM = "DES/CBC/PKCS5Padding";
/**
* 默认编码
*/
private static final String CHARSET = "utf-8";
/**
* 盐值长度
*/
private static final Integer SALT_LENGTH = 6;
/**
* 0-9、a~z和A~Z的随机数
*/
public static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
/**
* DES加密字符串
*
* @param password 加密密码,长度不能够小于8位
* @param data 待加密字符串
* @return 加密后内容
*/
public static String encrypt(String password, String data) {
if (password == null || password.length() < 8) {
throw new RuntimeException("加密失败,key不能小于8位");
}
if (data == null) {
return null;
}
try {
Key secretKey = generateKey(password);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
byte[] bytes = cipher.doFinal(data.getBytes(CHARSET));
//JDK1.8及以上可直接使用Base64,JDK1.7及以下可以使用BASE64Encoder
//Android平台可以使用android.util.Base64
return new String(Base64.getEncoder().encode(bytes));
} catch (Exception e) {
return null;
}
}
/**
* DES解密字符串
*
* @param password r
* @param data 待解密字符串
* @return 解密后内容
*/
public static String decrypt(String password, String data) {
if (password == null || password.length() < 8) {
throw new RuntimeException("加密失败,key不能小于8位");
}
if (data == null) {
return null;
}
try {
Key secretKey = generateKey(password);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes(CHARSET));
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
return new String(cipher.doFinal(Base64.getDecoder().decode(data.getBytes(CHARSET))), CHARSET);
} catch (Exception e) {
return null;
}
}
/**
* 生成key
*
* @param password
* @return
* @throws Exception
*/
private static Key generateKey(String password) throws Exception {
DESKeySpec dks = new DESKeySpec(password.getBytes(CHARSET));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
return keyFactory.generateSecret(dks);
}
/**
* 生成盐值,纯字符
*
* @return
*/
public static String generateSalt() {
StringBuilder code = new StringBuilder();
Random random = new Random();
for (int i = 0; i < SALT_LENGTH; i++) {
code.append((char) ('a' + random.nextInt(26)));
}
return code.toString();
}
public static String generateRandomKey(int length){
StringBuilder code = new StringBuilder();
Random random = new Random();
for (int i = 0; i < length; i++) {
code.append(allChar.charAt(random.nextInt(allChar.length())));
}
return code.toString();
}
}
在config中配置前段和后段的加解秘key
/**
* 账户密码后端DES加解密的key
*/
String PASSWORD_DES_PROVIDER_KEY = "lfdnas13io";
/**
* 账户密码前端DES加解密的key
*/
String PASSWORD_DES_CLIENT_KEY = "lwqinyw887";
// 解密处理逻辑
String decryptedPwd = DESUtil.decrypt(PASSWORD_DES_CLIENT_KEY, request.getPassword());
assertPasswordValid(decryptedPwd);
request.setPassword(decryptedPwd);
//加密处理逻辑
String salt = DESUtil.generateSalt();
accountDO.setSalt(salt);
accountDO.setPassword(encryptPassword(accountDto.getPassword(), salt));
public static String encryptPassword(String password, String salt) {
return DESUtil.encrypt(PASSWORD_DES_PROVIDER_KEY, password + CommonConstant.SEPARATE + salt);
}
3、DateUtils
package com.hema.cloud.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.TimeUnit;
@Slf4j
public class DateUtil {
public static final String DEFAULTDATEPATTERN = "yyyy-MM-dd HH:mm:ss";
public static final String DATEPATTERN_YYYY_MM_DD = "yyyy-MM-dd";
public static final String DATEPATTERN_YYYY_MM_DD_HH = "yyyy-MM-dd HH";
public static final String DATEPATTERN_YYYY_MM = "yyyy-MM";
public static final String DATEPATTERN_YYYYMMDD = "yyyyMMdd";
public static final String DATEPATTERN_YYYYMM = "yyyyMM";
/**
* 一天的秒数
*/
public static final Integer ONE_DAY_SECONDS = 60 * 60 * 24;
/**
* 24小时毫秒值
*/
public static final long H24 = TimeUnit.HOURS.toMillis(24);
/**
* 1小时毫秒值
*/
public static final long H1 = TimeUnit.HOURS.toMillis(1);
public static Date parse(String string, String pattern) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.parse(string);
}
public static Date parse2(String string, String pattern){
try {
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.parse(string);
}catch (Exception e){
log.error("date parse error. param1{}, param2:{}", string, pattern, e);
}
return null;
}
public static Date getDayEnd(Date day){
String format = new SimpleDateFormat(DATEPATTERN_YYYY_MM_DD)
.format(day);
return parse2( format + " 23:59:59", DEFAULTDATEPATTERN);
}
public static Date getDayStart(Date day){
String format = new SimpleDateFormat(DATEPATTERN_YYYY_MM_DD)
.format(day);
return parse2( format + " 00:00:00", DEFAULTDATEPATTERN);
}
public static Date getYesterdayEnd(Date day){
Calendar instance = Calendar.getInstance();
instance.setTime(day);
instance.add(Calendar.HOUR, -24);
return getDayEnd(instance.getTime());
}
/**
* 返回自定义格式字符串
*/
public static String dateToString(Date date, String pattern) {
SimpleDateFormat formatter = new SimpleDateFormat(pattern);
return formatter.format(date);
}
public static Date increaseDate(Date aDate, int days) {
Calendar cal = Calendar.getInstance();
cal.setTime(aDate);
cal.add(Calendar.DAY_OF_MONTH, days);
return cal.getTime();
}
/**
* Date 转换成 LocalDate
*
* @param date
* @return
*/
public static LocalDate date2LocalDate(Date date) {
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDate localDate = instant.atZone(zoneId).toLocalDate();
return localDate;
}
/**
* LocalDate 转换成 Date
*
* @param localDate
* @return
*/
public static Date localDate2Date(LocalDate localDate) {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDate.atStartOfDay(zoneId);
Date date = Date.from(zdt.toInstant());
return date;
}
/**
* localDateTime 转换成 Date
*
* @param localDateTime
* @return
*/
public static Date localDateTime2Date(LocalDateTime localDateTime) {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDateTime.atZone(zoneId);
Date date = Date.from(zdt.toInstant());
return date;
}
/**
* Date 转换成 LocalDateTime
*
* @param date
*/
public static LocalDateTime date2LocalDateTime(Date date) {
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
return localDateTime;
}
/**
* 获取指定时间当天的0点
*
* @return
*/
public static LocalDateTime getFirstSecond(LocalDate localDate) {
return LocalDateTime.of(localDate, LocalDateTime.MIN.toLocalTime());
}
/**
* 获取指定时间当天的最后一秒
*
* @return
*/
public static LocalDateTime getLastSecond(LocalDate localDate) {
return LocalDateTime.of(localDate, LocalDateTime.MAX.toLocalTime());
}
/**
* 计算当前时间几小时之后的时间
*
* @param date 日期信息
* @param hours 小时信息
* @return 日期格式信息
*/
public static Date addHours(Date date, long hours) {
return addMinutes(date, hours * 60);
}
/**
* 计算当前时间几分钟之后的时间
*
* @param date 日期信息
* @param minutes 分钟信息
* @return 日期信息
*/
public static Date addMinutes(Date date, long minutes) {
return addSeconds(date, minutes * 60);
}
/**
* 计算当前时间几秒钟之后的时间
*
* @param date 日期信息
* @param secs 秒信息
* @return 日期信息
*/
public static Date addSeconds(Date date, long secs) {
return new Date(date.getTime() + (secs * 1000));
}
/**
* 拿到明天0点的时间
* @return
*/
public static Date getTomorrow() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_YEAR, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
/**
* 获取一周中的周一
* @param date
* @return
*/
public static Date getThisWeekMonday(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
// 获得当前日期是一个星期的第几天
int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
if (1 == dayWeek) {
cal.add(Calendar.DAY_OF_MONTH, -1);
}
// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
cal.setFirstDayOfWeek(Calendar.MONDAY);
// 获得当前日期是一个星期的第几天
int day = cal.get(Calendar.DAY_OF_WEEK);
// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
return cal.getTime();
}
public static void main(String[] args) {
System.out.println(getThisWeekMonday(new Date()));
}
}
4、retryUtils
package com.hema.cloud.util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.TimeUnit;
@Slf4j
public class DateUtil {
public static final String DEFAULTDATEPATTERN = "yyyy-MM-dd HH:mm:ss";
public static final String DATEPATTERN_YYYY_MM_DD = "yyyy-MM-dd";
public static final String DATEPATTERN_YYYY_MM_DD_HH = "yyyy-MM-dd HH";
public static final String DATEPATTERN_YYYY_MM = "yyyy-MM";
public static final String DATEPATTERN_YYYYMMDD = "yyyyMMdd";
public static final String DATEPATTERN_YYYYMM = "yyyyMM";
/**
* 一天的秒数
*/
public static final Integer ONE_DAY_SECONDS = 60 * 60 * 24;
/**
* 24小时毫秒值
*/
public static final long H24 = TimeUnit.HOURS.toMillis(24);
/**
* 1小时毫秒值
*/
public static final long H1 = TimeUnit.HOURS.toMillis(1);
public static Date parse(String string, String pattern) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.parse(string);
}
public static Date parse2(String string, String pattern){
try {
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.parse(string);
}catch (Exception e){
log.error("date parse error. param1{}, param2:{}", string, pattern, e);
}
return null;
}
public static Date getDayEnd(Date day){
String format = new SimpleDateFormat(DATEPATTERN_YYYY_MM_DD)
.format(day);
return parse2( format + " 23:59:59", DEFAULTDATEPATTERN);
}
public static Date getDayStart(Date day){
String format = new SimpleDateFormat(DATEPATTERN_YYYY_MM_DD)
.format(day);
return parse2( format + " 00:00:00", DEFAULTDATEPATTERN);
}
public static Date getYesterdayEnd(Date day){
Calendar instance = Calendar.getInstance();
instance.setTime(day);
instance.add(Calendar.HOUR, -24);
return getDayEnd(instance.getTime());
}
/**
* 返回自定义格式字符串
*/
public static String dateToString(Date date, String pattern) {
SimpleDateFormat formatter = new SimpleDateFormat(pattern);
return formatter.format(date);
}
public static Date increaseDate(Date aDate, int days) {
Calendar cal = Calendar.getInstance();
cal.setTime(aDate);
cal.add(Calendar.DAY_OF_MONTH, days);
return cal.getTime();
}
/**
* Date 转换成 LocalDate
*
* @param date
* @return
*/
public static LocalDate date2LocalDate(Date date) {
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDate localDate = instant.atZone(zoneId).toLocalDate();
return localDate;
}
/**
* LocalDate 转换成 Date
*
* @param localDate
* @return
*/
public static Date localDate2Date(LocalDate localDate) {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDate.atStartOfDay(zoneId);
Date date = Date.from(zdt.toInstant());
return date;
}
/**
* localDateTime 转换成 Date
*
* @param localDateTime
* @return
*/
public static Date localDateTime2Date(LocalDateTime localDateTime) {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDateTime.atZone(zoneId);
Date date = Date.from(zdt.toInstant());
return date;
}
/**
* Date 转换成 LocalDateTime
*
* @param date
*/
public static LocalDateTime date2LocalDateTime(Date date) {
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
return localDateTime;
}
/**
* 获取指定时间当天的0点
*
* @return
*/
public static LocalDateTime getFirstSecond(LocalDate localDate) {
return LocalDateTime.of(localDate, LocalDateTime.MIN.toLocalTime());
}
/**
* 获取指定时间当天的最后一秒
*
* @return
*/
public static LocalDateTime getLastSecond(LocalDate localDate) {
return LocalDateTime.of(localDate, LocalDateTime.MAX.toLocalTime());
}
/**
* 计算当前时间几小时之后的时间
*
* @param date 日期信息
* @param hours 小时信息
* @return 日期格式信息
*/
public static Date addHours(Date date, long hours) {
return addMinutes(date, hours * 60);
}
/**
* 计算当前时间几分钟之后的时间
*
* @param date 日期信息
* @param minutes 分钟信息
* @return 日期信息
*/
public static Date addMinutes(Date date, long minutes) {
return addSeconds(date, minutes * 60);
}
/**
* 计算当前时间几秒钟之后的时间
*
* @param date 日期信息
* @param secs 秒信息
* @return 日期信息
*/
public static Date addSeconds(Date date, long secs) {
return new Date(date.getTime() + (secs * 1000));
}
/**
* 拿到明天0点的时间
* @return
*/
public static Date getTomorrow() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_YEAR, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
/**
* 获取一周中的周一
* @param date
* @return
*/
public static Date getThisWeekMonday(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
// 获得当前日期是一个星期的第几天
int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
if (1 == dayWeek) {
cal.add(Calendar.DAY_OF_MONTH, -1);
}
// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
cal.setFirstDayOfWeek(Calendar.MONDAY);
// 获得当前日期是一个星期的第几天
int day = cal.get(Calendar.DAY_OF_WEEK);
// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
return cal.getTime();
}
public static void main(String[] args) {
System.out.println(getThisWeekMonday(new Date()));
}
}
4、convertUtils模型转化工具
package com.wdk.ums.nlp.utils.convert;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.springframework.beans.BeanUtils;
/**
* pojo转换工具类
*
* @author lich.wangy
* @date 2018-11-08
*/
public class ModelConvertUtils {
/**
* 把source对象的属性复制到result对象中
*
* 例如将A a 转为B b
* B b = PojoConvertUtils.convert(a,B.class);
*
* @param source
* @param s
* @param <R>
* @param <S>
* @return
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static <R, S> R convert(S source, Supplier<R> s) {
if (source == null) {
return null;
}
R result = s.get();
BeanUtils.copyProperties(source, result);
return result;
}
/**
* 把source对象列表复制到result对象列表
* * 例如将List<A> a 转为List<B> b
* List<B> b = PojoConvertUtils.convert(a,B.class);
*
* @param sourceList
* @param supplier
* @param <R>
* @param <S>
* @return
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static <R, S> List<R> convert(List<S> sourceList, Supplier<R> supplier) {
if (sourceList == null) {
return null;
}
return sourceList.stream().map(each -> convert(each, supplier)).collect(Collectors.toList());
}
}
5、mysql中扩展字段用URL编码处理方式
package com.cainiao.school.management.common.utils;
import com.alibaba.fastjson.JSON;
import com.cainiao.school.management.common.enums.SiteManagementFeePatternEnum;
import lombok.Data;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* <p>Description : {todo} </p>
*
* @author : lierlin
* @version : v1.0.0
* @since : 2020/6/29 17:06
**/
public class FeatureUtil {
public static final String SP = ";";
public static final String SSP = ":";
private static final String DEFAULT_CHARSET = "UTF-8";
public static String getFeature(String feature,String key){
Map<String,String> featureMap = toMap(feature);
return featureMap.get(key);
}
public static boolean getFeatureBoolean(String feature,String key){
Map<String,String> featureMap = toMap(feature);
String res = featureMap.get(key);
return BooleanUtils.toBoolean(res);
}
/**
* map to string
*
* @param map the map
* @return the string
*/
public static String toString(final Map<String, String> map) {
final StringBuilder featureSB = new StringBuilder(SP);
if (MapUtils.isEmpty(map)) {
return featureSB.toString();
}
for (Map.Entry<String, String> entry : map.entrySet()) {
final String k = entry.getKey();
final String v = entry.getValue();
if (null == k || null == v) {
// 过滤掉无效的kv对
continue;
}
try {
featureSB
.append(encode(k, v))
.append(SP)
;
} catch (UnsupportedEncodingException e) {
//TODO : log this
}
}
return featureSB.toString();
}
/**
* string to map
*
* @param featureString the string
* @return the map
*/
public static Map<String, String> toMap(final String featureString) {
final Map<String, String> map = new LinkedHashMap<>();
if (StringUtils.isBlank(featureString)) {
return map;
}
for (String kv : StringUtils.split(featureString, SP)) {
if (StringUtils.isBlank(kv)) {
// 过滤掉为空的字符串片段
continue;
}
final String[] ar = StringUtils.split(kv, SSP, 2);
if (ar.length != 2) {
// 过滤掉不符合K:V单目的情况
continue;
}
final String k = ar[0];
final String v = ar[1];
if (StringUtils.isNotBlank(k)
&& StringUtils.isNotBlank(v)) {
try {
decode(map, k, v);
} catch (UnsupportedEncodingException e) {
// TODO : log this
}
}
}
return map;
}
private static String encode(final String k, final String v) throws UnsupportedEncodingException {
return URLEncoder.encode(k, DEFAULT_CHARSET) + SSP + URLEncoder.encode(v, DEFAULT_CHARSET);
}
private static void decode(final Map<String, String> map, final String k, final String v) throws UnsupportedEncodingException {
map.put(URLDecoder.decode(k, DEFAULT_CHARSET), URLDecoder.decode(v, DEFAULT_CHARSET));
}
public static void main(String args[]){
String featureStr = ";iss_job_ins_id:776459745343;";
String res = getFeature(featureStr,"navigator_golden_sta");
boolean booleanRes = BooleanUtils.toBoolean(res);
System.out.println(booleanRes);
String bb = "lierlin:lidalin";
System.out.println(URLEncoder.encode(bb));
}
}