两个月的Java实习结束,继续努力
前言
只有光头才能变强
2018年8月30日,今天我辞职了。在6月25号入职,到现在也有两个月时间了。
感受:
- 第一天是期待的:第一次将项目拉到本地上看的时候,代码很多,有非常多的模块,模块下又有
dao/service/controller/form/bean
,眼花缭乱的。再连上测试库,也发现有100多张表。~~顺着一些模块看下去,发现用的技术不难,之前基本都有接触过,都是可以看得懂的。 - 第一个星期是焦虑的:第二天给我发下了一个文档,文档里边有几个小任务(一、编写接口将数据导出到Excel,二、改进一个功能)。
- 第二个功能的SQL语句写了很长的时间都没写出来,没写出来原因有两个:我的SQL能力弱和业务表之间的关系还没熟悉(现在想起来,算是我这两个月里写过最麻烦的SQL了)。花了将近两个星期完成了功能,期间我编写SQL的能力也算是有所提升了。
- 大多时候是闲的:很多时候接到的任务都是基于原有的基础上添加一些功能,改Bug之类的,也做过小的模块开发。总体来看:技术难度不大,主要是对业务的理解。
这两个月过得很开心,好吃好住,就是长胖了
另外值得一说的是:别以为我写了那么多博客的就很厉害,很牛逼,其实我渣得一批!校招的算法笔试题基本没有ac的,在面试的时候,知识点说忘就忘。我写博客主要是记录一下自己的成长,遗忘的技术可以翻看,跟大家一起交流交流,共同进步~
朋友吐槽我写的文章像是小学生作文,我也不擅长着感想之类的.....所以,将就点看吧..~
下面主要记录了在实习中遇到的新技术,还有一些之前写过的笔记也放上来了。
一、实习时学到的新技术
1.1swagger文档框架
在看公司代码的时候,发现Controller有几个我不知道的注解:@Api
,@ApiOperation
..
去查了一下,原来是接口的文档框架。
想要更加深入了解:
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教程(如果没用过的同学,看完应该可以快速上手!):
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://www.liriansu.com/jwt
- https://www.zhihu.com/question/41248303
- https://www.cnblogs.com/cjsblog/p/9277677.html
1.5SQL编写思路
之前自己写的sql都挺简单的,无非就是连接两张表查询出对应的数据。
到了需求的时候就不同了,复杂很多(以至于我写了一个星期还没写出来....)
需求的任务简单概括:要对每个字段的数据进行统计,又要显示每个字段下具体的内容
- 说白了,就是将多行的数据拼接起来,弄成一行~
最终思路:
- 使用
concat
函数将其对应的字段拼接起来 - 随后再对字段进行分组,使用
group_concat
函数再将上述的拼接起来 - 最终拿到拼接到一行的结果,放到程序中解析
反正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.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;
参考资料:
二、之前的一些笔记
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源码:
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
参考资料:
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》
如果想看更多的原创技术文章,欢迎大家关注我的微信公众号:Java3y。Java技术群讨论:742919422。公众号还有海量的视频资源哦,关注即可免费领取。
可能感兴趣的链接:
- 文章的目录导航(微信公众号端):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
两个月的Java实习结束,继续努力的更多相关文章
- 心路历程(一)-自学java两个月心得
这是我的第一条博文,在敲这些文字的时候我已经是一名大四的"老者".说自己"老者"确实如此,因为以前每当这个时候大一新学妹有上架了,哈哈,每当这个时候我们就想了很 ...
- 最近找java实习面试被问到的东西总结(Java方向)
时间,就是这么很悄悄的溜走了将近两个年华,不知不觉的,研二了,作为一个一般学校的研究生,不知道该说自己是不学无术,还是说有过努力,反正,这两年里,有过坚持,有过堕落,这不,突然间,有种开窍的急迫感,寻 ...
- 广州三本找Java实习经历
前言 只有光头才能变强 这阵子跑去面试Java实习生啦~~~我来简单介绍一下背景吧. 广州三本大三在读,在广州找实习.大学开始接触编程,一个非常平庸的人. 在学习编程时,跟我类似的人应该会有一个疑问: ...
- 从零基础到拿到网易Java实习offer,谈谈我的学习经验
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- 从零基础到拿到网易Java实习offer,我做对了哪些事
作为一个非科班小白,我在读研期间基本是自学Java,从一开始几乎零基础,只有一点点数据结构和Java方面的基础,到最终获得网易游戏的Java实习offer,我大概用了半年左右的时间.本文将会讲到我在这 ...
- 如何在两个月的时间内发表一篇EI/SCI论文-我的时间管理心得
在松松垮垮的三年研究生时期,要说有点像样的成果,也只有我的小论文可以谈谈了.可能有些厉害的角色研究生是丰富而多彩的,而大多数的同学在研究生阶段可能同我一样,是慢悠悠的渡过的,而且可能有的还不如我,我还 ...
- 阿里巴巴已offer:Java实习五面详细面经(附解答)
1.岗位 Java后台开发实习生 2.时间表 2020/3/18 提交简历 & 测评 2020/3/23 笔试 2020/3/26 简历面 2020/4/11 技术一面 2020/4/14 技 ...
- bootstrap-datetimepicker年视图中endDate设置之后比正常时间提前两个月
问题 bootstrap-datetimepicker年视图中endDate设置结束时间为2016-08,(即8月之后的日期不能选)而在日历上显示时为2016-06,相差两个月,即6月之后的日期不能选 ...
- 两个月刷完Leetcode前400题经验总结
更新:气死了,挂个傻逼: 每次做个分享.组织个活动,就会有一些傻逼冒泡生怕别人不知道他是傻逼,气死我了!自己好好看看非法集资的概念,我办这个活动,一分钱都没收,入群99元是督促大家完成刷题任务,最后完 ...
随机推荐
- 0510JS运算符
|-运算符|--基础运算符 + - * / %|----加号:数字的求和.字符串的拼接|----减号:数字的减法.对数字取反|----乘法.除法.取余 var a = 10; var b = 10; ...
- linux下svn(subversion)服务端添加工程及配置权限
linux下svn(subversion)服务端添加工程及配置权限 转载请注明源地址:http://www.cnblogs.com/funnyzpc/p/9010507.html 此篇我只是将所做过的 ...
- swagger上传文件并支持jwt认证
背景 由于swagger不仅提供了自动实现接口文档的说明而且支持页面调试,告别postman等工具,无需开发人员手动写api文档,缩减开发成本得到大家广泛认可 但是由于swagger没有提供上传文件的 ...
- Java 使用BigDecimal类处理高精度计算
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的 ...
- 【Web】一个非常简单的移动web消息框
适用:h5+jquery,移动网页最佳 最近在写个简单的公众号页面,前端验证时有些信息要提示,很简单的需求实在不想找啥现成的轮子,又不至于用alert这么粗暴,遂写了个非常简单的消息框,效果如图: 特 ...
- 跨域问题实践总结! 上(JSONP/document.domain/window.name)
1. JSONP 首先要介绍的跨域方法必然是 JSONP. 现在你想要获取其他网站上的 JavaScript 脚本,你非常高兴的使用 XMLHttpRequest 对象来获取.但是浏览器一点儿也不配合 ...
- 让Virtualbox复制出的虚拟机联网
http://www.williamsang.com/archives/215.html vi /etc/udev/rules.d/70-persistent-net.rules 注释掉eth0的相关 ...
- java 基础之枚举
问题:对象的某个属性的值不能是任意的,必须为固定的一组取值其中的某一个 解决办法: 1) 在setGrade方法中做判断,不符合格式要求就抛出异常 2) 直接限定用户的选择,通过自定义类模拟枚举的 ...
- 12.app后端如何选择合适的数据库产品
app后端的开发中,经常要面临的一个问题是:数据放在哪里? mysql ?redis?mongodb? 现在有这么多优秀的开源数据库产品,怎么根据业务场景来选择合适的数据? 常用的数据库产品的优缺点又 ...
- selenium webdriver——设置元素等待
如今大多数Web应用程序使用ajax技术,当浏览器在加载页面时,页面上的元素可能并不是同时被加载完成,这给定位元素的定位增加了困难, 如果因为在加载某个元素时延迟而造成ElementNotVisibl ...