发表于: 2018-03-14 22:55:32
1 469
今天完成的事情:
A.深度思考
1.maven是什么,和Ant有什么区别?
答:ant是项目管理工具,主要依靠bulid.xml文件来进行项目管理,是命令式的,所有的操作都要写在build文件中。maven也可以做相同的事情,并且通过约定优于配置和自身所管理的项目对象模型(program object model,POM)来将项目的生命周期和文件结构固定起来。同时需要特定的操作,也可以在pom.xml文件中添加相应插件。
2.clean,install,package,deploy分别代表什么含义?
答:四个都是maven中的生命周期中的某个阶段。clean代表清楚上次构建生成的所有文件,属于Clean Lifecycle。install,package和deploy时构建的核心Default Lifecycle的其中阶段。install会将包安装到maven本地仓库,供其他开发人员或maven项目使用。package在install之前接受经编译好的代码打包为可以发布的格式。deploy将最终的包赋值到远程仓库,供其他开发人员和maven项目使用。
3.怎么样能让Maven跳过JUnit?
答:3.1可以在pom.xml文件中的build标签中添加plugin元素。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
3.2在idea中打开maven project的Tool Buttons点击上面的skip-test后在maven的Lifecycle中就会将test划掉,之后运行package就会跳过test。也可以在setting中的build tool中选择maven-Runner勾选skip-test保存,是同种方法。
3.3在本地命令行mvn compile install -Dskip Test或者mvn compile install -Dmaven.test.skip=true执行所有test跳过。跳过指定测试类可以用注解@Ignore代替需要跳过的测试方法上注解@Test或mvn clean test -Dtest=ATest,BTest,还可以在pom文件中的maven-surefire-plugin插件中的configuration元素里面用includes元素和excludes元素来指定要跳过的测试类。
4.为什么要用Log4j来替代System.out.println?
答:system.out的信息只能输出到控制台,不会保存到文件,开发时候可以适当使用比较方便。但是一旦应用程序放到线上时,需要日志来跟踪记录程序的运行状况,起到监视、记录等作用。Log4j的输出目的地可以有多种方式,还可以将信息分级,设置格式,还可以长时间保存。而且关掉log4j只需要在配置文件中将信息级别提高,不用一条条注释。
5.为什么DB的设计中要使用Long来替换掉Date类型?
答:java和DB中对于时间的处理有很多类都有固定的格式,所以涉及到类型转换时会出现错误和精度问题。还有时区和时令的问题也要解决。用long类型获取当前时间的毫秒数,存储到DB中的Bigint类型中,便于保持精度,方便传输,在计算时间差时也方便,需要时可以将毫秒数转化为方便读的时间格式。
6.自增ID有什么坏处?什么样的场景下不使用自增ID?
答:自增id用来记录数据库中信息的行数,不需要手动去控制。自增id的坏处,因为有自增id的表格中id都是数字,会存在相同是id,如果合并时会导致覆盖丢失数据。就是说id无法唯一标识记录。在做分布式数据库时要求数据同步以及数据合并的情况,就无法使用自增id,不过现在有全局ID唯一。
7.什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
答:索引是一个存储着表中特定列的值的数据结构。索引是一种数据结构。常见是是B-Tree,B-Tree中的值会按照字母顺序排序。可以直接指向固定的记录,索引时需要占据物理空间的。当在一个表中获取信息时,需要全表扫描将所有符合条件的信息都拿出来,而索引可以规避这些。
对于使用频繁的表索引需要早建,反之可以晚些。
创建索引是为了提高检索速度,建前收集表上所有查询的各种不同组合,找到具有最佳离散度的列创建索引。原则上讲只要表中的某列在查询过程中使用非常频繁就需要在这个列上创建索引。或者需要增加数据唯一性,提高检索速度,加快表见的连接速度,都可以使用索引。
8.唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。
答:唯一索引是不允许其中任何两行具有相同索引值的索引,但可以有空值。普通索引没有限制。
数据库中某个字段的值是唯一的需要添加唯一索引。
9.如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?
答:不需要,唯一索引不允许有相同值的数据,所以数据库会报异常出来。
10.CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?
答:CreateAt是在创建时获取的,以后不变。UpdateAt是在更新时获取,每次更新都需要更新为当前更新的时间。
如果时查询接口可以开放,但是修改或删除等可以修改数据记录的接口不应该开放。
11.修真类型应该是直接存储Varchar,还是应该存储int?
答:首先修真类型时字符,如果直接存到表中只能存储为Varchar类型,但是因为占用空间大,所以数据量大时可以将数据类型设置为外键用int存放,连接一个单独放修真类型的表。
12.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?
答:varchar存储变长数据,长度必须在后面括号里定义好的,可以有默认值。varchar类型的实际长度是它的值的实际长度+1,这个字节用来保存实际使用了多大的长度。
Text数据类型用来存储可变长度的非Unicode的数据,最大长度为((2^16)-1),不能有默认,分大小写,即使超过指定长度也不会报错。LongText最大长度为((2^32)-1)。
区别是字符集不同,检索效率比其他两个高。
13.怎么进行分页数据的查询,如何判断是否有下一页?
答:MySQL中实现分页查询,使用提供的LIMIT函数,一般直接写到sql语句中就行了。LIMIT子句可以用来限制select语句返回的数据条数,可以一个参数也可以两个,两个时第一个参数时用来定位第一条数据行数,第二个用来指定返回的总行数。MySQL中是起始值是0。通过limit进行的是物理分页,每次查询都会连接数据库。
MySQL中用select count(*) from t_students;可以的到当前表的行数,除以要分页的行数可以的到一个页数,然后加入从0行开始,每次查询后,页数减一,用if条件句判断只要页数小于0就停止查询。
14.为什么不可以用Select * from table?
答:浪费数据库资源,查询速度慢,如果数据量大查询结果也没意义。需要设定条件,缩小查询范围。
15.什么是贫血模型,什么是充血模型?为什么我们会强制要求使用贫血模型?
答:贫血模型指领域对象(domain object)中只有属性和getter、setter方法。所有的业务逻辑都不包含在内而是放在业务逻辑层。
充血模型是大多数业务逻辑和持久化放在domain object中,业务逻辑层只是简单封装部分业务逻辑以及控制失误、权限等。
强制要求使用贫血模型是因为a.每个贫血对象职责单一,所以模块解耦程度高,有利于错误隔离。b.这种模型非常适合于软件外包和大规模软件团队协作,每个人只需要负责单一职责的小对象模块编写,不互相影响。
16.Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
答:spring中IOC是inversion of control,也叫控制反转。将控制依赖对象的生命周期控制权从需要依赖的对象转移到了springIOC容器中,spring会将这些对象初始化,当被需要时就可以直接用了。
不用new是为了精简应用程序,减少耦合度,在spring配置文件中可以建立对象间的依赖关系。
17.为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?
答:接口是只定义函数方法而不具体实现,这样当继承接口时,就可以用不同的业务逻辑实现方法体。所以使用接口的话,就是定义了一种规范,因业务逻辑不同而有不同的实现,不用改变已写好的代码指需要新增一个类来实现新逻辑。
18.为什么要处理异常,Try/Catch应该在什么样的场景下使用,在真实的系统中,会出现网络中断,DB连接不上的错误吗?多久会发 生一次?
答:异常抛出常会导致应用程序中断无法继续运行,将异常向外抛出,调用该方法的程序进行同样处理,如此层层抛出,直到当前线程处时终止线程执行。使用异常处理可以在抛出异常后后续程序继续运行。Try/Catch用在处理业务逻辑上出错上处理运行时异常。
DB连接不上不常见也不可预见。
19.日志应该怎么打,在什么位置,需要打印出来什么样的关键参数?
答:日志应该有一定格式,记录一定分级的信息不用所有级别信息都保存,需要保存到本地一般时程序的运行地址下。保存内容中要包含记录信息的级别,线程和时间,这样出问题时方便定位。
20.为什么需要单步调试?Debug的时候IDE是怎么找到源码的?
答:单步调试是为了找到程序的bug,调试时可以查看到各变量值的变化。调试时需要设置断点,当开始调试时程序会运行到断点停止等待调试,这时源码也就加载了。
21.可否远程连接到线上直接调试?真实的项目中,遇到问题的排查方案是什么?
答:可以,远程调试的话调试环境就是程序运行环境,有问题的可以更好定位及解决。
排查方案时查看报错信息,通过堆栈信息定位具体问题发生点。分清时Exception还是Error,对症下药。
任务小结:任务一做完学习了使用命令行运行MySQL的sql语句创建数据库、表格,设定字段类型、主键、字符集设置,安装开发环境,使用idea编写JDBC程序。从原始JDBC,到使用mybatis映射,再到spring整合mybatis的JDBC,过程中学习了连接数据库的流程,接口和实现的分离,配置映射文件,配置spring文件,编写测试单元,使用log4j记录日志,服务器配置并运行jar包。
明天的计划:
做任务二
遇到的问题:
深度思考好多问题,不了解只简单的回答了下。
收获:
学会使用MySQL分页查询,了解远程调试的作用。
评论