EasyExcel动态表头实现
EasyExcel动态表头实现日常使用EasyExcel导出报表时,如果实体类字段较多,使用原始方式生成动态表头文件时会产生大量繁琐重复的代码,使用自定义注解和工具类处理可以大大简化代码开发
简单实现例子准备一个实体类,注意@ExcelColumnIgnore注解为自定义注解,参数branchLv 表示当前机构层级
123456789101112131415161718192021222324252627282930313233343536373839404142@Datapublic class DemoEntity{ @ExcelColumnIgnore(branchLv = 2) @ExcelProperty(value = {"二级机构代码"}) @ApiModelProperty(value = "二级机构代码",example = "1110000") private String organIdTwo = "-"; @ExcelCol ...
回溯经典案例
回溯经典案例全排列全排列问题是回溯算法的一个典型应用。它的定义是在给定一个集合(如一个数组或字符串)的情况下,找 出这个集合中元素的所有可能的排列。
question11输入一个整数数组,数组中不包含重复元素,返回所有可能的排列。
例如:
[1, 2] :[1, 2], [2, 1]
[1, 2, 3] [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]
回溯代码如下:
123456789101112131415161718192021222324List<Integer> path = new ArrayList<>();List<List<Integer>> result = new ArrayList<>();List<List<Integer>> permutationsI(int[] nums) { backtrack(nums); return result;}private ...
回溯基础
回溯理论基础「回溯算法 backtracking algorithm」是一种通过穷举来解决问题的方法,它的核心思想是从一个初始状态出发,暴力搜索所有可能的解决方案,当遇到正确的解则将其记录,直到找到解或者尝试了所有可能的选择都无法找到解为止,所以回溯算法也通常采用“深度优先搜索”来遍历解空间。
回溯法解决的问题
组合问题:N个数里面按一定规则找出k个数的集合
切割问题:一个字符串按一定规则有几种切割方式
子集问题:一个N个数的集合里有多少符合条件的子集
排列问题:N个数按一定规则全排列,有几种排列方式
棋盘问题:N皇后,解数独等等
如何理解回溯法回溯法解决的问题都可以抽象为树形结构,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。
二叉树例子题目1给定一个二叉树,搜索并记录所有值为 7 的节点,请返回节点列表
题解1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697 ...
SpringSecurity表单认证(一)
SpringSecurity表单认证(一)新建一个SpringSecutiry项目创建一个新项目,名称任意
pom文件引入依赖,版本任意。
123456789101112<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.3.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> ...
MySQL知识网络(一)-MYSQL结构体系
MySQL知识网络(一)一条SQL是怎么执行的入门java时观看宋红康老师的视频中有句话让我印象深刻,大处着眼,小处着手。学习一个新的技术,应该先鸟瞰其全貌,从高维度理解问题。在我们输入一个简单的SQL查询语句时,心中应该对他的整体执行流程有个概念,做到胸有成竹,才能在遇到问题时,准确定位,进而根据情况对应解决方案。而想要做到这点,不得不提的就是MYSQL结构体系。
MYSQL结构体系(Server层)
大体来说,MySQL可以分为Server层和存储引擎层两部分
Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存存过程、触发器、视图等。
存储引擎层负责数据的存储和提取,其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认存储引擎。
连接器和安全管理1mysql -h$ip -P$port -u$user -p
使用上述命令登录mys ...
JWT详解
JWT详解转载自:JWT详解 (baobao555.tech)*
JWT简介1.什么是JWT在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流程:
客户端使用用户名和密码请求登录
服务端收到请求,验证用户名和密码
验证成功后,服务端会签发一个token,再把这个token返回给客户端
客户端收到token后可以把它存储起来,比如放到cookie中
客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带
服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据
这种基于token的认证方式相比传统的session认证方式更节约服务器资源,并且对移动端和分布式更加友好。其优点如下:
支持跨域访问:cookie是无法跨域的,而token由于没有用到cookie(前提是将token放到请求头中),所以跨域后不会存在信息丢失问题
无状态:token机制在服务端不需要存储session信息,因为token自身包含了所有登录用户的信息,所以可以减轻服务端压力
更适用CDN:可以通过内容分发网 ...
EasyExcel 数值型和最后一列超出文本框问题
EasyExcel 数值型和最后一列超出文本框问题Alibaba出品的EasyExcel对比原版excel库POI,极大的简化了开发人员的代码编写工作。EasyExcel使用注解和监听器等简化读写开发,
问题说明在我的日常工作中,很大一部分的工作都是将数据库的数据整理归纳后导出为Excel,当然会碰到许许多多的问题,比如导出超时(当然这个问题大多数都是SQL执行的问题,日常几十万条数据的excel并不会花费多少时间),字段类型与需求不匹配、文本超出单元格、动态头…..
这里主要记录和说明其中几个问题
字段类型不匹配
最后一列文本内容超出单元格
字段类型不匹配解决方法可看easyexcel 官方github Issues :https://github.com/alibaba/easyexcel/issues/2409
问题展示
如上图所示,当我们设置实体类的属性为字符串型时,默认导出的时候数值型会模糊单元格的格式,所以上方有个三角符号,这时候excel是无法进行数值的求和汇总等运算的。
分析我们看一下导出excel时的实体类
12345678910111213141516@Dat ...
Java中的并发工具类-CountDownLatch和CyclicBarrier
Java中的并发工具类-CountDownLatch和CyclicBarrier在JDK的并发包中,有几个非常有用的并发工具类,它们分别是:CountDownLatch、CyclicBarrier、Semaphore和Exchanger。
CountDownLatch(倒计时门闩):它允许一个或多个线程等待其他线程完成操作后再继续执行。它通过一个计数器来实现,线程通过调用 countDown() 方法来减少计数器的值,await()方法进行阻塞等待计数器减少,当计数器达到零时,等待的线程将被释放。
CyclicBarrier(循环屏障):它允许一组线程互相等待,直到到达一个共同的屏障点,然后继续执行后续操作。与CountDownLatch不同的是,CyclicBarrier的计数器可以重复使用(reset()方法),当所有等待线程都到达屏障点后,计数器会重置,线程可以继续下一次等待。
Semaphore(信号量):它用于控制对某个资源的访问权限。Semaphore维护了一组许可证,线程在访问资源前需要获取许可证,如果许可证不可用,则线程必须等待,直到有可用的许可证。
Exchange ...
HashMap为什么线程不安全
HashMap为什么线程不安全转载自:java - HashMap为什么线程不安全 - 个人文章 - SegmentFault 思否
一、学习目标1、HashMap线程不安全原因:
原因:
JDK1.7 中,由于多线程对HashMap进行扩容,调用了HashMap#transfer(),具体原因:某个线程执行过程中,被挂起,其他线程已经完成数据迁移,等CPU资源释放后被挂起的线程重新执行之前的逻辑,数据已经被改变,造成死循环、数据丢失。
JDK1.8 中,由于多线程对HashMap进行put操作,调用了HashMap#putVal(),具体原因:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的,当线程A执行完第六行代码后由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元素,完成了正常的插入,然后线程A获得时间片,由于之前已经进行了hash碰撞的判断,所有此时不会再进行判断,而是直接进行插入,这就导致了线程B插入的数据被线程A覆盖了,从而线程不安全。
改善:
数据丢失、死循环已经在在JDK1.8中已经得到了很好的解决,如果你去阅读1.8的 ...
Java线程池
Java线程池以下内容为阅读《JAVA并发编程的艺术》学习总结 笔记
简介Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。
线程池的优点
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行
提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不久会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。
线程池的实现原理线程池的创建我们可以通过ThreadPoolExecutor构造方法生成一个线程池对象,移除了内部代码,只留下了构造参数,便于理解,代码如下
123456789public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long ...