发表于: 2018-09-09 21:56:59
1 649
任务名称:task1
成果链接:https://github.com/DumbSaid/TaskMine/tree/master/Task1
任务耗时:9.1-9.9号,再加上来之前写了10篇日报,总共19天
技能脑图:
个人脑图
官网的脑图
脑图总结
我的脑图是参照着之前的日报根据自己的学习情况画出来的,跟官方的比较会更详细,但是有些知识点学习只是留于表面,没有更深入的进行研究。
任务总结:
a.是否符合预期及解决办法:
原本计划是花费一个月来做任务1,现在是提前完成任务了,因为是用到什么就去学什么,也没有多去学些别的,JDBC那里理解了原理之后后续的框架知道框架的思想后就比较简单了。还是感觉自己学的比较浅,经不起推敲,后续还是要更深入的学习。
b.任务一的主要内容
任务1主要是是围绕连接数据库,对数据库进行增删改查,分别用原生JDBC、JDBCTemplate、Mybatis和Spring+Mybatis进行DAL(数据访问层)的操作。
提到DAL就不得不说三层架构,通常意义上的三层架构是将业务应用划分为表现层、业务逻辑层和数据访问层,DAL由DAO具体实现,是把和数据库相关的代码封装起来,而DAO(数据访问对象),简单的来说就是建立一个接口,当需要和数据源进行交互的时候就使用这个接口。
原生JDBC连接数据库的过程:加载数据库驱动、通过DriverManager获取数据库连接Connection、通过Connection对象创建Statement对象,使用Statement执行SQL语句、操作结果集、回收数据库资源
JDBCTemplate负责所有的底层细节,从开始连接,准备和执行SQL语句,处理异常,处理事务,到最后关闭连接。而我们要做的是定义参数,指定要执行的SQL语句。
使用Mybatis后只需要自己提供SQL语句配置mapper文件,其他的工作都交给Mybatis去做。
步骤我也按照三步的方式说明下:进行数据库的连接:加载配置文件连接数据库,得到sqlsession;进行数据的操作,得到dao接口的实现类,通过sqlsession的getmapper方法,加载sql语句的mapper文件,进行实现类的得到,不需要自己来建立实现类,而是程序动态生成实现类;实现类进行方法使用,得到结果,关闭数据库连接;
Spring+mybatis的话,spring的话,就是控制反转和依赖注入,在mybatis中需要自己实例化来进行配置文件的加载,sqlsession的得到,和mapper文件的加载,等等,都交给spring来实例化得到相应的bean类,java代码的量大大减少了,这就意味着如果有更改,需要修改的地方就只是配置文件,不用来修改大量的代码,降低了彼此之间的耦合度。
其他的还有Junit、log4j在平时就能用到,在服务器上搭建JDK、MySQL等。
深度思考问题:(有一些问题前面之前的日报已经写过了)
1. maven是什么,和Ant有什么区别?
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。
Maven拥有约定,只要遵守约定,它就知道你的源代码在哪里。Maven是声明式的。只要创建一个pom.xml文件然后将源代码放到默认的目录,Maven会帮你处理其他的事情。Maven有一个声明周期,当你运行mvn install的时候被调用。这条命令告诉Maven执行一系列的有序的步骤,直到达到你指定的生命周期。缺点是运行许多默认的目标。
Ant没有约定,项目声明周期,它是命令式的。所有操作都要手动去创建、布置。
2.怎么进行分页数据的查询,如何判断是否有下一页?
使用Mysql数据库中的limit机制来完成分页操作。
3. 为什么不可以用Select * from table?
mysql拿到一条命令,回去解析命令、优化查询,然后去存储引擎执行查找select *语句取出表中的所有字段,会解析更多的对象,字段,权限,属性相关,不论该字段的数据调用的应用程序是否有用,这会对服务器资源造成浪费,导致优化和效率问题,对服务器的性能产生一定的影响。
如果表的结构在以后发生了变化,那么select *语句可能会取不到正确的数据甚至是出错
执行select * 语句时,select *要对表中所有列进行权限检查,这部分也是开销
使用select * 语句将不会使用到覆盖索引,不利于查询的性能优化
4. 什么是贫血模型,什么是充血模型?为什么我们会强制要求使用贫血模型
贫血模型把"行为"和"状态"分离到不同的对象之中,那个只有状态的对象就是所谓的"贫血对象"。
充血模型其实很简单,就是面向对象的本质,一个对象是拥有状态和行为的。
贫血模型的层次更清楚,耦合度低,更有利于开发
5. Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
IOC是控制反转,用IOC来进行实例的控制和创建,将原来由new来创建的引用类,交给配置文件来进行创建和控制使用,避免需要更改实例的时候,所要做的工作量巨大,依赖反转之后,将相互的影响降到了最低,提升了效率。
6. 为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?
根据客户的需求提出来的作为接口,业务具体实现是通过实现接口类来完成的
当客户提出新的需求时,只需编写该需求业务逻辑新的实现类
假如采用了这种模式,业务逻辑更加清晰,增强代码可读性,拓展性,可维护性
接口和实现分离,适合团队协作开发
实现松散耦合的系统,便于以后升级、扩展
7. 为什么要处理异常,Try/Catch应该在什么样的场景下使用,在真实的系统中,会出现网络中断,DB连接不上的错误吗?多久会发生一次?
处理异常是为了提升开发效率,如果存在异常但是并不知道,不处理,在开发的时候会打打影响效率;在可能发生异常的情况下最好都使用,可以明确异常的种类和发生的地方,方便开发人员修改与调试。如果出现DB断开,一般是开销太大才会断开DB,一般很少发生
8. 日志应该怎么打,在什么位置,需要打印出来什么样的关键参数?
日志是为了显示程序运行的状态,程序的运行开始前,运行后是关键地方,打印出的参数,应该包括时间,运行的类,日记的级别等等;
9. 为什么需要单步调试?Debug的时候IDE是怎么找到源码的?
单步调试可以更好地找到错误的地方,还有获取的值是否有获取到,单步的调试看得到每个变量的值得获取,不知道是怎么找到源码的
13. clean,install,package,deploy分别代表什么含义?
clean,清理项目产生的编译文件和其他文件,即target文件目录里的文件
install,将项目打包,除了放在target文件夹里,还会放在本地仓库
package,将项目打包,只放在target文件夹里
deploy,发布项目
14. 怎么样能让Maven跳过JUnit?
使用命令mvn package -DskipTests
15. 为什么要用Log4j来替代System.out.println?
更方便、可分级
绝大多数情况下,项目是脱离ide启动的,不能看到控制台打印语句,log4j可以生成文件
log4j只要修改配置文件就可以关闭输出
21. 可否远程连接到线上直接调试?真实的项目中,遇到问题的排查方案是什么?
服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码中设置断点,每当有请求到远程服务器时能够在本地知道远端服务器的此时的内部状态,IDEA远程调试项目https://blog.csdn.net/m0_37190495/article/details/78729088
SpringMVC的信息流
首先用户通过HTTP请求到服务器,服务器会根据你的url来将请求转到不同的控制器Controller。这是第一步,具体需要做的是在web.xml中设置URLpattern映射到spring的DispatcherServlet,用来转发请求,它会将请求转发到合适的Controller上,在SpringMVC中有个RequestMapping注解,专门负责映射url,如果需要映射到HelloController的printHello()方法,只需要在这个方法上加上@RequestMapping注解
RequestMapping是一个用来处理请求地址映射的映射,可用于类或方法上。用于类上,表示类中的所有响应方法请求的方法都是以该地址作为父路径。用于类上,表示将请求地址映射到该方法。RequestMapping注解有六个属性
value: 指定请求的实际地址,指定的地址可以是普通的具体值、含有某变量的一类值{},含正则表达式的一类值
method:指定请求的method类型,GET、POST、PUT、DELETE等,如
comsumes:指定处理请求的提交内容类型(Content-Type),例如application/json,text/html,如
方法仅处理request Content-Type为"application/json"类型的请求
produces:指定返回的内容类型,如:
此方法产生Content-Type为"application/json"类型的响应
params:指定request中必须包含某些参数值是,才让该方法处理。如:
仅处理请求中包含了名为"myParam",值为"myValue"的请求,起到了一个过滤的作用
header: 指定request中必须包含某些指定的header值,才让方法处理请求
当添加了headers之后,只有在请求头中添加上Referer=ABC这样的键值对,才能使该方法执行,否则在调用接口的时候会出现404找不到该地址
Spring MVC执行流程
1. 用户发送请求至前端控制器DispatcherServlet
2. DispatcherServlet收到请求调用处理器映射器HandlerMapping
3. 处理器映射器根据请求url找到具体的处理器,生成处理器执行链(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet
4. Dispatcher根据Controller获取处理器适配器HandlerAdapter,执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
5. 执行Controller
6. 返回ModelAndView,这个对象中包含了一个model属性和一个view属性,model是一个ModelMap类型,view包含了一些视图信息
7. HandlerAdapter将ModelAndView返回到DispatcherServlet
8. DispatcherServlet将ModelAndView传给视图解析器,解析后返回具体View
9 DispatcherServlet对View进行渲染,响应用户
二、明天计划的事情
CRUD接口文档
Spring MVC
三、遇到的问题
今天主要是写任务总结,然后看了看Sprnig MVC的执行流程,没有什么具体的问题
四、收获
Spring MVC的执行流程
评论