发表于: 2018-02-28 23:09:19
1 751
今日完成
深度思考内容
1.maven是什么,和Ant有什么区别?
Maven是一个软件项目综合管理工具,不用手动导入jar包,只需在pom.xml中写入要引入的包,maven就会自动从中央仓库下载jar包。
ant是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具。
2. clean,install,package,deploy分别代表什么含义?
clean:移除所有上一次构建生成的文件
install:安装包存放至本地仓库,以备本地的其它项目作为依赖使用
compile:编译项目的源代码
test:使用合适的单元测试框架运行测试。
package:将编译好的代码打包成可分发的格式,如JAR,WAR,或者EAR
deploy:复制最终的包至远程仓库,共享给其它开发人员和项目
3. 怎么样能让Maven跳过JUnit?
下载Surefire 插件(可以在pom.xml中配置) Maven命令 mvn install -Dmaven.test.skip=true
4. 为什么要用Log4j来替代System.out.println?
log4j可以对日志分级别,还可以控制输出的类型和格式。能够得到自己想要的信息。
如果用Sys.out.pringtln控制台打出一堆掺杂的信息,比较乱。
5. 为什么DB的设计中要使用Long来替换掉Date类型?
由于时区和冬令时、夏令时等原因,如果使用date不能准确表达时间。
Long对应msql中的bigint对应java中的Long。2^63到2^63-1(即从-9,223,372,036,854,775,808到 9,223,372,036,854,775,807)之间的整数。
6. 自增ID有什么坏处?什么样的场景下不使用自增ID?
A.自增ID不存在连续性 ,如果删除了ID=5的数据,那么ID=3就不会再出现。
B.当2个表都有自增ID时,如果进行合并,那么就会出现问题;
C.若是能够有其他的字段能作为主键保证唯一性,无需使用自增ID
7. 什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引?
个人理解,数据库中的数据相当于是在一本乱序单词本中的单词,而索引是这这个单词本的目录,对数据进行了排序。
我在数据库中分别创建了有100条以下数据 ,100W条数据 和300W条数据的表格,分别在有索引和无索引的情况下进行测试。
当数据比较少时,查询速度没有差别,在数据过多时,在有索引时查询速度更快。
所以当数据量大时创建索引能提升性能。
8. 唯一索引和普通索引的区别是什么,什么时候需要建唯一索引。
唯一索引,不允许具有索引值相同的行,从而禁止重复的索引或键值。系统在创建该索引时检查是否有重复的键值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。
在某个字段数据唯一的时候可以使用;业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引①
9. 如果对学员QQ号做了一个唯一索引,在插入数据的时候,是否需要先判断这个QQ号已经存在了?
不需要,当执行插入和更新语句的时候系统会进行检查,如果已经存在,那么就会报错。
10. CreateAt和UpdateAt的意义分别是创建时间和修改时间,这两个时间应该在什么情况下赋值?是否应该开放给外部调用的接口?
在insert的时候对CreatAt赋值,在更新的时候对UpdateAt赋值。
个人理解可以根据情况开发给外部调用端口;
9. 修真类型应该是直接存储Varchar,还是应该存储int?
用varchar,也可以使用int。
11. varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么?
VARCHAR(M) | 可变长度L+1个字节,其中L<=M且0 <=M<= 65535 |
Text | 最大长度是 65535 (2^16 - 1) 个字符。 |
LONGTEXT | 最大长度是 4294967295 (2^32 - 1) 个字符 |
varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度大于此值,定义字段类型为 text ,独立出来一张表,用主键来对应,避免影响其它字段索
引效率。①
Text和LongText 也是长度可变的类型。
text和longtext区别在于text最大2^16,longtext达到2^32个字符。
12. 怎么进行分页数据的查询,如何判断是否有下一页?
使用limit进行分页查询,例如:
select * from student_copy where name like '%${value}%'limit 5
或者
select * from student_copy where name like '%${value}%'limit 5,5
13. 为什么不可以用Select * from table?
平时的查询中一般不会需要查看所有的字段,如果使用“*”则会降低查询效率
14. 什么是贫血模型,什么是充血模型?为什么我们会强制要求使用贫血模型?
领域模型是领域内的概念类或现实世界中对象的可视化表示,又称为概念模型或分析对象模型,它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。贫血模型是指使用的领域对象中只有setter和getter方法(POJO),所有的业务逻辑都不包含在领域对象中而是放在业务逻辑层。有人将我们这里说的贫血模型进一步划分成失血模型(领域对象完全没有业务逻辑)和贫血模型(领域对象有少量的业务逻辑),我们这里就不对此加以区分了。充血模型将大多数业务逻辑和持久化放在领域对象中,业务逻辑(业务门面)只是完成对业务逻辑的封装、事务和权限等的处理。下面两张图分别展示了贫血模型和充血模型的分层架构。更加细粒度的有失血模型,贫血模型,充血模型,胀血模型。贫血模型就是domain ojbect包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到Service层。失血模型简单来说,就是domain object只有属性的getter/setter方法的纯数据类,所有的业务逻辑完全由business object来完成(又称Transaction Script),这种模型下的domain object被Martin Fowler称之为“贫血的domain object”。充血模型和第二种模型差不多,所不同的就是如何划分业务逻辑,即认为,绝大多业务逻辑都应该被放在domain object里面(包括持久化逻辑),而Service层应该是很薄的一层,仅仅封装事务和少量逻辑,不和DAO层打交道。
参考:https://www.jianshu.com/p/1b824b1bffd6
15. Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
IOC指控制反转:将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制
我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;
传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;依赖对象的获取被反转了。
参考:http://blog.csdn.net/qq_22654611/article/details/52606960/
16. 为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?
JAVA只允许一个类只能继承一个抽象类,而一个类却可以继承实现多个接口。
接口与实现不分离,则只能继承一个抽象类,但有时候需要继承多个
接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现类可以具有不同的行为。
接口是个规范、接口进行了抽象、实现多态。
将Dao层和程序上面的其他部分分开了,当需要调用的时候也只是调用接口的引用。
17. 为什么要处理异常,Try/Catch应该在什么样的场景下使用,在真实的系统中,会出现网络中断,DB连接不上的错误吗?多久会发 生一次?
为什么要处理异常:异常产生后,如果不做任何处理,程序就会终止;
Try/Carch
例如:
连接数据库时:
ublic class TemplateDemo {
static Connection conn;
private static String url;
private static String name;
private static String password;
private static String driver;
static{
GetProperties q=new GetProperties();
Properties prop=q.GetProp();
driver=prop.getProperty("driver");
url=prop.getProperty("url");
name=prop.getProperty("name");
password=prop.getProperty("password");
}
public Connection open(){
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn= DriverManager.getConnection(url,name,password);
} catch (SQLException e) {
e.printStackTrace();
}
System.out.println("连接成功");
return conn;
}
1.try:它里面放置可能引发异常的代码
2.catch:后面对应异常类型和一个代码块,用于表明该catch块用于处理这种类型的代码块,可以有多个catch块。
3.finally:主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件),异常机制总是保证finally块总是被执行。
4.throw:用于抛出一个实际的异常,可以单独作为语句使用,抛出一个具体的异常对象。
5.throws:用在方法签名中,用于声明该方法可能抛出的异常。
18. 日志应该怎么打,在什么位置,需要打印出来什么样的关键参数?
日志可以用System.out.println()输出和log4j输出;
在项目中log4j取代System.out.println()输出。方便设置输出地址,输出参数,输出级别等
Log4j实例
log4j.rootLogger=DEBUG, stdout,logFile
log4j.logger.org.mybatis.example.BlogMapper=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n]
log4j.appender.logFile=org.apache.log4j.FileAppender
log4j.appender.logFile.Threshold=DEBUG
log4j.appender.logFile.ImmediateFlush=true
log4j.appender.logFile.Append=true
log4j.appender.logFile.File=E://logs/debuge.txt
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=%5p [%t] - %m%n]
Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局)。
Loggers组件在此系统中被分为五个级别:DEBUG < INFO < WARN < ERROR < FATAL.
Appenders:控制日志输出的目的地.
Layouts:日志输出样式.
19. 为什么需要单步调试?Debug的时候IDE是怎么找到源码的?
单步调试是指程序开发中,为了找到程序的bug,通常采用的一种调试手段,一步一步跟踪程序执行的流程,根据变量的值,找到错误的原因。
20. 可否远程连接到线上直接调试?真实的项目中,遇到问题的排查方案是什么?
我们一般在本地写代码时,如果程序出现问题了,一般情况下,我们会在程序中打各种log,调试,找出问题,修改,测试,部署到服务器,再测试。但如果在真实项目中的呢,这样做虽然也可以,显然是不方便的。
真实项目中,我们可以通过远程连接的方式,进行调试
远程调试:服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致)中设置断点,每当有请求到远程服务器时时能够在本地知道远程服务端的此时的内部状态。
参考:师兄日志
评论