二阶段面试题总结

一.数据库里索引的作用

主要作用是为了提高查询效率,它的执行也是有一定条件的,不加索引就一定能够加快查询的效率,由于索引的创建是需要占据内存空间的,所以有些情况不适合加索引,如下:

1.如果每次都需要取到所有表记录,无论如何都必须进行全表扫描,那么是否加索引就没有意义了

2.队唯一的字段,例如"性别"这种大量重复值的字段,增加索引也没有意义

3.对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存相互空间的,而且有个致命缺点就是对于update/insert/delete的每次执行,字段的索引都必须重新计算和更新

4.mysql中通过Explain来查看索引的扫描次数

二.什么是数据库的事务?

事务就是为了保证原有事务的完整性和一致性,通过一定的条件规定该事物的可靠性和一致性(如数据库中的事物),同时具有四大特性:

原子性(atomicity):一个事物是不可再分的工作单位,该事物要么成功要么失败

一致性(consistency):事物必须是使数据库从另一个一致性状态到另一个一致性状态,与原子性密切相关

持久性(durability):指一个事物一旦提交后对数据库中数据的改变应该是永久不变的

隔离性(isolation):一个事物的执行不能够被其他事务所干扰

三.数据库里的字段约束有哪些,各有什么作用

1.主键约束:实现实体的完整性(primary key:主键),值唯一,不能为空,且使用主键的自增策略(auto_increment)

2.外键约束:用于多表之间的查询,该表主键作为另外张表的外键建立标语标志就的关系(foreign key)

3.非空约束(not null):保证该字段的内容不能为空 null

4.唯一约束:(unique):字段的值必须唯一的约束

5.检查约束(check):检查列的值是否满足一个boolean表达式

6.默认约束(default):给指定的字段可以设置默认值,不设置值时使用默认值而不是null

四.数据库优化的方案有哪些

1.查询时,能不用*就不用,尽量写字段名

2.索引不是越多越好,每个表的索引控制在5个以内

3.大部分情况连接效率远大于子查询,但是有例外

4.多用explain和profile分析查询语句

5.连接查询的性能上尽量使用小表驱动大表的原则

6.查看慢时查询日志,找出时间长的SQL进行优化

7.尽量避免使用order by

8.因为where子句后面的条件是从右到左,所以尽量把能过滤大部分数据的条件放在最右边

五.什么是Spring IOC

把一个类放入spring容器中,对象的创建/初始化/销毁等工作交给Spring容器来做.有spring容器控制对象的生命周期

六.描述Spring AOP的机制及原理

AOP把系统分为两部分,核心关注点和横切关注点.核心主要处理业务逻辑,横切主要是权限验证,日志,事务处理等,涉及到诸多概念.

AOP主要由:

方面(Aspect)一个关注点的模块化,这个关注点实现可能另外横切多个对象.事务管理是JSEE应用中一个很好的横切关注点例子.方面用的Spring的Advisor或拦截器实现

连接点(Joinpoint):程序执行过程中明确的点,入方法的调用或特定的异常被抛出

通知(Advice):Spring定义了四个advice:BeforeAdvice,AfterAdvice,ThowAdvice和DynamiclntroductionAdvice

切入点(Pointcut):Spring定义了Pointcut接口,用来组合MethodMather和ClassFilter,可以通过名字很清楚的理解,MethodMatcher使用来检查目标类的方法是否可以被应用此通知,而ClassFilter使用来检查Pointcut是否应该应用到目标类上

引入(Introduction) Spring中要使用Introduction,可有通过DelegatingIntroductionInterceptor来实现通知

目标对象(Target Object): 包含连接点的对象.也被称作被通知或被代理对象

AOP代理(AOP Proxy): AOP框架创建的对象,包含通知.在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理.

织入(Weaving):组装方面来创建一个被通知对象.还可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成.Spring和其他纯Java AOP框架一样,在运行时完成织入.

七.描述Spring MVC处理流程及应用优势

SpringMVC严格上来说是一种设计思想而不是设计模式,其底层采用反射的机制构建工程,适配器,代理模式构建.

1.用户向服务器发送请求,请求被Spring前端控制器Servelt DispatcherServlet 捕获

2.DispatcherServlet对请求URL进行解析,得到请求资源标识符(URL).然后根据该URL,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及handler对象对应的拦截器),最后以HandlerExectionChain对象的形式返回

3.DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter.(注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHander(...)方法)

4.提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller).在填充handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:HttpMessageConveter:将请求消息(如Json,xml等数据)转换成一个对象,将对象转换为指定的响应信息

数据转换:对请求消息进行数据转换.如String转换成Integer,Double等

数据格式化:对请求消息进行数据格式化.如将字符串转换成格式化数字或格式化日期等

数据验证:验证数据的有效性(长度,格式等).验证结果存储到BindingResult或Error中

5.Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象

6.根据返回的ModelAndView,选择一个合适的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet

7.ViewResolver结合mModel和View,来渲染视图

8.将渲染结果返回给客户端.

八.Mybatis应用中#与$有什么区别

#能够有效防止SQL注入攻击,并且是预编译的SQL

#还能够把传入的数值当成一个字符串,会自动拼接字符串,加一对" "

如:where name = #{name}如果传入的是jack,那么解析成的SQL是:where name ="jack"

$会将传入的值直接显示在SQL中,会有SQL注入攻击的风险,且相对低效,不会拼接字符串

九.Mybatis的工作原理

本质上是封装了JDBC,简化了jdbc的操作并且是一个非常优秀的ORM框架

1.mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java(#`O′)那件配置的方式,需添加@Configuration)中构建SqlSessionFactory(SqlSessionFactory是线程安全的)

2.SqlSessionFactory的实例直接开启一个SqlSession

3.再通过SqlSessionshilihuo9deMapper对象

4.执行Mapper印社的SQL语句,完成对数据库的(CRUD)增删改查和事务提交

5.关闭SqlSession

说明:SqlSession是单线程对象,因为它是非线程安全的,是持久操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc链接.

十.Mybatis中resultType和resultMap的区别

Mybatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap

resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部

ResultMap的引用(提前定义了db和model之间的映射key:value关系),但是resultType跟resultMap不能同时存在.

在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
(1)当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
(2)当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

十一.MyBatis中缓存的LRU算法描述及实现分析

LRU也就是"最近最少使用",LRU缓存就是使用这种原理实现的,就是缓存一定量的数据,当超过该数据的阈值(界限或范围)时就把相关的数据删掉,例如我们缓存10000条数据,当小于该数据是可以随意的增加,超过时就将过去的数据删掉.

好比java中实现RU就有两种方式:一是LinkedHashMap,一种是自己设计的数据结构,使用链表+HashMap.

最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:

        

1.新增数据插入到链表头部;

2.当缓存命中(即环迅数据被访问),则将数据移到链表头部;

3.当链表满的时候,将链表尾部的数据丢掉.

分析:

[命中率]当存在热点数据时,LRU的效率很好,但偶发性的,周期性的批量操作会导致LRU命中率急剧下降,缓存污染等情况.

[复杂度]实现简单

[代价]命中是需要遍历链表,找到命中的数据块索引,然后需要将数据移到头部.

十二.get和post请求的区别?

1.get请求用来服务从服务器获得资源,而post是用来向服务器提交数据;

2.get将表单中数据按照name=value的形式,添加到action所指向的URL后面,并且两者使用后?

3.get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据,POST数据是没有限制的,上传文件通常要使用post方式;

4.使用get是参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应用使用post;

5.get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20".

十三.什么是SQL注入攻击及解决的方案(如何避免)

SQL注入:就是通过把SQL命令插入Web表单递交或输入域名货页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,他可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句.

防止的方法:

1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"将星转换等.

2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取.

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接

4.不要把机密信息明文存放,请假米或者hash掉密码和敏感的信息

5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中.

十四.什么事盒子模型?

在网页中,一个元素占有空间的大小由几个部分构成,其中包括元素的内容(content),元素的内边距(padding),元素的边框(border),元素的外边距(margin)四个部分.这四个部分占有的空间中,有的部分可以显示相应的内容,二有的部分只用来分隔相邻的区域.四个部分一起构成了css中元素的盒子模型.

十五.简述一下src 与 href的区别

1.href是指网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,用于超链接

2.src是指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置,在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素.当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载,编译,执行完毕,图片和框架等元素也如此,类似于将所指向资源嵌入当前标签内.这也是为什么将js脚本放在底部而不是头部.

十六.CSS选择器有哪些?

1.id选择器 (#myid)

2.类选择器(.myclass)

3.标签选择器(div,h1,p)

4.相邻选择器(h1 + p)

5.子选择器(ul>li)

6.后代选择器(li a)

7.通配符选择器( * )

8.属性选择器(a[rel = "external"])

9.伪类选择器(a:hover,li:nth-child)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值