Java项目中如何引入Hutool工具类并正确使用它

 更新时间:2024年01月29日 09:26:57   作者:激流丶  
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,这篇文章主要给大家介绍了关于Java项目中如何引入Hutool工具类并正确使用它的相关资料,需要的朋友可以参考下

1. 项目中如何引入 Hutool

1.1. import 方式引入 Hutool

如果你想像Spring-Boot一样引入Hutool,再由子模块决定用到哪些模块,你可以在父模块中加入:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-bom</artifactId>
            <version>${hutool.version}</version>
            <type>pom</type>
            <!-- 注意这里是import -->
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在子模块中就可以引入自己需要的模块了:

<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-http</artifactId>
    </dependency>
</dependencies>

使用 import 的方式,只会引入hutool-bom内的dependencyManagement的配置,其它配置在这个引用方式下完全不起作用。

1.2. exclude 方式引入 Hutool

如果你引入的模块比较多,但是某几个模块没用,你可以:

<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-bom</artifactId>
        <version>${hutool.version}</version>
        <!-- 加不加这句都能跑,区别只有是否告警  -->
        <type>pom</type>
        <exclusions>
            <exclusion>
                    <groupId>cn.hutool</groupId>
                    <artifactId>hutool-system</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

这个配置会传递依赖hutool-bom内所有dependencies的内容,当前hutool-bom内的dependencies全部设置了version,就意味着在maven resolve的时候hutool-bom内就算存在dependencyManagement也不会产生任何作用。

2. 以 SpringBoot 项目为例如何使用它

在Spring Boot项目中使用Hutool,您可以按照以下步骤进行操作:

  • 添加Hutool依赖:在您的项目的构建文件(如pom.xml)中添加Hutool的依赖项。您可以在Maven中添加以下依赖:
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.6</version>
</dependency>
  • 在Spring Boot应用程序中使用Hutool:在您的Spring Boot应用程序中,您可以直接使用Hutool提供的工具类和方法。例如,在您的Controller类中,您可以使用Hutool的字符串工具类:
import cn.hutool.core.util.StrUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {

    @GetMapping("/hello")
    public String hello() {
        String str = "Hello, Hutool!";
        String reversedStr = StrUtil.reverse(str);
        return reversedStr;
    }
}
  • 运行应用程序:启动您的Spring Boot应用程序,并访问 /hello 端点,您将看到使用Hutool进行字符串翻转后的结果。

3. Hutool 的编译安装

如果想对 Hutool 的源码进行编译安装,可以访问Hutool的Gitee主页:https://gitee.com/dromara/hutool (opens new window)下载整个项目源码(v5-master或v5-dev分支都可)然后进入Hutool项目目录执行:

./hutool.sh install

然后就可以使用Maven引入了。

4. Hutool 的源码分支说明

Hutool的源码分为两个分支,功能如下:

分支作用
v5-master主分支,release版本使用的分支,与中央库提交的jar一致,不接收任何pr或修改
v5-dev开发分支,默认为下个版本的SNAPSHOT版本,接受修改或pr

5. 给 Hutool 提供bug反馈或建议

提交问题反馈请说明正在使用的JDK版本呢、Hutool版本和相关依赖库版本。

6. 给 Hutool 贡献代码的步骤

  • 在Gitee或者Github上fork项目到自己的repo
  • 把fork过去的项目也就是你的项目clone到你的本地
  • 修改代码(记得一定要修改v5-dev分支)
  • commit后push到自己的库(v5-dev分支)
  • 登录Gitee或Github在你首页可以看到一个 pull request 按钮,点击它,填写一些说明信息,然后提交即可。
  • 等待维护者合并

7. PR遵照的原则

Hutool欢迎任何人为Hutool添砖加瓦,贡献代码,不过维护者是一个强迫症患者,为了照顾病人,需要提交的pr(pull request)符合一些规范,规范如下:

  • 注释完备,尤其每个新增的方法应按照Java文档规范标明方法说明、参数说明、返回值说明等信息,必要时请添加单元测试,如果愿意,也可以加上你的大名。
  • Hutool的缩进按照Eclipse(不要跟我说IDEA多好用,维护者非常懒,学不会 ,IDEA真香,改了Eclipse快捷键后舒服多了)默认(tab)缩进,所以请遵守(不要和我争执空格与tab的问题,这是一个病人的习惯)。
  • 新加的方法不要使用第三方库的方法,Hutool遵循无依赖原则(除非在extra模块中加方法工具)。
  • 请pull request到v5-dev分支。Hutool在5.x版本后使用了新的分支:v5-master是主分支,表示已经发布中央库的版本,这个分支不允许pr,也不允许修改。
  • 我们如果关闭了你的issue或pr,请不要诧异,这是我们保持问题处理整洁的一种方式,你依旧可以继续讨论,当有讨论结果时我们会重新打开。

补充:基于Hutool的excel开发

引入依赖

excel 包完全依赖于hutool 工具包,不需要额外的引入,hutool all中已经包含了hutool 的全部工具包

        <!--   hutool工具类 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.22</version>
        </dependency>

开发

首先确定我们要对那些表进行数据的导入导出,这里的建议是对数据更改不频繁的表进行数据的导入导出,而且对于数据的唯一性要求不高,否则在进行数据导入的过程中,需要进行复杂的逻辑处理。这里我使用的是组织的用户信息表,该表的数据只有组织自己进行维护,就可以使用标准导入。

/**
 * 组织用户信息表
 * @TableName cf_group_user
 */
@TableName(value ="cf_group_user")
@Data
public class GroupUser implements Serializable {
    /**
     * id
     */
    @TableId(type = IdType.AUTO)
    private Integer id;

    /**
     * 组织id
     */
    private Integer groupId;

    /**
     * 姓名
     */
    @NotBlank(message = "姓名不可为空")
    private String nickname;

    /**
     * 性别(0:默认,1:男,2:女)
     */
    @NotBlank(message = "性别不可为空")
    private Integer sex;

    /**
     * 出生日期
     */
    @NotBlank(message = "出生日期不可为空")
    private Date bornTime;

    /**
     * 形象照片
     */
    @NotBlank(message = "形象照片不可为空")
    private String photo;

    /**
     * 家庭地址
     */
    @NotBlank(message = "家庭地址不可为空")
    private String homeAddress;

    /**
     * 联系电话
     */
    @NotBlank(message = "联系电话不可为空")
    private Integer mobile;

    /**
     * 实名信息
     */
    private String authId;

    /**
     * 职务信息
     */
    @NotNull(message = "职务不可为空")
    private String post;
}
create table cf_group_user
(
    id           int unsigned auto_increment comment 'id'
        primary key,
    group_id     int unsigned               not null comment '组织id',
    nickname     char(30)                   not null comment '姓名',
    sex          tinyint unsigned           not null comment '性别(1:男,2:女)',
    born_time    datetime                   not null comment '出生日期',
    photo        varchar(255)               not null comment '形象照片',
    home_address varchar(255)               not null comment '家庭地址',
    mobile       int                        not null comment '联系电话',
    post         varchar(255)               not null comment '职务信息'
)
    comment '组织用户信息表' collate = utf8_unicode_ci;

create index auth_id
    on cf_group_user (auth_id);

create index group_id
    on cf_group_user (group_id);

create index mobile
    on cf_group_user (mobile);

在确定表后,我们需要选取那些字段是我们需要使用的,在excel 表中进行展示,需要用户填入,根据字段构建反射。

实现

在工程中先确定使用的字段构建模板,根据字段构建excel 的模板。这里的示例如下:

//controller层
//返回模板
    @RequestMapping("/getExcelTemplate")
    public void getExcelTemplate(HttpServletResponse response) {
        groupUserService.getExcelTemplate(response);
    }

//sevice层
void getExcelTemplate(HttpServletResponse response);

//impl
@Override
    public void getExcelTemplate(HttpServletResponse response) {
        try {
            // 1 读取对象
            final ExcelReader reader = ExcelUtil.getReader(ResourceUtil.getStream("templates/group.xlsx"));
            List<List<Object>> lists = reader.read();
            ExcelWriter writer = ExcelUtil.getWriter(true);
            writer.write(lists);
            response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("group.xlsx", "UTF-8"));
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            // 2 写出对象
            ServletOutputStream outputStream = response.getOutputStream();
            // 通过IO写出我们的表格对象
            writer.flush(outputStream, true);
            writer.close();
            IoUtil.close(outputStream);
        } catch (IOException e) {
            log.error("EducationServiceImpl [export] 输出到响应流失败", e);
            throw new APIException("导出Excel异常");
        }
    }

这里我使用的是三层构建,在controller 层中暴露接口,进行调用,所有的具体实现进行抽象。

//导入信息
    @RequestMapping("/importStudent")
    public R importStudent(@RequestParam MultipartFile file) {
        try {
            boolean userInfo = groupUserService.getUserInfo(file);
            if(userInfo) return R.success();
        } catch (IOException e) {
            log.error("EducationController [getEducation] 获取输入流失败", e);
            throw new APIException("获取输入流失败");
        }
        return R.error();
    }

//导出信息
    @RequestMapping("/export")
    public void export(@RequestBody PageVo pageVo, HttpServletResponse response) {
        groupUserService.export(pageVo, response);
    }
void export(PageVo pageVo, HttpServletResponse response);

boolean getUserInfo(MultipartFile file) throws IOException;

@Override
    public void export(PageVo pageVo, HttpServletResponse response) {
        // 从数据库查出数据对象封装成map
        final List<Map<String, Object>> educationList = this.page(new Page<>(pageVo.getPage(), pageVo.getLimit()), Wrappers.lambdaQuery()).getRecords()
                .stream()
                // 封装成 Map 并且放入 List
                .map(item -> {
                    final Map<String, Object> map = new LinkedHashMap<>();
                    // 错误,这里需要根据表中字段名称进行命名
                    map.put("nickname", item.getNickname());
                    map.put("sex", item.getSex());
                    map.put("mobile", item.getMobile());
                    map.put("bornTime", item.getBornTime());
                    map.put("homeAddress", item.getHomeAddress());
                    map.put("post", item.getPost());
                    return map;
                })
                .collect(Collectors.toList());
        // 准备将数据集合封装成Excel对象
        ExcelWriter writer = ExcelUtil.getWriter(true);
        // 通过工具类创建writer并且进行别名
        writer.addHeaderAlias("nickname", "姓名");
        writer.addHeaderAlias("sex", "性别( 0 表示男 , 1 表示 女)");
        writer.addHeaderAlias("mobile", "电话");
        writer.addHeaderAlias("bornTime", "出生日期");
        writer.addHeaderAlias("homeAddress", "家庭地址");
        writer.addHeaderAlias("post", "职位");
        // 准备将对象写入我们的 List
        writer.write(educationList, true);
        try {
            // 获取我们的输出流
            final OutputStream output = response.getOutputStream();
            response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode("group.xlsx", "UTF-8"));
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            writer.flush(output, true);
            writer.close();
            // 这里可以自行关闭资源或者写一个关闭资源的工具类
            IoUtil.close(output);
        } catch (IOException e) {
            log.error("EducationServiceImpl [export] 输出到响应流失败", e);
            throw new APIException("导出Excel异常");
        }
    }

    @Override
    public boolean getUserInfo(MultipartFile file) throws IOException {
        ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
        HashMap<String, String> head = new HashMap<>(6);
        head.put("姓名","nickname");
        head.put("性别( 0 表示男 , 1 表示 女)","sex");
        head.put("电话","mobile");
        head.put("出生日期", "bornTime");
        head.put("家庭地址","homeAddress");
        head.put("职位","post");
        reader.setHeaderAlias(head);
        List<GroupUser> read = reader.read(0, 1, GroupUser.class);
        Group group = groupService.getOne(new QueryWrapper<Group>().eq("uid", UserConstant.USER_ID));
        for (GroupUser user : read) {
            user.setGroupId(group.getId());
            //TODO 默认图片
            user.setPhoto("https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png");
            user.setStatus(1);
            user.setCreateTime(new DateTime());
            if(!this.save(user))return false;
        }
        return true;
    }

使用hutool 进行excel 处理的时候,需要自己定义字段与excel 表头见的映射关系,这一点是比较麻烦的。但相比于其他excel的使用方式,这是一种非常简单的实现。

总结 

到此这篇关于Java项目中如何引入Hutool工具类并正确使用它的文章就介绍到这了,更多相关Java引入Hutool并使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析JAVA 循环结构

    浅析JAVA 循环结构

    这篇文章主要介绍了JAVA 循环结构的相关资料,文中讲解的非常细致,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Springboot使用RestTemplate调用第三方接口的操作代码

    Springboot使用RestTemplate调用第三方接口的操作代码

    这篇文章主要介绍了Springboot使用RestTemplate调用第三方接口,我只演示了最常使用的请求方式get、post的简单使用方法,当然RestTemplate的功能还有很多,感兴趣的朋友可以参考RestTemplate源码
    2022-12-12
  • java生成mvt切片的方法实现

    java生成mvt切片的方法实现

    本文主要介绍了java生成mvt切片的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • java  实现输出随机图片实例代码

    java 实现输出随机图片实例代码

    这篇文章主要介绍了java 实现输出随机图片实例代码的相关资料,需要的朋友可以参考下
    2017-06-06
  • Springboot中使用拦截器、过滤器、监听器的流程分析

    Springboot中使用拦截器、过滤器、监听器的流程分析

    Javaweb三大组件:servlet、Filter(过滤器)、 Listener(监听器),这篇文章主要介绍了Springboot中使用拦截器、过滤器、监听器的流程分析,感兴趣的朋友跟随小编一起看看吧
    2023-12-12
  • 当Mybatis遇上目录树超全完美解决方案

    当Mybatis遇上目录树超全完美解决方案

    这篇文章主要介绍了当Mybatis遇上目录树有哪些解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • spring-boot中spring-boot-maven-plugin报红错误及解决

    spring-boot中spring-boot-maven-plugin报红错误及解决

    这篇文章主要介绍了spring-boot中spring-boot-maven-plugin报红错误及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • java的三种随机数生成方式

    java的三种随机数生成方式

    主要介绍了java的三种随机数生成方式的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2021-07-07
  • 混乱的Java日志体系及集成jar包梳理分析

    混乱的Java日志体系及集成jar包梳理分析

    这篇文章主要详细的为大家梳理分析了剪不断理还乱的Java日志体系,以及日志系统涉及到的繁杂的各种集成 jar 包,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-03-03
  • JAVA读取文件夹大小的几种方法实例

    JAVA读取文件夹大小的几种方法实例

    这篇文章介绍了JAVA读取文件夹大小的几种方法实例,有需要的朋友可以参考一下
    2013-10-10

最新评论