Java程序猿搬砖笔记(十二)

@PostConstruct注解

示例代码:

1
2
3
4
5
6
7
8
9
10
@Configuration
@ComponentScan({"com.aspirecn.external.reward"})
@MapperScan("com.aspirecn.external.reward.mapper")
@Slf4j
public class ExternalRewardConfiguration {
@PostConstruct
private void init() {
log.info("自动装配ExternalRewardConfiguration");
}
}

参考链接

Mybatis的mapper-locations配置

  • 当mapper接口和mapper接口对应的配置文件在命名上相同、所在的路径相同时,则mapper-locations可以不用配置,配置也不会生效。
  • 当mapper接口和mapper接口对应的配置文件在命名上不相同、或者所在的路径不相同时,需要配置mapper-locations才能实现接口的绑定

YML文件配置参考:

1
2
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml,classpath*:com/reward/promotion/mapper/*.xml

mapper和xml对应不上会报错:

1
Invalid bound statement (not found): com.reward.promotion.mapper.CompanyRecordMapper.queryRecordList

@JsonFormat实现原理

参考链接

IDEA String Manipulation插件使用及设置快捷键

设置步骤演示:
1、快捷键"ALT+M" -> Switch Case -> Open Settings -> 增加"小写下划线转驼峰"操作
在这里插入图片描述
2、打开IDEA设置 -> 点击Keymap -> 搜索"小写下划线转驼峰" -> 将快捷键设置为"ALT+SHIFT+U"
在这里插入图片描述
注意:版本9以后才实现了"小写下划线snake_case"功能
参考链接

在Windows中测试服务器端口是否开放

1
2
命令语法:telnet 服务器id 服务器端口
示例命令:telnet 10.12.7.181 9098

Centos开放端口

1、开启防火墙
systemctl start firewalld
2、开放某个端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
其中zone表示作用域,参数permanent表示永久生效
3、重启防火墙
firewall-cmd --reload

Nginx常用配置详解

参考链接

Nginx里面的路径定位关键词root、alias

1、root:设置请求的根目录。是最上层目录的意思。
处理结果为:root路径+location路径
2、alias:用来更改location的路径。是目录别名的意思。
处理结果为:使用alias路径替换location路径
3、如果location路径是以/结尾,则alias也必须是以/结尾,root没有要求。
参考图片
参考链接

Zuul里面的prefix 和 strip-prefix学习

1、strip-prefix
true 移除前缀 false 不移除(增加)前缀
2、strip-prefix可用于全局配置和zuul.prefix结合使用
strip-prefix可用于路由配置和zuul.routes.routeName.path结合使用

从2.8路由前缀开始看就好,前面的例子举得不太好。
参考链接

解决Mybatis嵌套的结果集不能被安全地转为自定义ResultHandler

报错信息:

1
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Mapped Statements with nested result mappings cannot be safely used with a custom ResultHandler. Use safeResultHandlerEnabled=false setting to bypass this check.

意思:不允许自定义ResultHand处理器

解决方法:

1
2
3
4
5
6
# 增加配置:safe-result-handler-enabled: false
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
configuration:
call-setters-on-nulls: true
safe-result-handler-enabled: false

参考链接

Mybatis中文文档

参考链接

TortoiseGit+TortoiseGit中文语言包详细安装使用教程(windows版)

官方下载链接详细安装使用教程

Java文件类型校验之Apache Tika

Java文件类型校验之Apache TikaJava实现流和文件的转换 将InoutStream转为File输出到磁盘

Jackson解析器接收JSON实体,需要这个实体有无参构造方法,否则会报错

奖励平台动态登录时,LoginParam没有无参构造方法(@NoArgsConstructor)会报org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com…entity错误

Excel中数字变成E+的原因分析及两种解决方法

原因:
Excel中默认数字在超过11位后,就用科学计数法的显示方式。

解决方法:
方法一:单元格格式设置为数值,小数位数改为0
单元格格式设置为数值
这种方式适用于数据库导出Excel后,某些字段自动转为了科学计数法的情况。
保存时会提示格式不兼容,本质是文件的实际是TXT格式,需要另存为xlsx,设置的格式才有效果

方法二: 自定义单元格格式,类型设置为0
自定义单元格格式
这种方法适用输入的数字长度超过11位但是不超过15位,超过15位后的数字会自动变为0。

方法三:单元格格式设置为文本
这种方式数字超过15位也可以正常显示,但是做数值运算会有问题。

参考链接

Excel快速对当前列下面的空单元格填充

方法一:双击单元格右下角也可以实现快速填充,填充的范围为遇到非空值。
效果如下:
在这里插入图片描述

该方式适合整列都为空的情况。

方法二:ctrl+g快捷键实现快速填充
步骤:选中当前列 -> ctrl+g快捷键,定位 -> 点击空值 -> 输入要填充的值 -> ctrl+回车
效果如下:
在这里插入图片描述

该方式功能更强大,支持筛选后的部分空值填充。
参考链接

方法三:复制单个单元格,然后拖动进度条到最后填充
步骤:
筛选出空白单元格 -> 输入要填充的值 -> ctrl+c,复制 -> 拖动进度条到最后 -> ctrl+v粘贴
效果如下:
在这里插入图片描述

MySQL统计每分钟的记录数

原理:
利用unix_timestamp和floor函数,把秒转换成整数(取整),然后对这个整数进行分组取数量。
核心代码:

1
floor(unix_timestamp(record.create_time) / 60)

参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 按分钟统计投票次数
SELECT
t.create_time '投票时间',count(t.id) '投票次数'
FROM
(
SELECT
record.id,
record.create_time,
floor(
UNIX_TIMESTAMP(record.create_time) / 60
) create_timestamp
FROM
`t_vote_user` record
) AS t
group BY t.create_timestamp
ORDER BY t.create_time;

SpringBoot项目中某些Maven依赖可以不加版本号的原因

因为spring-boot-dependencies是spring-boot-starter-parent的父依赖,spring-boot-dependencies-XXX.pom中的dependencyManagement有常用依赖包的默认版本号,有助于统一版本号。
所以当在Springboot项目中引入了spring-boot-starter-parent或spring-boot-dependencies,则可以不用引入依赖包版本号。
如果非要想自己填写版本号也是可以的,这样会覆盖官方版本号(不建议随便修改依赖包版本号,免得版本号不兼容)。
参考链接

在线SQL转Java实体工具

参考链接

EasyExcel模板填充

通用导出方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class ExportExcelUtil<T> {
/**
* 给模板填充数据导出浏览器
*
* @param: list
* @param: path
* @param: fileName
* @return void
* @author liquanhong
* @date 2023/3/9/
*/
public void exportWithTemplate(List<T> list, String path, String fileName, HttpServletResponse response) throws Exception{
// 1、加载导入模板
Resource resource = new ClassPathResource(path);
// 2、设置浏览器响应信息
String newFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
dealResponse(response,newFileName);
// 3、开始导出
ExcelWriter excelWriter = EasyExcel
.write(response.getOutputStream())
.withTemplate(resource.getInputStream())
.build();
WriteSheet writeSheet = EasyExcel.writerSheet(0).build();
excelWriter.write(list, writeSheet);
excelWriter.finish();
}
}

参考链接参考链接官方文档