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