Skip to content

工具类使用完整指南

🔧 核心原则:优先使用项目封装的工具类,绝对不要重新实现已有的工具方法

📋 目录


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();

🚨 工具类使用原则

  1. 优先使用项目自定义方法 - 已针对项目需求优化
  2. 注意继承关系 - StringUtil继承Apache Commons,DateUtil继承hutool
  3. 类型安全 - 使用ConvertUtil进行安全类型转换
  4. 路径管理 - 使用FileUtil.getFilePath()统一管理文件存储路径
  5. 异常处理 - 工具类方法通常不抛异常,返回默认值或null
  6. JSON操作 - 统一使用JsonUtil,已配置GMT+8时区
  7. 必须验证方法存在性 - 使用前查看源码确认实际可用方法

📚 工具类分类总览

🔥 最常用核心工具(必须掌握)

  • 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.* 或相关子包中,优先使用项目封装的工具类,而不是直接使用第三方库