今天完成的事情
深度思考;
1.maven是什么,和Ant有什么区别?
简单来说,mvn是软件项目管理和理解构建工具,ant则是软件构件工具。 可以说mvn比ant多出的主要功能都是用来方便管理项目
mvn比ant多出了几个主要功能,
1.使用project object model来对软件项目管理;我们可以在POM文件添加任务所依赖的任何JAR包,避免手动导入出现的问题。Maven的dependence management用来管理所有此project的dependences,且在dependence repository
(资源库)中自动查找和下载dependence。
2.内置了更多的隐式规则,是构建文件更加简单;例如test文件下面必须放置测试文件,resources下面放置配置环境文件。隐性的对项目的构建进行了规范,使得项目变得清晰明了。
3.构建生命周期的定义;
构建生命周期显示的定义了构建,测试和发布的过程,也是每个mvn项目工程的核心,mvn包含三个内置生命周期;defalult.clean和site.
default生命周期处理工程的编译,测试和部署.
clean生命周期处理工程的清理工作,包含三个阶段'pre-clean,clean,post-clean.
site生命周期处理工程site文档的生成和部署.
2.clean,install,package,deploy分别代表什么含义?
mvn install 打包会安装到本地的maven仓库中,如果没有设置过maven本地仓库,一般在用户/.m2目录下
mvn package 打包(jar war)到本项目的target下面.
mvn deploy将打包文件发布到远程参考,提供其他项目人员下载依赖;
mvn clean 清理项目产生的临时文件,一般是模块下的target目录
3.怎么样能让Maven跳过JUnit? 在网上找的两个办法:
maven在编译的时候跳过test junit的写法
把下面这个写到 pom.xml 的<pluigins>里面
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
或者经常用的是:mvn compile install -DskipTests
经测试, mvn compile install -Dmaven.test.skip=true; 可以跳过Test Case.
-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。
-Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。
4.为什么要用Log4j来替代System.out.println?
Sys.out 控制台会打出一堆掺杂的信息,不容易找打需求.
但是log4j能自动把它存成文件 .绝大部分情况下.项目是脱离ide启动的.不能看到控制台打印的语句.但是log4j可以生成文件;
.log4j能够控制日志信息向往哪里打就往哪里打,比如控制台 文件 邮箱 数据库.
能够控制日志信息想怎么打就怎么打,比如:我想要打印时间、程序的名称、程序的方法名、程序的行号、线程的名称等等
能够控制日志信息想打什么打什么,不想打的就不打,日志信息是分级别的,有时候我只想看错误的信息或者警告的信息,有时候我想看到所有的信息我想调试程序等等.
5.为什么DB的设计中要使用Long来替换掉Date类型?
1. 因为DATE有固定的格式,不同的地区有不同的时间表示方法,而且外国有夏令时与冬令时之分,非常麻烦
2. 其实使用BigInt也能较为清晰的表示时间
3. 大多数时候我们并不关心某一个时间点,而是发生一个动作后,需要的时间,BigInt非常方便做减法而不用转化.
6.自增ID有什么坏处?什么样的场景下不使用自增ID?
自增id好处;
方便 SQL语句不用添加id字段的值.系统会自己添加.
保证单一数据库ID唯一.
坏处:
不存在连续性: 不会补齐id空位.
其他字段数据重复自增不会处理和提示;
面对对象时,不能保证完整性.
分库时候id就不会唯一.
什么场景下不适用自增ID
自增id的作用是唯一地标识表中的某一条记录,如果有其他能唯一标识改行数据的列,就不用设置自增id了,
在做分布式数据库的时候,要求同步自增id就会出现严重问题.
7.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
索引是一个表中所包含值的列表,其中注明了表中包含各个值的行所在的存储位置,使用索引查找数据时,先从索引对象中获得相关列的存储位置,然后再直接去其存储位置查找所需信息,这样就无需对这个表进行扫描,从而可以快速的找到所需数据.
·索引在数据库中的作用相当于目录在书籍中的作用类似,都用来提高查找信息的速度。
个人理解千万级以上的数据库就要建立索引了,索引对系统消耗也是特别大.之前给我的数据库建立索引时,数据库有5个字段,有几千万调数据,建立索引用了几分钟,
建索引的条件:
1、表的主键、外键必须有索引;
2、数据量超过300的表应该有索引;(这个不知道根据在哪)
3、经常与其他表进行连接的表,在连接字段上应该建立索引;
4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
5、索引应该建在选择性高的字段上;
6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
8.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。
唯一索引和普通索引的区别;
普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件
唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。
9.如果把学员QQ设置为唯一索引;插入数据前会不会先判断这个QQ号已经存在了
如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录.
所以程序员不需要判断这个QQ号是否存在.
11.修真类型应该是直接存储Varchar,还是应该存储int?
修真类型是字符串 ,所以是varchar.
12.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?
char(20),如果实际数据是"123",则会自动补17个空格;
varchar 是可变长度的字符串,不足时不会补空格,超过时会自动截断,长度0-255;
text 是长文本字符串,长度0-65535
varchar可以在数据长度不够的时候,按照实际的长度来分配空间,避免了空间浪费,但是在查询的时候会耗费一定的时间。
varchar为变长字节,所占空间为字符串实际长度加1,最长为65535个字节
而longtext也是变长字符存储,只保存字符数据,最长为4294967295字节,比较适合存储大内容
也就是说varchar是普通字符串,longtext是大文本.
14.为什么不可以用Select * from table?
1、SELECT * 语句取出表中的所有字段,不论该字段的数据对调用的应用程序是否有用,这会对服务器资源造成浪费,甚至会对服务器的性能产生一定的影响。
2、如果表的结构在以后发生了改变,那么SELECT * 语句可能会取到不正确的数据甚至是出错。
3、执行SELECT * 语句时,SQL Server首先要查找出表中有哪些列,然后才能开始执行SELECT * 语句,这在某些情况会产生性能问题。
4、使用SELECT * 语句将不会使用到覆盖索引,不利于查询的性能优化。
5、在文档角度来看,SELECT * 语句没有列明将要取出哪些字段进行操作,所以也是不推荐的。
15.什么是贫血模型,什么是充血模型?为什么我们会强制要求使用贫血模型?
贫血模型的实现一般包括如下包:
- dao:负责持久化逻辑
- model:包含数据对象,是service操纵的对象
- service:放置所有的服务类,其中包含了所有的业务逻辑
- facade:提供对UI层访问的入口
贫血模型的优点是很明显的:
- 它非常简单,对于并不复杂的业务(转帐业务),它工作得很好,开发起来非常迅速。它似乎也不需要对领域的充分了解,只要给出要实现功能的每一个步骤,就能实现它。
- 事务边界相当清楚,一般来说service的每个方法都可以看成一个事务,因为通常Service的每个方法对应着一个用例。
充血模型优点是面向对象,Business Logic(业务逻辑)符合单一职责,不像在贫血模型里面那样包含所有的业务逻辑太过沉重。缺点是比较复杂,对技术要求更高。
Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。
在传统的程序设计过程中,调用者直接使用new关键字创建被调用者的实例,调用者和被调用者之间的耦合度很高,要由调用者亲自创建被调用者的实例对象,不利于软件的移植与维护。
为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?
我觉得这是为了解耦, 如果把接口和实现分开写, 在需求更改的情况下可以做到最小程度修改代码.
如果有需求用到接口也可以直接调用就可以了.
java中很多框架就可以这样理解. 接口可以互相调用形成规则.而内部内容是封装起来的无法修改.
为什么要处理异常,Try/Catch应该在什么样的场景下使用
如果没有try的话,出现异常会导致程序崩溃。而try则可以保证程序的正常运行下去,
什么场景下使用try catch机制.
以业务逻辑功能为单位,在最上层加Try-Catch机制。为什么要这样做呢?这主要是增加程序的健壮性,防止因抛出异常过多,导致程序崩溃。.
底层代码,在可能出错的地方加Try-Catch机制,用Catch侦测具体的异常,然后就具体的异常,采取相应的解决方案。
底层代码,在需异常追踪时加Try-Catch机制,在Catch块中抛出自定义异常,调试时可迅速定位到错误代码段。
日志应该怎么打,在什么位置,需要打印出来什么样的关键参数?
不同级别的日志应该分开打印,
打在什么为位置就要根据所做项目的情况决定, 比如有重要的项目了我们可以将日志打在邮箱每天跟踪观察.
需要打的关键参数:时间.程序的名称,,程序的方法名,,,线程的名称.其他的暂时不知道,,肯定要跟着项目来的,
20.为什么需要单步调试?Debug的时候IDE是怎么找到源码的?
在程序开发中,为了找到程序的bug,通常采用的一种调试手段,一步一步跟踪程序执行的流程,根据变量的值,找到错误的原因。能够帮助我们直接或间接找到代码的问题所在..
21.可否远程连接到线上直接调试?真实的项目中,遇到问题的排查方案是什么?
可以远程连接到线上调试.
遇到问题的排查方案;
首先应该去查日志,根据日志报错查找问题所在. 如果问题比较严重,项目比较紧急.暂时无法找到问题所在或者无法解决问题,就要先找身边经验比较丰富的人先过来解决. 项目不紧急的情况下,用排除法一点一点排除,比如语法错误,,拼写问题.
这些都没问题就要求助平时积攒的资源百度查找解决.
参考文献:百度
明天的计划
完成任务总结和小课堂;
遇到的问题.
10.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口? //个人猜测创建时间就是创建时间的情况下赋值. 修改时间则为修改的情况下赋值.不应该开放给外部,
13.怎么进行分页数据的查询,如何判断是否有下一页? // 这个是否是根据取余数来进行判断, 如果有余数则有下一个
不知道判断是否正确.
20.Debug的时候IDE是怎么找到源码的? 这个真找不到 也无法理解的部分.
任务开始时间2017-8-23
任务结束时间2017-9-15
无延期风险
禅道; http://task.ptteng.com/zentao/task-view-10496.html
评论