Appearance
工具类使用完整指南
🔧 核心原则:优先使用项目封装的工具类,绝对不要重新实现已有的工具方法
📋 目录
- JSON操作 - JsonUtil
- 字符串处理 - StringUtil
- 日期时间 - DateUtil
- 随机数生成 - RandomUtil
- 类型转换 - ConvertUtil
- 文件处理 - FileUtil
- 文件上传 - UploadUtil
- Redis缓存 - RedisUtil
- 用户信息 - UserProvider
- 其他工具类
JSON操作 - JsonUtil
位置:jpwise.util.JsonUtil
说明:基于Jackson ObjectMapper,已配置GMT+8时区和统一日期格式
对象与JSON字符串转换
java
import jpwise.util.JsonUtil;
// 对象转JSON字符串
String json = JsonUtil.getObjectToString(entity);
// JSON字符串转对象
UserEntity user = JsonUtil.getJsonToBean(json, UserEntity.class);
// Map转Entity(常用于钩子方法)
MyEntity entity = JsonUtil.getJsonToBean(mapData, MyEntity.class);
对象与Map转换
java
// 对象转Map(常用于流程表单数据)
Map<String, Object> map = JsonUtil.entityToMap(entity);
// JSON字符串转Map
Map<String, Object> dataMap = JsonUtil.stringToMap(json);
数组和列表处理
java
// JSON字符串转List
List<UserEntity> userList = JsonUtil.getJsonToList(json, UserEntity.class);
// JSON字符串转List<Map>(复杂结构)
List<Map<String, Object>> listMap = JsonUtil.getJsonToListMap(json);
// List转ArrayNode
ArrayNode arrayNode = JsonUtil.getListToJsonArray(userList);
节点操作
java
// 创建JSON节点
ObjectNode objectNode = JsonUtil.createObjectNode();
ArrayNode arrayNode = JsonUtil.createArrayNode();
// JSON字符串转JsonNode
JsonNode jsonNode = JsonUtil.getJsonToJsonNode(json);
对象属性合并
java
// 合并对象属性(将source的非空属性复制到target)
JsonUtil.mergeEntity(sourceEntity, targetEntity);
// 合并时忽略特定字段
JsonUtil.mergeEntity(sourceEntity, targetEntity, "id,createTime");
❌ 常见错误
java
// 错误:直接使用ObjectMapper
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(entity);
// 正确:使用JsonUtil
String json = JsonUtil.getObjectToString(entity);
字符串处理 - StringUtil
位置:jpwise.util.StringUtil
说明:继承自Apache Commons StringUtils,拥有所有Apache Commons方法 + 项目自定义方法
项目自定义增强方法
java
import jpwise.util.StringUtil;
// 空值判断(增强版,处理"null"字符串和空白字符)
if (StringUtil.isNotEmpty(str)) { } // 比Apache版本更严格
if (StringUtil.isEmpty(collection)) { } // 支持Collection判断
if (StringUtil.isNotEmpty(array)) { } // 支持数组判断
// 命名转换(项目自定义)
String camelCase = StringUtil.toCamelCase("user_name"); // user_name → userName
String underScore = StringUtil.toUnderScoreCase("userName"); // userName → user_name
// URL参数处理(项目自定义)
String url = StringUtil.setUrlParam(baseUrl, "param", value); // 添加单个参数
String urlWithParams = StringUtil.setUrlParams(url, paramMap); // 添加多个参数
// 安全处理
String safeValue = StringUtil.nvl(nullValue, defaultValue); // 空值默认处理
继承自Apache Commons的常用方法
java
// 基础字符串操作
boolean isEmpty = StringUtil.isBlank(str); // 空白字符判断
boolean isNotBlank = StringUtil.isNotBlank(str); // 非空白判断
String trimmed = StringUtil.trim(str); // 去除首尾空白
String defaultStr = StringUtil.defaultString(str, "default"); // 默认值
// 字符串比较和查找
boolean equals = StringUtil.equals(str1, str2); // 安全比较
boolean contains = StringUtil.contains(str, "test"); // 包含判断
int indexOf = StringUtil.indexOf(str, "target"); // 查找位置
❌ 常见错误
java
// 错误:使用不存在的方法
StringUtil.isNullOrEmpty(str); // 方法不存在,使用isEmpty()
StringUtil.format(str, args); // 方法不存在,使用StrFormatter或String.format()
日期时间 - DateUtil
位置:jpwise.util.DateUtil
说明:继承自cn.hutool.core.date.DateUtil,拥有hutool的所有日期方法 + 项目自定义方法
项目自定义常用方法
java
import jpwise.util.DateUtil;
import java.util.Date;
import java.util.Calendar;
import java.sql.Timestamp;
// 获取当前时间
Date now = DateUtil.getNowDate(); // 返回 Date 类型
String nowStr = DateUtil.getNow(); // 返回 "yyyy-MM-dd HH:mm:ss"
// 获取格式化的当前日期字符串
String today = DateUtil.dateNow("yyyyMMdd"); // 返回如 "20250814"
String time = DateUtil.dateNow("yyyy-MM-dd HH:mm:ss"); // 自定义格式
// 获取一天的开始/结束时间
Date dayBegin = DateUtil.getDayBegin(); // 今天00:00:00
Date dayEnd = DateUtil.getDayEnd(); // 今天23:59:59
// 获取指定日期的开始/结束时间
Timestamp dayStart = DateUtil.getDayStartTime(someDate); // 00:00:00
Timestamp dayEndTime = DateUtil.getDayEndTime(someDate); // 23:59:59
时间段获取
java
// 月度时间
Date monthStart = DateUtil.getBeginDayOfMonth(); // 本月开始
Date monthEnd = DateUtil.getEndDayOfMonth(); // 本月结束
Date lastMonthStart = DateUtil.getBeginDayOfLastMonth(); // 上月开始
Date lastMonthEnd = DateUtil.getEndDayOfLastMonth(); // 上月结束
// 年度时间
Date yearStart = DateUtil.getBeginDayOfYear(); // 本年开始
Date yearEnd = DateUtil.getEndDayOfYear(); // 本年结束
// 周时间
Date weekStart = DateUtil.getBeginDayOfWeek(); // 本周开始
Date weekEnd = DateUtil.getEndDayOfWeek(); // 本周结束
日期计算
java
// 日期加减
Date afterDays = DateUtil.dateAddDays(now, 7); // 加7天
Date afterMonths = DateUtil.dateAddMonths(now, 1); // 加1个月
Date afterYears = DateUtil.dateAddYears(now, 1); // 加1年
Date afterHours = DateUtil.dateAddHours(now, 2); // 加2小时
Date afterMinutes = DateUtil.dateAddMinutes(now, 30); // 加30分钟
// 日期比较
int daysDiff = DateUtil.getDiffDays(startDate, endDate); // 间隔天数
Date maxDate = DateUtil.max(date1, date2); // 较大日期
Date minDate = DateUtil.min(date1, date2); // 较小日期
日期格式化和解析
java
// 格式化
String formatted = DateUtil.dateFormat(now); // "yyyy-MM-dd HH:mm:ss"
String formatted2 = DateUtil.dateFormat(now, "yyyy年MM月dd日"); // 自定义格式
String shortDate = DateUtil.daFormat(now); // "yyyy-MM-dd"
// 解析
Date parsed = DateUtil.stringToDate("2024-08-14 10:30:00"); // String转Date
Date parsedShort = DateUtil.stringToDates("2024-08-14"); // 短格式转Date
月度时间范围计算示例
java
// 获取指定日期所在月的开始和结束时间
public Date[] getMonthRange(Date targetDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(targetDate);
// 获取月初
calendar.set(Calendar.DAY_OF_MONTH, 1);
Date monthStart = DateUtil.getDayStartTime(calendar.getTime());
// 获取月末
int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, lastDay);
Date monthEnd = DateUtil.getDayEndTime(calendar.getTime());
return new Date[]{monthStart, monthEnd};
}
❌ 常见错误
java
// 错误:getNow()返回String不是Date
Date now = DateUtil.getNow(); // 类型不匹配
entity.setCREATORTIME(DateUtil.getNow()); // 类型不匹配
// 正确
Date now = DateUtil.getNowDate(); // 返回Date
entity.setCREATORTIME(DateUtil.getNowDate()); // 类型匹配
随机数生成 - RandomUtil
位置:jpwise.util.RandomUtil
说明:提供ID生成、随机码生成等功能
java
import jpwise.util.RandomUtil;
// 生成主键ID(雪花算法)
String id = RandomUtil.uuId(); // 返回长整型字符串ID
// 生成6位随机英文字母
String randomStr = RandomUtil.enUuid(); // 返回如 "abcdef"
// 生成6位数字验证码
String code = RandomUtil.getRandomCode(); // 返回如 "123456"
// 生成业务单号示例
String dateStr = DateUtil.dateNow("yyyyMMdd");
String randomPart = RandomUtil.enUuid().substring(0, 4).toUpperCase();
String orderNo = "ORDER" + dateStr + randomPart; // 如 "ORDER20250814ABCD"
类型转换 - ConvertUtil
位置:jpwise.util.ConvertUtil
说明:基于hutool,提供安全的类型转换,转换失败不抛异常
java
import jpwise.util.ConvertUtil;
// 安全转换为字符串
String str = ConvertUtil.toStr(obj); // null返回null
String strWithDefault = ConvertUtil.toStr(obj, ""); // null返回默认值
// 数值转换
Integer intValue = ConvertUtil.toInt(obj); // 转换失败返回null
Integer intWithDefault = ConvertUtil.toInt(obj, 0); // 转换失败返回默认值
Double doubleValue = ConvertUtil.toDouble(obj); // 安全转换
Long longValue = ConvertUtil.toLong(obj); // 安全转换
BigDecimal decimal = ConvertUtil.toBigDecimal(obj); // 精确数值转换
// 布尔转换
Boolean boolValue = ConvertUtil.toBool(obj); // 安全转换布尔值
// 字符转换
Character charValue = ConvertUtil.toChar(obj, 'A'); // 转换为字符
// 编码转换
String utf8Str = ConvertUtil.utf8Str(obj); // 转换为UTF-8字符串
// 常用于参数处理
String userId = ConvertUtil.toStr(paramMap.get("userId"));
Integer pageSize = ConvertUtil.toInt(paramMap.get("pageSize"), 10);
文件处理 - FileUtil
位置:jpwise.util.file.FileUtil
说明:集成多种文件类型的存储路径管理和文件操作
路径管理
java
import jpwise.util.file.FileUtil;
import jpwise.util.enums.FileTypeEnum;
// 根据文件类型获取存储路径(自动配置路径)
String avatarPath = FileUtil.getFilePath(FileTypeEnum.USER_AVATAR); // 用户头像路径
String annexPath = FileUtil.getFilePath(FileTypeEnum.ANNEX); // 附件路径
String tempPath = FileUtil.getFilePath(FileTypeEnum.TEMPORARY); // 临时文件路径
String docPath = FileUtil.getFilePath(FileTypeEnum.DOCUMENT); // 文档路径
String templatePath = FileUtil.getFilePath(FileTypeEnum.TEMPLATE_FILE); // 模板路径
// 或使用字符串常量
String customPath = FileUtil.getFilePath("annex"); // 字符串方式
目录操作
java
// 创建目录(支持多级目录)
FileUtil.createDirs("/path/to/new/directory"); // 自动创建多级目录
// 检查目录是否存在
boolean exists = FileUtil.fileFolderIsExists("/path/to/check"); // 目录存在检查
文件上传
java
// 文件上传到指定路径
FileUtil.upFile(multipartFile, filePath, fileName); // 上传文件到指定位置
// 批量上传处理示例
String uploadPath = FileUtil.getFilePath(FileTypeEnum.ANNEX);
FileUtil.createDirs(uploadPath); // 确保目录存在
FileUtil.upFile(file, uploadPath, fileName);
文件类型常量 (FileTypeEnum)
USER_AVATAR
- 用户头像USER_AUTOGRAPH
- 用户签名MAIL
- 邮件文件ANNEX
- 前端附件IMFILE
- IM聊天文件WORKFLOW
- 工作流文件TEMPORARY
- 临时文件EXPORT
- 导出文件DOCUMENT
- 文档管理DATA_BACKUP
- 数据备份TEMPLATE_FILE
- 文件模板BI_VISUAL_PATH
- 大屏文件
文件上传 - UploadUtil
位置:jpwise.util.file.UploadUtil
说明:支持多种存储方式(本地存储/MinIO),统一文件上传下载接口
文件上传
java
import jpwise.util.file.UploadUtil;
import jpwise.util.file.base.StorageType;
import jpwise.util.enums.FileTypeEnum;
import jpwise.model.file.FileModel;
import org.springframework.web.multipart.MultipartFile;
// 上传文件(支持本地存储和MinIO)
String storageType = StorageType.STORAGE; // 本地存储
String bucketName = "my-bucket";
String objectName = "file.jpg";
String filePath = FileUtil.getFilePath(FileTypeEnum.ANNEX);
UploadUtil.uploadFile(storageType, bucketName, objectName, multipartFile, filePath);
// 上传本地文件到存储
UploadUtil.uploadFile(storageType, localFilePath, bucketName, fileName);
文件下载
java
// 下载文件到客户端
UploadUtil.downFile(storageType, fileName, bucketName, filePath, downloadName);
// 获取文件流
InputStream inputStream = UploadUtil.getFileStream(storageType, fileName, bucketName, filePath);
// 获取文件字节数组
byte[] fileBuffer = UploadUtil.getFileBuffer(storageType, fileName, bucketName, filePath);
// 在页面上显示图片
UploadUtil.writeImage(storageType, fileName, bucketName, filePath);
文件管理
java
// 删除文件
UploadUtil.removeFile(storageType, bucketName, fileName, filePath);
// 检查文件是否存在
Boolean fileExists = UploadUtil.checkFileExist(storageType, fileName, bucketName, filePath);
// 检查文件夹是否存在
Boolean folderExists = UploadUtil.checkFolderExist(storageType, folderName, bucketName, filePath);
// 获取文件大小
long fileSize = UploadUtil.getFileSize(storageType, fileName, bucketName, filePath);
// 获取文件列表
List<FileModel> fileList = UploadUtil.getFileList(storageType, bucketName, path, keyWord);
存储类型常量
java
String localStorage = StorageType.STORAGE; // 本地存储
String minioStorage = StorageType.MINIO; // MinIO存储
Redis缓存 - RedisUtil
位置:jpwise.util.RedisUtil
说明:提供Redis缓存操作,需要注入使用
java
import jpwise.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class ExampleService {
@Autowired
private RedisUtil redisUtil;
public void cacheExample() {
// 缓存数据(使用预定义的缓存时间常量)
redisUtil.insert("key", data, RedisUtil.CACHE_HOUR); // 1小时
redisUtil.insert("key", data, RedisUtil.CACHE_DAY); // 1天
// 获取缓存(注意返回Object类型,需要手动转换)
Object value = redisUtil.getString("key");
String strValue = String.valueOf(value);
Map<String, Object> map = redisUtil.getMap("mapKey");
// 删除缓存(正确方法名)
redisUtil.remove("key"); // 正确:使用remove方法
}
}
用户信息 - UserProvider
位置:jpwise.util.UserProvider
说明:获取当前用户信息,需要注入使用
java
import jpwise.util.UserProvider;
import org.springframework.beans.factory.annotation.Autowired;
@Service
public class ExampleService {
@Autowired
private UserProvider userProvider;
public void userExample() {
// 获取当前用户信息
UserInfo currentUser = userProvider.get();
// 获取用户属性
String organize = currentUser.getOrganizeId();
String userId = currentUser.getUserId();
String userName = currentUser.getUserName();
}
}
// 静态方法 - 获取请求头中的 token
String token = UserProvider.getHeaderToken();
其他工具类
加密工具 - Md5Util & DesUtil
java
import jpwise.util.Md5Util;
import jpwise.util.DesUtil;
// MD5加密
String md5Hash = Md5Util.getStringMd5(originalText); // 字符串MD5
String md5Hash2 = Md5Util.hash(originalText); // 另一种方法
String fileMd5 = Md5Util.getFileMd5String(file); // 文件MD5
// DES/AES加密解密
String desEncrypted = DesUtil.desEncode(plainText); // DES加密
String desDecrypted = DesUtil.desDecode(encrypted); // DES解密
String aesEncrypted = DesUtil.aesEncode(plainText); // AES加密
String aesDecrypted = DesUtil.aesDecode(encrypted); // AES解密
拼音工具 - PinYinUtil
java
import jpwise.util.PinYinUtil;
// 汉字转拼音
String pinyin = PinYinUtil.getPingYin(chineseText); // 完整拼音
String fullSpell = PinYinUtil.getFullSpell(chineseText); // 完整拼音
String firstLetter = PinYinUtil.getFirstSpell(chineseText); // 首字母
IP工具 - IpUtil
java
import jpwise.util.IpUtil;
// 获取客户端IP
String clientIp = IpUtil.getIpAddr(); // 获取IP地址
二维码工具 - ZxingCodeUtil
java
import jpwise.util.ZxingCodeUtil;
// 生成二维码
BufferedImage qrImage = ZxingCodeUtil.createCode(content, width, height); // 普通二维码
BufferedImage logoQR = ZxingCodeUtil.createCodeWithLogo(content, logoPath, width, height); // 带Logo二维码
BufferedImage barCode = ZxingCodeUtil.getBarcode(content, width, height); // 条形码
反射工具 - ReflectionUtil
java
import jpwise.util.ReflectionUtil;
// 获取字段值
Object fieldValue = ReflectionUtil.getFieldValue(object, fieldName);
// 设置字段值
ReflectionUtil.setFieldValue(object, fieldName, value);
// 调用方法
Object result = ReflectionUtil.invokeMethod(object, methodName, args);
HTTP请求工具 - OKHttpUtils
java
import jpwise.util.OKHttpUtils;
// HTTP请求(推荐)
String getResult = OKHttpUtils.get(url, headers);
String postResult = OKHttpUtils.post(url, bodyEntity);
// 注意:具体可用方法需要查看源码确认
树形结构工具 - TreeUtil
java
import jpwise.util.treeutil.TreeUtil;
import jpwise.model.base.BaseTree;
import jpwise.model.base.SysBaseTree;
// 业务实体树形结构处理(继承BaseTree,全大写字段)
public class DepartmentEntity extends BaseTree<DepartmentEntity> {
private String NAME;
private String CODE;
}
// 构建业务实体树
List<DepartmentEntity> departmentList = getDepartmentList();
List<DepartmentEntity> tree = TreeUtil.buildTree(departmentList);
// 系统实体树形结构处理(继承SysBaseTree,驼峰命名)
public class MenuEntity extends SysBaseTree<MenuEntity> {
private String menuName;
private String menuUrl;
}
// 构建系统实体树
List<MenuEntity> menuList = getMenuList();
List<MenuEntity> menuTree = TreeUtil.buildSysTree(menuList);
数据库工具 - JdbcUtil & ConnUtil
java
import jpwise.database.util.JdbcUtil;
import jpwise.database.util.ConnUtil;
import jpwise.database.constant.DbNameConst;
// 获取数据库连接(使用数据库名称常量)
Connection conn = ConnUtil.getConn(DbNameConst.JPWISE_BASE); // 基础数据库
Connection demoConn = ConnUtil.getConn(DbNameConst.JPWISE_DEMO); // 演示数据库
Connection hrConn = ConnUtil.getConn(DbNameConst.JPWISE_HR); // 人力资源数据库
// 获取默认连接
Connection defaultConn = ConnUtil.getConn();
🚨 工具类使用原则
- 优先使用项目自定义方法 - 已针对项目需求优化
- 注意继承关系 - StringUtil继承Apache Commons,DateUtil继承hutool
- 类型安全 - 使用ConvertUtil进行安全类型转换
- 路径管理 - 使用FileUtil.getFilePath()统一管理文件存储路径
- 异常处理 - 工具类方法通常不抛异常,返回默认值或null
- JSON操作 - 统一使用JsonUtil,已配置GMT+8时区
- 必须验证方法存在性 - 使用前查看源码确认实际可用方法
📚 工具类分类总览
🔥 最常用核心工具(必须掌握)
- JsonUtil - JSON与对象互转,Map转换,属性合并
- StringUtil - 字符串操作,命名转换,URL参数处理
- DateUtil - 日期时间操作,时区处理,格式化解析
- RandomUtil - ID生成,随机码生成
- UserProvider - 当前用户信息获取
- ConvertUtil - 安全类型转换
📁 文件与数据处理
- FileUtil - 文件路径管理,上传下载,目录操作
- UploadUtil - 多存储方式文件上传(本地/MinIO)
- RedisUtil - 缓存操作,数据存储
🔐 安全与编码工具
- Md5Util - MD5加密哈希
- DesUtil - DES对称加密
- IpUtil - IP地址获取和处理
🌐 网络与通信
- OKHttpUtils - 高级HTTP客户端(推荐)
🛠️ 高级开发工具
- ReflectionUtil - Java反射操作
- ZxingCodeUtil - 二维码生成解析
- PinYinUtil - 汉字拼音转换
- TreeUtil - 树形结构数据处理
🗃️ 数据库与查询
- JdbcUtil - 底层JDBC操作
- ConnUtil - 数据库连接管理
💡 提示:所有工具类都在
jpwise.util.*
或相关子包中,优先使用项目封装的工具类,而不是直接使用第三方库