发表于: 2017-11-22 21:32:16

2 686


task1深度思考
今天taks1正式结束了,从我正式入学算起,差不多三周的时间,从我试学开始算的话也满一个月了.对于java,我是真正零基础,来修真院之前,只是知道java是编程,是软件开发,然后就没有了,没有看过一本书,或者资料.之所以来修真院也是因为种种原因,就不在这里叙述了.
一.maven是什么?和Ant有什么区别?
maven是项目对象模型,用来管理项目的工具,它包含了一组标准集合,一个项目周期,一个依赖管理系统,和用来运行定义在生命周期阶段中插件目标的逻辑.maven生命周期是对所有的构建过程进行了抽象以便于统一.什么是依赖管理系统呢?举个例子,在创建项目的时候,我们需要引用各种jar包,工程越大,需要引用的jar包就越多,如果我们一个一个的去下载,那么效率势必会大打折扣,maven的依赖管理系统帮我们解决了这个问题,只需要在配置文件中添加相应的jar包属性,maven就会自动从中央仓库中下载jar包;关于Ant,因为task1中并没有关于Ant的应用,所以基本上不了解Ant,我在网上查了些资料,简单说一下,Ant是一种基于java的build(构造)工具,它是基于java的类来进行扩展,配置文件是基于xml的,通过调用target树,来执行各种任务.maven和Ant的区别主要是针对构建问题的两个不同方面.Ant为java技术开发项目提供跨平台构建任务.maven本身描述项目的高级方面,它从Ant借用了绝大多数构建任务.总之,这两者是两个差异很大的工具,由于Ant没有接触过,在此不再详细叙述.
二.clean,install,package,deploy分别代表什么含义?
clean,install,package,deploy是maven的生命周期.
clean用于清除项目目录中的生成结果;install用于在本地仓库中安装jar包,以备其他本地项目作为依赖;package用于将编译好的代码打包成可分发的格式,基本上是jar格式;deploy用于把最终的jar包复制并发送到远程仓库,共享给其他开发人员和项目.
三.怎么样能让Maven跳过JUnit?
Junit是单元测试,用于对代码中的方法进行测试.如果想要跳过Junit,需要在pom.xml配置文件中安装插件,如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
四.为什么要用Log4j来替代System.out.println?
Log4j 是Apache的一个开放源代码项目,我们可以通过配置文件对日志进行灵活的配置,不需要修改繁琐的代码.有的时候我们可能需要脱离java ide环境调试程序,这个时候如果使用System.out.println语句输出某个变量值的方法进行调试,会有个问题,假如有一天我不需要显示这些System.out.println的东西了,只能一行一行的去注释掉,同样的,加入有一天又需要这些System.out.println的东西了,又得一行一行的注释回来,非常麻烦.使用log4j就不会有这个问题,因为log4j是通过配置文件来控制日志的输出的,所以只需要在配置文件中变更就可以了,非常方便.
五.为什么DB的设计中要使用Long来替换掉Date类型?
在mysql数据库中,Long=bigint类型,用于时间日期的话一般有两种方式:date类型和bigint时间戳.两者之间是可以互转的.我们在设计应用的时候需要考虑到一个问题:该应用是否涉及多个时区?时间数据是否和时区相关?如果是,那么就必须使用时间戳,因为只有时间戳表示的时间是准确的恒定的,就连时间+日期+时区也不行,所以在DB的设计中,我们应该要使用bigint来替换掉Date类型.
六.自增ID有什么坏处?什么样的场景下不使用自增ID?
自增ID是在设计表时将id字段的值设置为自增的形式,这样当插入一行数据时无需指定,id会自动根据前一字段的ID值+1进行填充.自增ID也有坏处,例如在将两个表合并的时候会因为重复ID而引发BUG,在数据库迁移的时候也会出现问题,所以,如果使用的是分布式数据库或者需要将两个表合并的时候,不能使用自增ID.
七.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,可以帮助搜索者快速找到符合条件的数据.索引有五种,分别是普通索引,唯一索引,全文索引,单列索引多列索引和组合索引.如果表内的数据量小的话没有必要建立索引,当我们需要查询含有大量数据的表的时候,我们需要建立合适的索引,一般表内数据量大于上千并持续性增长的情况下建议建立索引.
八.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引?
普通索引是最基本的索引类型,没有唯一性之类的限制.唯一索引是不允许其中任何两行具有相同索引值的索引.唯一索引一般需要在表记录比较多,经常和主字段一起查询但主字段索引值比较少的时候建.
九.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?
不需要,因为唯一索引是不允许其中任何两行具有相同索引值的索引,所以如果这个QQ已经做了唯一索引,在插入的时候如果QQ是重复的是不能插入的.
十.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?
create_at是创建时间,update_at是更新时间,create_at在创建表的时候赋值,update_at是每次更新数据的时候都需要赋值.应该需要开放给外部调用的接口,因为可能需要经常查看.
十一.修真类型应该是直接存储Varchar,还是应该存储int?
varchar是字符串类型,int是整数类型,很明显修真类型不可能是整数,所以应该直接存储varchar.
十二.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?
varchar是保存可变长度的字符串,在括号中指定字符串的最大长度,最多可以255个字符(一个汉子占用两个字符),如果值的长度大于255,会自动转换为text类型.text也是字符串类型,它最多可以存放65535个字符.而longtext是最多可以存放4294967295个字符的字符串.
十三.怎么进行分页数据的查询,如何判断是否有下一页?
分页查询只需要在查询语句后面加上limit参数就行,比如select * from table_name limit(1-1) * 10,10;意思就是每页10条数据,查询第一页.判断是否有下一页可以使用count先查询有多少条数据,select count(*) from table_name;
十四.为什么不可以用Select * from table?
Select * from table是用来查询表内的所有数据,这意味着,如果表内的数据很多,那么会降低查询的效率.
十五.什么是贫血模型,什么是充血模型?为什么我们会强制要求使用贫血模型?
贫血模式是指领域对象里只有get和set方法,或者包含少量的crud方法,所有的业务逻辑都不包含在内而是放在Business Logic层.
充血模式层次结构和上面的差不多,不过大多业务逻辑和持久化放在Domain Object里面,Business Logic只是简单封装部分业务逻辑以及控制事务和权限等.至于为什么强制使用贫血模式,我在网上查了资料,但是完全看不太懂,所以这个问题等以后再来回答吧.
十六.Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
spring中的IOC是熔断机制,特点是控制反转,也叫反向注入.我们在创建实例的时候一般用new来创建,但是在大型项目中,经常会创建很多的实例,不利于管理,而我们通过spring容器帮我们new指定的实例,并且将实例注入到需要对象的类中.
十七.为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?
interface是接口,用来定义成员,这样做的好处是便于多人同时开发,同一个接口可以有多个实现类,而且代码整洁,易读易改.
十八.为什么要处理异常,Try/Catch应该在什么样的场景下使用,在真实的系统中,会出现网络中断,DB连接不上的错误吗?多久会发 生一次?
程序在运行的时候可能会出现各种未知的异常,因此java设计了一个异常处理机制,异常分两种,一种是运行时异常(error),一种是非运行时异常(exception),try/catch一般在非运行时异常的时候使用.
十九.日志应该怎么打,在什么位置,需要打印出来什么样的关键参数?
日志最简单的记录方式是使用system.out.println("控制台"),在项目上线的时候就需要脱离输出控制台这种模式,这个时候我们需要一个可以记录并追溯事件的日志,我们常用的是log4j,log4j可以通过配置文件来设置日志等级,输出目的地,也可以指定输出样式.
二十.为什么需要单步调试?Debug的时候IDE是怎么找到源码的?
单步调试是在程序开发中,为了找到程序的bug而使用的一种调试手段,它可以一步一步跟踪程序执行的流程,根据变量的值,找到错误的原因.debug的时候是通过依赖关系找到源码的.
二十一.可否远程连接到线上直接调试?真实的项目中,遇到问题的排查方案是什么?
可以远程调试,但是这方面还没用接触过,具体细节不叙述了.我只知道一个debug方案,第一步是设置断点,第二步运行debug,第三步运行到断点后,使用单步执行,一行一行的查.
task1任务小结
整个task1就是一个从无到有的过程,只是这个过程真的很难,虽然我现在任务一已经过了,但是我不敢保证全部都懂了,在以后的时间里还需要不断的去巩固自己的基础.
现在来回顾一下任务一:
任务一中,步骤1到步骤11是基础,包括设计表,下载和安装mysql数据库并配置环境变量,navicat for mysql,然后学习sql语句,并使用sql语句对mysql数据库进行建表,增删改查等基础操作.可以说,这几个步骤就是以后学习的基础,类似与"启蒙"的作用.
然后步骤12是正式开始接触java,在好奇中学习jdk,jre等java的概念,接着就是安装和配置环境变量,最后写了自己第一个java,就是最经典的Hello world!
步骤13到步骤16,这几步就有点困难了,这几步任务是要求安装maven和IDEA,这两个都是第一次接触,maven还好一点,安装起来相对不是很难,安装完再配置下环境变量就可以了,但是IDEA就麻烦了,英文版本就算了,问题是网上的各种教程都和我实际遇到的总是有一点不一样,所以安装的时候各种纠结,最后还是在师兄的帮助下磕磕绊绊的安装好了,然后使用maven命令,把前面创建的HelloWorld打包到本地仓库.
步骤17是最难的一步了,它包含的信息非常的多,所以在这一步上耗费的时间也是最多的,单在这一步就用掉了大概两周时间,因为这一步需要学习jdbcTemplate对数据库增删改查,学习分层和各层的关系,配置pom.xml文件,学习maven如何管理项目,这之中的任何一个都让我非常的头疼,所以这段时间也是我信心比较差的时候,而且这一步还需要学习spring框架,到现在我对spring还是懂的很浅显,随着以后进一步的学习,应该会越来越明白.
步骤18到21,过了步骤17那个坎,只是过了第一关,但是相对的也容易了很多,比如这部分要求写一个单元测试,单元测试就是对将要编译的方法进行测试,看这个方法能不能行得通,然后配置log4j来生成日志来监测代码的运行,最后再学习debug来检查bug.
再后面这几步一是为后面的任务做铺垫,比如购买阿里云服务器,然后部署数据库,安装java,maven,把本地的项目打包到服务器上去跑.二是对自己的整个任务进行整理,也就是重构代码,到这里,任务一就结束了.
明天的计划
明天开始任务二
任务进度:任务2步骤1
任务开始时间:11月22日
任务结束时间:11月30日



返回列表 返回列表
评论

    分享到