发表于: 2019-11-10 23:21:57
1 1065
今天完成的事:
1、深度思考
1.什么是代码生成,mybatis generator代码生成是怎么实现的,还有什么办法可以生成代码? 点击查看相关小课堂
代码生成就是使用工具根据数据库的表格生成相应的代码,比如mybatis generator逆向工程就是根据数据表单表,生成dao层、pojo、mapper.xml文件,导入jar包,配置文件,而后可以通过java类、cmd命令、maven插件等方式进行逆向工程。
对于其他的工具使用,百度说是有mybatis plus,只需要写dao层和xml文件,简单的业务逻辑中service层和impl层可以省略,具体使用等需要再尝试吧。
2.Mysql的一般而言应该配置多大的内存, 多大的硬盘 ,多大的连接数?
mysql最大连接数默认100,最大可以达到16384,配置内存和硬盘没有找到准确说法,都需要根据具体情况。
3.在端到端的请求当中,建立Http连接需要多久,Model通过JSP转成Json需要多久,Nginx调用Resin需要多久,Service访问DB需要多久,一个Sql语句执行的时间是多久。
一个网络请求,时间损耗分为三个部分,一是前端响应,包括解析渲染,二是网络延迟,正常8~16ms左右,http请求差不多这个性能,三是服务器端的响应,性能优化一般看这里。
生成json的时间一般很短,nginx记录所有的出入时间,一般耗时需要去查controller和service的响应时间,都可以通过编写AOP的Util,记录响应前后的时间。
4.什么是Sql注入,应该怎么解决?对于未做SQL注入防范的程序,你可以直接通过调用接口删掉表吗?
sql注入就是攻击者把sql命令通过前台页面输入,欺骗服务器执行恶意的sql命令。解决方式就是对于所有可能来自用户输入的数据进行严格的检查,对数据库配置使用最小的权限原则。对于一些没有做防范的程序,能够将删表的sql语句拼接到程序执行语句中,就能够通过接口删掉表格。
5.在内存里拼装数据会节省时间吗?如果不能,为什么要选择单表查询,而不是直接拼装成Sql语句。
拼装成sql语句应该就是类似联表查询吧,效率确实是会高一些,但是消耗的资源也是巨大的,而且很多公司因为历史发展原因,可能会使用多个数据库,那就更没办法联表查询了。另外对于维护也是不利的,如果表格有所修改,可能会导致sql无法使用。所以一般是使用单表查询,而后再进行数据拼接。
6.为什么一般而言,不允许使用连表查询,不允许使用复杂的Group By等语句,为什么不允许使用存储过程?
使用联表查询和存储过程在一定程度上会占用数据库的性能,把这些逻辑放在java代码中处理可以节省数据库的性能,跨表的join查询在大数据量下需要的对比与运算量是会成倍增长,减少join除了直观的降低了高并发状态下的资源消耗外,更大的好处是降低了业务之间的耦合,增加了扩展性。
7.为什么响应时间一般不允许超过200MS,怎么查看一个请求从发起到结束,耗费在什么地方了? 点击查看相关小课堂
查看老大知乎,有一篇专门讲响应时间的,因为人眼一般对200ms以上的时延有反应,也就是说能感到等待响应的时间,所以一般这个页面都应该在200ms之内完成,复杂的请求慢些是可以理解的,简单的用户个人信息应该在50ms左右,list数据差不多在100ms左右。
8.为什么要自测,仅仅使用Postman来测试足够吗?什么是本地测试,什么是在开发环境测试?在开发过程中,应该每天部署代码到开发环境吗,为什么?
自测就是自己检测一下正常功能是否能跑通,修补相应的bug。
postman测试是用来进行接口测试,单纯的测试接口的可用性。响应时间和返回的数据是否符合预期,其他测试需要别的测试工具。
本地调试就是开发人员在自己本地进行测试。开发环境测试就是将代码部署到专门用于测试的服务器上进行测试,应该每天部署代码到开发环境,尽早排除一些bug,避免后期统一查找,不好解决。
9.保存图片有几种方式?什么样的情景下应该使用哪一种?
保存图片有3种方式。
一是传统的基于springmvc的multipartfile类实现图片上传,优点可以将图片和其他表单元素一起提交到服务器,服务器接收到的图片其实已经存储在容器的临时文件中,进行文件的拷贝工作比较简单,缺点则是无法及时看到图片上传的预览效果,一旦选择错误只能重新提交。
二是基于Ajax的图片上传,与第一种只有页面代码不一致,前端使用的jquery的jquery.fileupload.js插件来实现。
三是基于Base64压缩的图片上传,就是将图片转换为字符串,并存储数据库,显示时替代图片地址插入img标签,这种方式比较简单,没有跨域提交、头文件等问题,但是编码后的字符串大小远远小于实际图片大小,所以适合上传小尺寸图片,如用户头像。
10.为什么要先写单元测试?单元测试应该包括哪些?在正式打包的过程中,什么样的单元测试应该被屏蔽?在Maven里用什么方法可以跳过单元测试,单元测试应该被跳过吗。
单元测试编写的时间分为写代码之前,写代码时,写完代码后,其中写代码前是最好的,甚至不用定义接口、方法,先写测试用例,但是我目前还没有这种能力,我觉的还是在写代码时,编写单元测试比较好,在先编写部分代码后,对业务需求有所了解后,再进行单元测试的编写。
单元测试应该包括逻辑复杂的,容易出错的,不易理解的以及核心业务代码。且需要屏蔽报错的单元测试,可以使用-DskipTests跳过单元测试。
11.为什么提供假数据的时候要求,直接Controller接收请求,在JSP中写死数据返回以用做假数据?为什么提供假数据的时候要求数据完整,有分页尽可能给分页,数据尽可能真实?
因为假数据是需要以假乱真的数据,要尽可能的模拟真实的使用情况,方便前端进行工作,如果假数据不够完整,前端可能还需要后期进行返工,导致项目进度的拖延。
12.为什么要写假数据,前后端联调的时候,应该什么时候商定接口文档,接口文档应该谁来维护,如果不提供假数据,会发生什么问题? 点击查看相关小课堂
前后端联调时,应该在最初方案设计时就确定接口文档以及假数据,都应该由后端提供。
13.接口应该怎么定义?一个页面应该只对应一个接口吗?还是一个实体对应一个接口,让前端去组装数据?两者的使用场景是什么? 点击查看相关小课堂
接口应该从需求出发,方便用户使用,一个实体类对应一个接口,后端把数据组装好,而后传递json数据给前端。一个页面对应一个接口的话,页面功能简单还好一些,如果页面功能复杂,接口编写的难度增大,很容易导致逻辑混乱、出bug。
14.多层分类应该怎么设计表结构,分别有什么问题?像文章分类这种需求,如果分类不确定,级别不确定,有可能动态调整,数据量和访问量又比较大,该怎么去设计?
现在能想到的就是根据分类的不同在表格中建立对应的id字段,而后根据id字段去查找对应的分类信息,这样就是在编写代码的时候需要将逻辑整理清楚,尽量避免考虑不周全导致的bug。
15.什么是实体表,什么是关系表,一对多和多对多应该怎么设计表? 点击查看相关小课堂
实体表就是存储实际对象的表,关系表就是表示表与表之间关系的表,一对多是在多的一方表格中添加外键、关键字段,多对多就需要设计关系表。
16.什么是外键,用处是什么,为什么不建议使用外键做关联? 点击查看相关小课堂
外键就是用来建立两个表格联系的。将主表的主键放到从表的表格内,两个表格就通过外键关联了。也就是一对多的关系就是在多的一方表格建立外键。从表的这一列和主键有关系的数据就是从表外键。外键的好处就是在主表进行更改删除时,可以通过外键影响从表的数据。
由于外键的使用是将应用程序应该执行的判断逻辑转移到了数据库上,就意味着数据库的性能开销变大,造成性能消耗。
17.什么是数据库范式,是否应该严格遵守范式,什么情况下应该不遵守范式?
数据库的设计需要建立规范的数据库,就需要满足一些规范来进行优化数据存储方式,在关系型数据库中这些规范就是范式。
第一范式(1NF):强调列的原子性,也就是字段,即字段不能够再分成其他几个字段。
比如姓名,不可拆分,只能是一个字段,但是国外姓、名是区分的,所以需要两个字段。
第二范式(2NF):基于1NF,表格必须要有主键,且没有包含在主键中的列必须要完全依赖与主键,而不能只依赖于主键的一部分。
主要说的就是要有主键,其他字段都要依赖主键,因为没有主键就没有唯一性,就没法直接定位该数据。
第三范式(3NF):基于2NF,非主键列必须直接依赖于主键,不能存在传递依赖,即非主键列A依赖于非主键B,B依赖于主键的情况。
就是说消除传递依赖,比如说订单表中,每个订单除了对应的商品信息,还有客户信息,如果将客户信息也放在订单表中,那就是客户信息依赖客户id,而客户id是非主键,且依赖主键订单id,这就不符合3NF,需要将客户信息存储在另外的客户表中,通过在订单表中添加客户id字段关联。
但是真正的需求并不一定需要按照范式,规范的比不一定是最合适的,可能会有些特殊的需求,都需要视情况而定。
2、简单查看Tiles框架。
因为所有的网站都有一些共同之处,也有一些不同之处,而且不同的地方通常又都在相同的位置。比如下图是个比较经典的网页结构,经常变动的位置就是其中的body处,其他部分都是共同之处。这样的话如果每个页面都重复所有代码的话,就很麻烦,所以可以使用Tiles框架将可以重复使用的代码提取出来形成一个组件。
这样就可以将重用组件与不同之处的部分进行拼接,这样也就降低了耦合度,修改更加方便,代码也很清晰明了。
3、查看任务4的需求。
创建两个表格,学员表以及职业选择表。并使用逆向工程建立了dao层、pojo、xml文件。
明天计划的事:
1、完成剩下的service、controller层。
2、修改数据显示网站页面。
3、尝试使用Tiles框架。
遇到的问题:
不知道任务四需要做什么,看了任务前的动图才知道原来需要建表,将css任务页面的数据填充上,并达到动图内的要求。
收获:
1、完成了任务三的深度思考。
2、了解了任务四的需求,并创建表格。
评论