发表于: 2020-03-11 23:25:03

1 1247


在家看了点深度思考

1.Mybatis有哪些常用标签?怎么使用标签来完成动态查询?

有<if>用于条件判断,<trim>用于过滤掉前缀或者后缀,<include>用于复用sql语句,<foreach>用于迭代数组元素等。

select,insert,update,delete常用sql语句标签,parameterType,输入参数类型,resultType,返回参数类型。

5.Map,List,Array,Set之间的关系是什么,分别适用于哪些场景,集合大家族还有哪些常见的类?

map是键值对,是一个映射一个,相对应的关系集合可以存储学生的某一门成绩的表格,而list就是存储的一个对象一个对象的信息,可以重复,可以存储一个学生的成绩单。Array这是一个数组的集合,将数据用数组的方式存储,有点类似list,但是这是数组的存储可以存储一个学生的所有专业书(成绩)。而set集合不允许重复,更像是一个对象的唯一标识的集合存储学生的学号。常用的还有queue。

6.Spring的IOC有几种方式?它们之间的差别是什么,应该选择Annonation还是应该选择XML?

有接口注入,setter方法注入,构造方法注入。接口注入要求较高,需要接口和相关的配置。setter注入在我看来理解很容易,就是当需要注入的东西比较多时,就很繁琐。构造器注入和setter注入差不多,但构造器更整体。现在当程序较简单时,使用Annonation会比较简单,当程序结构交复杂时,还是只能使用xml。

7..JDBCTemplate和JDBC

JDBC是底层结构,没有使用框架,就是在一个class文件中完成所有的程序,但是可修改性太差。JDBCTemplate是spring的一个部分,我们用到spring框架就会让程序的耦合度降低,可修改性提升。

8.Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?

IOC就是控制反转,我们不用去为对象的引入而操心,只要提示spring我们要用哪个,spring就会给我们把这部分送过来,需要我们自己去新建。我们不用新建,这样的程序耦合度会降低。可修改性提升。

9.为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么? 

当我们的程序较为简单时,我们只需要一个实现类就可以完成所有的工作,并且接口会显得很多余,但是当我们的程序复杂起来,我们使用接口就会很方便,不用每次都要新建一个完全不相干的实现类,我们使用接口,所有的实现类都可以在这个基础上衍生。并且如果项目不是一期就完成,后面也利于维护修改。

简单、规范性:如果一个项目比较庞大,那么先定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了;

维护、拓展性:比如要做一个程序,其中里面有一个类,满足不了所需要的功能,又需要要重新设计这个类,如果这个类被其他地方引用,修改起来很麻烦。假如一开始就定义了一个接口,通过类实现这个接口,这样修改的时候只不过是引用另一个类而已,就达到维护、拓展的方便性。

安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些。

在大项目中,接口是需要提前做好架构的。一个完善的,轻巧,方便,直观,容易理解的接口架构,可以方便各个岗位的工程师同时开工最后整合。

方便了后期优化,实现了真正意义的封装(给别人看的都是最简单的最直接的,把复杂的具体的难理解的东西,都封装到实现类里)。

10.为什么要处理异常,Try/Catch应该在什么样的场景下使用,在真实的系统中,会出现网络中断,DB连接不上的错误吗?多久会发 生一次?

异常发生的原因主要有用户输入非法数据,要打开的文件不存在,网络通信时连接中断或者内存溢出。try/catch 代码块放在异常可能发生的地方,真实的系统中也会出现网络中路和DB连接不上的错误。

11.日志应该怎么打,在什么位置,需要打印出来什么样的关键参数? 

日志的打印位置一般在程序入口,异常捕获,和有重要信息的地方。日志打印通常有四种级别,从高到底分别是:ERROR、WARN、INFO、DEBUG。应该选用哪种级别就是个很重要的问题。INFO级别的日志应该是能帮助测试人员判断这是否是一个真正的bug,而不是自己操作失误造成的。DEBUG级别的日志应该是能帮助开发人员分析定位bug所在的位置。ERROR和WARN的级别都比INFO要高,所以在设定日志级别在INFO时,这两者的日志也会被打印。根据上面INFO和DEBUG级别的区别以及适用人员可以知道,ERROR和WARN是同时给测试和开发观察的。WARN级别称之为“警告”,这个“警告”实际上就有点含糊了,它不算错,你可以选择忽视它,但也可以选择重视它。打印内容的第一要素就是要能便于定位;定位过后也许用户在好几个模板中进行操作,还是定位,这个时候定的是模块的位;还有一点当然就是用户操作时的具体参数;最后一点就是用户干了什么。总结就是,[id, module, params, content](关键字,模块,参数,内容)。

12.为什么需要单步调试?Debug的时候IDE是怎么找到源码的?

单步调试可以一步一步的运行代码,实时的查看代码中某步出现的错误,准确定位代码出错的地方。

13.可否远程连接到线上直接调试?真实的项目中,遇到问题的排查方案是什么?

可以,真实项目中,我们可以通过远程连接的方式,进行调试。

远程调试:服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致)中设置断点,每当有请求到远程服务器时时能够在本地知道远程服务端的此时的内部状态。

15.为什么不可以用Select * from table?

会取出表中所有字段,解析更多更多内容,对服务器资源造成浪费;如果表的结构在以后发生了改变,那么SELECT * 语句可能会取到不正确的数据甚至是出错;select * 语句要对表中所有列进行权限检查,这部分也是开销;使用SELECT * 语句将不会使用到覆盖索引,不利于查询的性能优化;在文档角度来看,SELECT * 语句没有说明将要取出哪些字段进行操作,不具备针对性;用 select * 语句插入一个表,以后表结构修改了,如增加或删除了一列,对代码影响很大,不利于后期维护。

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

clean:我们在使用maven的构建项目会产生一个target文件,但我们修改了代码后就需要使用clean清除target,重新生成target。

package:打包到本项目,一般是在项目target目录下。如果a项目依赖于b项目,打包b项目时,只会打包到b项目下target下,编译a项目时就会报错,因为找不到所依赖的b项目,说明a项目在本地仓库是没有找到它所依赖的b项目。

install:打包会安装到本地的maven仓库中,如果没有设置过maven本地仓库,一般在用户/.m2目录下。如果a项目依赖于b项目,那么install b项目时,会在本地仓库同时生成pom文件和jar文件。

maven deploy:项目打包上传至远程仓库,将最终版本的包拷贝到远程。

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

maven-surefire-plugin的插件提供了对测试目录的配置。

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

Log4j可以生成日志文件,可以很方便的配置生成的信息格式。并且可以储存在本地,可以随时翻看。

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

方便进行日期进行计算,统一日期格式

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

不具有连续性,表中auto_increment最大值被删除,将不会被重用。就是说会跳号(如果设定的auto_increment_increment是1,那么下一次插入的id值将会从被删除的最大值算起,也就是被删除的最大值+1);历史数据表的主键id会与数据表的id重复,两张自增id做主键的表合并时,id会有冲突,但如果各自的id还关联了其他表,这就很不好操作。;很难处理分布式存储的数据表,尤其是需要合并表的情况下;在系统集成或割接时,如果新旧系统主键不同是数字型就会导致修改主键数据类型,这也会导致其它有外键关联的表的修改,后果同样很严重。

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

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。数据量超过300的表应该有索引; 表的主键、外键必须有索引; 经常与其他表进行连接的表,在连接字段上应该建立索引; 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 索引应该建在选择性高的字段上;

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

普通索引 :基本的索引类型,值可以为空,没有唯一性的限制。

唯一索引: 索引列的所有值都只能出现一次,即必须唯一,值可以为空。

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

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

不需要,MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。

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

create_at是在行插入时以当时的时间为值插入。update_at实在行一旦被修改的时候,以当时时间为值插入。这两个字段作为数据的属性,不应该调用给外部的接口。

25.修真类型应该是直接存储Varchar,还是应该存储int?

修真类型用varchar不如用int查询效率高,但是用int需要对每个特定的值做一个对应修真类型的映射或定义。如该字段值为1,代表修真类型为“css”等。

26.varchar类型的长度怎么确定?有什么样的原则,和Text和LongText的区别是什么。

根据需求与实际情况来考虑,不能千篇一律。varchar的长度,最好是在够用(需要适当预测未来需求)且方便管理的前提下尽可能短。Text的最大长度是可以存储 65535 (2^16 – 1) 个字符,LongText的最大长度是可以存储4294967295 (2^32 – 1) 个字符。

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

maven&ant同属apach是流行的构建工具。Maven 拥有约定,只要遵守约定,它就知道你的源代码在哪里。Maven 是声明式的。你需要做的只是创建一个 pom.xml 文件然后将源代码放到默认的目录。Maven 会帮你处理其它的事情。Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。缺点是运行许多默认目标。而ant没有约定,项目生命周期,它是命令式的。所有操作都要手动去创建、布置。甚至连build.xml文件都需要手动创建。


今日问题 暂无


返回列表 返回列表
评论

    分享到