发表于: 2018-03-12 22:06:21

2 512


今天完成的事情:

1.将项目打包发送到云服务并运行成功。

用到maven的打包插件,package的同时对依赖jar包进行下载。

同时参考了这篇文章,maven三种打包插件。http://www.blogjava.net/liuguly/archive/2017/05/03/432496.html


2.完成一部分深度思考。

    1.maven是什么,和Ant有什么区别?

    

Ant和Maven都是基于Java的构建(build)工具。Ant是软件构建工具,Maven的定位是软件项目管理和理解工具。

当一个代码项目大了以后,每次重新编译,打包,测试等都会变得非常复杂而且重复,因此c语言中有make脚本来帮助这些工作的批量完成。在Java 中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。

除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些。

每个ant脚本(缺省叫build.xml)中设置了一系列任务(target):比如对于一个一般的项目可能需要有以下任务。

  * 任务1:usage 打印本脚本的帮助信息(缺省)

  * 任务2:clean <-- init 清空初始化环境

  * 任务3:javadoc <-- build <-- init 生成JAVADOC

  * 任务4:jar <-- build <-- init 生成JAR

  * 任务5:all <-- jar + javadoc <-- build <-- init 完成以上所有任务:jar javadoc 

而多个任务之间往往又包含了一定了依赖关系:比如把整个应用打包任务(jar)的这个依赖于编译任务(build),而编译任务又依赖于整个环境初始化任务(init)等。

  

Ant是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点。

跨平台性。Ant是纯Java语言编写的,所示具有很好的跨平台性。

操作简单。Ant是由一个内置任务和可选任务组成的。Ant运行时需要一个XML文件(构建文件)。

Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。由于Ant构建文件时XML格式的文件,所以和容易维护和书写,而且结构很清晰。

Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。

  

什么是Ant?

https://zhidao.baidu.com/question/2052253192995729547.html

  

Ant与Maven的特点:

Ant:

1.没有一个约定的目录结构

2.没有生命周期

3.必须定义目标及其实现的任务序列,通过任务序列明确让Ant做什么,什么时候做

4.没有集成依赖管理

Maven:

1.拥有约定,知道你的代码在哪里,放到哪里去

2.拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程

3.只需要定义一个pom.xml,Maven帮你处理其他事情。如定义编译等级、统一编码、很多强大的插件

4.拥有依赖管理,仓库管理

Maven的生命周期详解:http://juvenshun.iteye.com/blog/213959

Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),这个生命周期可以从两方面来理解。

第一,顾名思义,运行Maven的每个步骤都由它来定义的,这种预定义的默认行为使得我们使用Maven变得简单,相比而言,Ant的每个步骤都要你手工去定义。

第二,这个模型是一种标准,在不同的项目中,使用Maven的接口是一样的,这样就不用去仔细理解每个项目的构建了,一般情况下,mvn clean install 这样的命令是通用的。


    2.clean,install,package,deploy分别代表什么含义?

Maven的生命周期详解:http://juvenshun.iteye.com/blog/213959 这篇文章解释得很清楚

clean    移除所有上一次构建生成的文件

package     接受编译好的代码,打包成可发布的格式,如 JAR 。

install     将包安装至本地仓库,以让其它项目依赖。

deploy    将最终的包复制到远程的仓库,以让其它开发人员与项目共享。


    3.怎么样能让Maven跳过JUnit?

两种方式:一是在执行时clean install compile -Dmaven.test.skip=true,二是可以利用插件让maven在编译时跳过Junit。

    4.为什么要用Log4j来替代System.out.println?

1.Log4j就是帮助开发人员进行日志输出管理的API类库。

它最重要的特点就可以配置文件灵活的设置日志信息的优先级、日志信息的输出目的地以及日志信息的输出格式。

2.Log4j除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。

3.程序员经常会遇到脱离java ide环境调试程序的情况,这时大多数人会选择使用System.out.println语句输出某个变量值的方法进行调试。

这样会带来一个非常麻烦的问题:一旦哪天程序员决定不要显示这些System.out.println的东西了就只能一行行的把这些垃圾语句注释掉。

若哪天又需调试变量值,则只能再一行行去掉这些注释恢复System.out.println语句。

    5.为什么DB的设计中要使用Long来替换掉Date类型?

使用时间戳的优点:数据量大的时候如果需要以该字段作为查询条件的时候查询速度会快一点(在同等条件下+合理索引情况下)

并且数据库内部就是使用时间戳的机制保存时间。

缺点:查询结构不直观,需要二次处理。不过这个几乎可以忽略,如果是在客户端用sql查询的时候,mysql自带了UNIX_TIMESTAMP和FROM_UNIXTIME的转换函数;如果是程序处理的话,把时间戳转换成日期对象并不是什么特别麻烦的事情。

    6.自增ID有什么坏处?什么样的场景下不使用自增ID?

使用自增主键是否总是最佳实践? https://www.zhihu.com/question/27603761

1. 程序后台添加测试

2. 旧数据导入

3. 数据库迁移

4. 缓存 (如,两个库中id都为2时,缓存的时候会覆盖)

    7.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?

索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据库里所有记录的引用指针。使用索引用于快速找出在某个或者多个列中有特定值的行,所有MySQL列都可以被索引,对相关列使用索引是提高查询操作的最佳途径。

索引是在存储引擎中实现的,每种存储引擎的索引都不一定完全相同。MySQL中索引的存储类型有两种:btree和hash,具体和表的存储引擎相关;MyISAM和InnoDB存储引擎只支持btree索引;MEMORY/HEAP存储引擎两者都支持。

多大的数据量下建索引会有性能的差别,这个得看具体的开发情景。

设计索引的原则:

1.索引并非越多越好

2.避免对经常更新的表进行过多的索引,并且索引的列尽量可能少。对于经常查询的字段应该创建索引。

3.数据量小的表最好不要使用索引。由于数据少,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。

4.在表达式中经常用到的不同值较多的列上建立索引,在不同值少的列上不要建立索引。

5.当唯一性是某种数据本身的特性时,指定唯一索引。使用唯一索引能确保定义的列的数据完整性,以提高查询速度。

6.在频繁进行排序或者分组的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。

    8.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。

1、普通索引

  普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件或排序条件中的数据列创建索引。

只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

2、唯一索引

  普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次。

如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。

这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值

是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。

事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。


    9.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?

不需要,如第八题所言,唯一索引在插入时会自动检查数据库中是否含有此记录。

  10.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?

创建时间,即学员报名时间,第一次向数据库中保存此记录的时间。

修改时间,学员修改报名信息的时间,学员每次修改报名信息,其值都应该变化。

不能开放给外部调用接口。


明天要做的事:

完成剩下的深度思考,提交任务一。


遇到的问题:

null



返回列表 返回列表
评论

    分享到