乐趣区

两个月的Java实习结束,继续努力

前言
只有光头才能变强
2018 年 8 月 30 日,今天我辞职了。在 6 月 25 号入职,到现在也有两个月时间了。
感受:

第一天是期待的:第一次将项目拉到本地上看的时候,代码很多,有非常多的模块,模块下又有 dao/service/controller/form/bean,眼花缭乱的。再连上测试库,也发现有 100 多张表。~~ 顺着一些模块看下去,发现用的技术不难,之前基本都有接触过,都是可以看得懂的。

第一个星期是焦虑的:第二天给我发下了一个文档,文档里边有几个小任务(一、编写接口将数据导出到 Excel,二、改进一个功能)。
第二个功能的 SQL 语句写了很长的时间都没写出来,没写出来原因有两个:我的 SQL 能力弱和业务表之间的关系还没熟悉(现在想起来,算是我这两个月里写过最麻烦的 SQL 了)。花了将近两个星期完成了功能,期间我编写 SQL 的能力也算是有所提升了。

大多时候是闲的:很多时候接到的任务都是基于原有的基础上添加一些功能,改 Bug 之类的,也做过小的模块开发。总体来看:技术难度不大,主要是对业务的理解。

这两个月过得很开心,好吃好住,就是长胖了
另外值得一说的是:别以为我写了那么多博客的就很厉害,很牛逼,其实我渣得一批!校招的算法笔试题基本没有 ac 的,在面试的时候,知识点说忘就忘。我写博客主要是记录一下自己的成长,遗忘的技术可以翻看,跟大家一起交流交流,共同进步~
朋友吐槽我写的文章像是小学生作文,我也不擅长着感想之类的 ….. 所以,将就点看吧..~
下面主要记录了在实习中遇到的新技术,还有一些之前写过的笔记也放上来了。
一、实习时学到的新技术
1.1swagger 文档框架
在看公司代码的时候,发现 Controller 有几个我不知道的注解:@Api,@ApiOperation..
去查了一下,原来是接口的文档框架。

想要更加深入了解:
https://blog.csdn.net/i6448038/article/details/77622977
1.2Lombok 让 Java 代码更简洁
看到 JavaBean 的时候,也发现了新大陆:注解 @Data
在 JavaBean 中没有任何的 set/get 方法,但在外面却可以使用 set/get 方法,很是神奇..
去找了一下资料,原来这玩意叫做:Lombok。
简单来说:通过注解消除样板代码(从此 set/get 就没有了),JavaBean 会十分简洁!
要注意的是:在 IDE 上需要安装插件(IDEA 如果没安装 lombok 插件,编译会错误,一大堆的红色!)

Lombok 使用和介绍:

https://yq.aliyun.com/articles/59972
https://www.zhihu.com/question/42348457
https://blog.csdn.net/lvshuchangyin/article/details/68065775

1.3postman 使用
公司前后端分离,后端返回 json 数据给前端解析。我拿到的代码是完全没有前端页面的,老大让我装个 postman 来调试。
由于之前都是个人开发,想怎么玩就怎么玩(所以就没用过 postman..)。

找到了一篇很好的 postman 教程(如果没用过的同学,看完应该可以快速上手!):
https://blog.csdn.net/fxbin123/article/details/80428216
1.4JSON Web Token(认证授权)

JSON Web Token(JWT)是什么?
WT 作为一个开放的标准(RFC 7519),定义了一种简洁自包含的方法用于通信双方之间以 Json 对象的形式安全的传递信息。因为特定的数字签名,所以这些通信的信息能够被校验和信任。JWT 可以使用 HMAC 算法或者 RSA 的公钥私钥对进行签名。
什么时候应该使用 JSON Web Tokens?

认证鉴权(Authentication)
数据交换(Information Exchange)

貌似我司很简单用了一下 JWT,用于认证鉴权,我简单总结了一下流程:

按照正常的方式登录
将用户信息拼接成参数
用这个参数生成 jwt 对应的 token 值。
这个 token 值保存对应的权限,有效期,加密方式
token 返回到浏览器中,使用 Session Storage 存储起来
再次访问的时候,将这个 token 值带过去(可以通过 header 的方式,也可以 post/url 拼接的方式)。问了一下前端小哥,他们用的是 Angular,封装了一下,每次请求都将其写在 header 上。
如果这个 token 没过期,解析这个 Token 值,返回对应的 User 对象(标识)
如果这个 token 过期了,重新让用户登录

了解更多查看文档(中文):
http://jwtio.com/introduction.html
相关博文与讨论:

http://www.liriansu.com/jwt
https://www.zhihu.com/question/41248303
https://www.cnblogs.com/cjsblog/p/9277677.html

1.5SQL 编写思路
之前自己写的 sql 都挺简单的,无非就是连接两张表查询出对应的数据。
到了需求的时候就不同了,复杂很多(以至于我写了一个星期还没写出来 ….)
需求的任务简单概括:要对每个字段的数据进行统计,又要显示每个字段下具体的内容
说白了,就是将多行的数据拼接起来,弄成一行~
最终思路:

使用 concat 函数将其对应的字段拼接起来
随后再对字段进行分组,使用 group_concat 函数再将上述的拼接起来
最终拿到拼接到一行的结果,放到程序中解析

2018 年 8 月 31 日 15:56:00 更新:现在认为,分成多条 SQL 拆分比较合理
反正 sql 这玩意得多写 …(虐了我一个星期,原本都认为这功能是无法实现的了..)
在完成需求的时候也想过很多种办法来解决,找思路,从中也找到了一些比较好的关于 sql 的博文:

case when 使用: https://www.cnblogs.com/qlqwjy/p/7476533.html

exists 关键字 使用:https://zhuanlan.zhihu.com/p/20005249

非相关子查询:

相关子查询:

没有什么是 select 解决不了的,如果有,那就再套一层 —《3y》
tips : 在连表查询的时候,思考一下是不是一开始就需要连表得出结果(可能有的时候:某个查询条件必要时,才要连表)
1.6 数据库外键
在公司中,看数据库表的设计是不用外键的。
在初学数据库的时候,经常用到了外键约束。在论坛中查看讨论的时候,一般人都说很少用外键。因为我们完全可以在业务 (程序控制和事务) 上处理表之间关系。一般互联网应用没必要使用外键,外键会带来一系列不好的影响:

1. 数据库需要维护外键的内部管理;
2. 外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
3. 有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
4. 外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;

参考资料:
https://www.zhihu.com/question/19600081
二、之前的一些笔记
2.1Timer 和 Quartz 的区别
Timer 和 Quartz 都是任务调度框架,简单来说就是:程序能够在某时某刻上执行你想要执行的代码。
之前在项目中简单用到了 Quartz,在初学的时候也接触过一下 Timer 的 API 调用。之前简单记录过他俩的区别,现在回头整理一下吧~

1. 出身不同:Timer 由 jdk 直接提供,调用方式简单粗暴,不需要其它 jar 包支持。Quartz 并非 jdk 自带,需要引入相应的 jar 包
2. 能力区别:主要体现在对时间的控制上。某个具体时间执行具什么任务的话 Timer 可以轻松搞定,而比如每个星期天早上八点提醒做某事的功能就需要 Quartz,因此 Quartz 对时间的控制远比 Timer 强大,完善
3. 异常处理不同:Quartz 的某次执行任务过程中抛出异常,不影响下一次任务的执行,当下一次执行时间到来时,定时器会再次执行任务;而 TimerTask 则不同,一旦某个任务在执行过程中抛出异常,则整个定时器生命周期就结束,以后永远不会再执行定时器任务。
4. 对并发支持不同:Timer 走后台线程执行定时任务(单线程),Quartz 能够使用多个执行线程去执行定时任务
5.Quartz 每次执行任务都创建一个新的任务类对象,而 TimerTask 则每次使用同一个任务类对象

参考资料:

https://segmentfault.com/a/1190000009542398
https://segmentfault.com/a/1190000009972187
TimerTask 和 Quartz 比较:https://blog.csdn.net/gongyouong/article/details/72965451

Quartz Demo 源码:
https://img.mukewang.com/down/5950cae200010ca100000000.rar
2.2Java 生成二维码
我们现在已经离不开二维码了。
二维码是由一维码发展而来的,最典型的一维码就是我们平时去商场中看到商品包装的条形码,这就是典型的一维码。
而二维码的数据存储量信息又比一维码大得多,并且有很好的纠正的功能(即使二维码中有部分的信息不完整,还是能够解析得到二维码的数据)

使用 Java 语言生成二维码有以下的方式:

zxing API
qrcode
juqeryqrcode

当然了,肯定是 jquery 的方式来生成二维码是比较简单的。但是如果想定制二维码的样式、形状的话。那么使用 Java 的方式来生成是比较灵活的。(比如:在二维码中间放上 logo)
下载生成二维码的资源 jar 包:https://img.mukewang.com/down/5799a5440001040300000000.rar
使用 Jquery 的方式生成二维码的博文:http://suflow.iteye.com/blog/1687396
使用 zxing 生成二维码的博客:http://guopengli.cn/index.php/2017/10/05/53.html
参考资料:
https://segmentfault.com/a/1190000009909177
2.3Java 实现图片水印、缩略图
有的时候我们在上传图片时,不希望展示的图片大小和上传的图片大小相同时,我们就需要把图片进行压缩生一定的像素。缩略图例子:

图片水印也经常会看到:

无论是水印还是缩略图,其实就是通过类库来实现的,一般我们会使用 JAVA 图像处理库 Thumbnailator。
参考资料:

https://segmentfault.com/a/1190000010302289
生成水印源码:https://github.com/HongZhilin/watermark

缩略图博文:http://blog.csdn.net/qq_31179919/article/details/53336293

缩略图源码:https://github.com/Amant-huangqi/Thumbnails

最后
能看到我博客的人,说明是有看技术文章的习惯的。有看技术文章的习惯,说明都是爱技术 / 学习的人。爱技术 / 学习的人,技术一般不会差。所以能看到这篇文章的同学都是大佬 —-《3y》
如果想看更多的原创技术文章,欢迎大家关注我的微信公众号:。公众号还有海量的视频资源哦,关注即可免费领取。
可能感兴趣的链接:

文章的目录导航(微信公众号端):https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang

文章的目录导航(PC 端):http://www.zhongfucheng.bitcron.com/post/shou-ji/pcduan-wen-zhang-dao-hang

海量精美脑图:http://www.zhongfucheng.bitcron.com/post/shou-ji/nao-tu-da-quan

退出移动版