编辑
2023-02-20
实用工具
00

开发常用

快捷键组合实现效果
psvm + Tab键 / main + Tab键public static void main(String[] args)
sout + Tab键System.out.println()
Ctrl + X删除当前行
Ctrl +D复制当前行
Alt+Insert(或右键Generate)生成代码(如get,set方法,构造函数等)
Ctrl+Alt+T生成try catch (或者 Alt+enter选择)
CTRL+ALT+T把选中的代码放在 TRY{} IF{} ELSE{} 里
Ctr+shift+U实现大小写之间的转化
ALT+回车导入包,自动修正
CTRL+ALT+L格式化代码
CTRL+ALT+I自动缩进
CTRL+E最近更改的代码
fori生成for (int i = 0; i < ; i++) {}
Alt + <–左右–>键实现窗口左右更换(多窗口)
Ctrl + 鼠标点击快速找到成员变量的出处
Shift+F6重构/重命名 (包、类、方法、变量、甚至注释等)
CTRL+Q查看当前方法的声明
Ctrl+Alt+V自动创建变量(new 对象();之后选择按快捷键)
Ctrl+O重写方法
Ctrl+I实现方法
ALT+/代码提示
Ctrl+Shift+R在当前项目中替换指定内容
Ctrl+E最近编辑的文件列表
Ctrl+P显示方法参数信息
Ctrl+Shift+Insert查看历史复制记录,idea可以保留历史复制的 100 条记录
编辑
2023-02-17
实用工具
00

简介 🌽

Lombok 是一款好用顺手的工具,就像 Google Guava 一样。可用来帮助开发人员消除 Java 的冗长代码,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。

通过在开发环境中实现 Lombok,开发人员可以节省构建诸如hashCode()和equals()这样的方法以及以往用来分类各种 accessor 和 mutator 的大量时间。

使用

idea插件市场搜索lombok,安装lombok插件 maven中引入lombok

<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.8</version> </dependency>

最简单使用就是在对象上使用@Data,就可以自动生成get、set方法

Lombok 注解大全说明

注解含义
val使用val注解可以取代任意类型作为局部变量,这样我们就不用写复杂的ArrayList和Map.Entry类型了
@NonNull给方法参数增加这个注解,会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出 NPE(NullPointerException)
@Cleanup自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出之前会自动清理资源,自动生成 try-finally 这样的代码来关闭流
@Getter/@Setter用在属性上,再也不用自己手写 setter 和 getter 方法了,还可以指定访问范围
@ToString用在类上,可以自动覆写 toString 方法,当然还可以加其他参数,例如@ToString(exclude=”id”)排除 id 属性,或者@ToString(callSuper=true, includeFieldNames=true)调用父类的 toString 方法,包含所有属性
@EqualsAndHashCode用在类上,自动生成 equals 方法和 hashCode 方法
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor用在类上,自动生成无参构造和使用所有参数的构造函数以及把所有@NonNull 属性作为参数的构造函数,如果指定 staticName = “of”参数,同时还会生成一个返回类对象的静态工厂方法,比使用构造函数方便很多
@Data注解在类上,相当于同时使用了@ToString、@EqualsAndHashCod- e、@Getter、@Setter 和@RequiredArgsConstrutor 这些注解,对于 POJO 类十分有用
@Value用在类上,是@Data 的不可变形式,相当于为属性添加 final 声明,只提供 getter 方法,而不提供 setter 方法
@Builder用在类、构造器、方法上,为你提供复杂的 builder APIs,让你可以像如下方式一样调用 Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();更多说明参考 Builder
@SneakyThrows自动抛受检异常,而无需显式在方法上使用 throws 语句
@Synchronized用在方法上,将方法声明为同步的,并自动加锁,而锁对象是一个私有的属性 或LOCK,而 java 中的 synchronized 关键字锁对象是 this,锁在 this 或者自己的类对象上存在副作用,就是你不能阻止非受控代码去锁 this 或者类对象,这可能会导致竞争条件或者其它线程错误
@Getter(lazy=true)可以替代经典的 Double Check Lock 样板代码
@Accessors(chain = true)加上参数以后就可以开启链式编程
@Log根据不同的注解生成不同类型的 log 对象,但是实例名称都是 log,有六种可选实现类
@CommonsLogCreates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@LogCreates log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4jCreates log = org.apache.log4j.Logger.getLogger(LogExample.class);
@Log4j2Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4jCreates log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4jCreates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
编辑
2023-02-15
实用工具
00

1. nvl(expression1, expression2)🎃

函数作用:从两个表达式中返回一个非null值

用例:select nvl(father_name, mother_name) parent_name from student where student_id = '12345' 注意: 如果expression1的值非空,优先取expression1的值; 如果expression1的值空且expression2的值非空,则取expression2的值; 如果expression1和expression2均为空,则结果为NULL

2. decode(field_name, value1, new_value1, value2, new_value2, default_value)

函数作用:类似if...else...语句块,针对某个字段,如果它的值为value1,则转换为newValue1,如果值为value2,则转换为newValue2,其他情况显示默认值

用例:select decode(id,'1','A','2','B',id) from A; 注意: decode(field_name, value1, new_value1, value2, new_value2, default_value)其中的value1,newValue1等可以是一个表达式

3. row_number(order by field_name)

函数作用:将数据集按照某个字段排序,并产生序号字段

用例:select row_number() over(order by name) no,id,name from a;

4. to_date(source_string, formater_string)

函数作用:将字符串转换为日期类型

用例:select to_date('20190809','yyyyMMdd') from dual; 注意: 'yyyyMMdd','yyyymmdd','yyyy-MM-dd','yyyy-mm-dd'都可以

5. to_char()

函数作用:将其他类型转换为字符串类型

用例1:select to_char(sysdate, 'yyyymmdd') from dual 用例2:select to_char(99, 'fm999.00') from dual 注意: 用例1中还有很多其他的日期格式,如yyyy,mm,dd,D,DD,DDD等 用例2中fm,9,0都有不同的含义,如下表所示
字符标志含义
9如果存在数字则显示数字,不存在则显示空格
0如果存在数字则显示数字,不存在则显示0,即占位符
编辑
2023-02-10
实用工具
00

简介🍈

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。 easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便.

官方地址

导入meaven

<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.2.0</version> </dependency>

读Excel

/** * 最简单的读 * <p>1. 创建excel对应的实体对象 参照{@link DemoData} * <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener} * <p>3. 直接读即可 */ @Test public void simpleRead() { String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx"; // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭 EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead(); }

写Excel

/** * 最简单的写 * <p>1. 创建excel对应的实体对象 参照{@link com.alibaba.easyexcel.test.demo.write.DemoData} * <p>2. 直接写即可 */ @Test public void simpleWrite() { String fileName = TestFileUtil.getPath() + "write" + System.currentTimeMillis() + ".xlsx"; // 这里 需要指定写用哪个class去读,然后写到第一个sheet,名字为模板 然后文件流会自动关闭 // 如果这里想使用03 则 传入excelType参数即可 EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data()); }
编辑
2023-02-10
实用工具
00

1.使用list循环查询👍

代码展示:

xml
<if test="request.sendOutStatus !=null and request.sendOutStatus.size()>0"> AND b.send_out_status IN <foreach collection="request.sendOutStatus" index="index" item="item" open="(" separator="," close=")" > #{item} </foreach> </if>

先在if里判断长度和是不是满足自己需要的数据,然后遍历列表,把符合条件的进行组装,最后大概相当于

AND b.send_out_status IN (1,2,3)

遍历中再次判断

xml
<if test="request.sendOutStatus !=null and request.sendOutStatus.size()>0"> AND ( b.send_out_status IN <foreach collection="request.sendOutStatus" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> <foreach collection="request.sendOutStatus" index="index" item="item" > <choose> <when test='item == "0"'> or b.send_out_status is null </when> </choose> </foreach> ) </if>

第二种比第一种稍微进阶一点点,首先就是普通的遍历,然后再执行一次遍历,然后再拼接起来,因为有时候单次遍历不能满足条件,choose就是选择的意思,当遍历中有满足条件的就是执行一下 如果状态为零就相当于

AND b.send_out_status IN (1,2,3) or b.send_out_status is null

不为零则还是普通的方式

AND b.send_out_status IN (1,2,3)

foreach中除了choose以为还有otherwise等选择判断的方式