1,主键和索引的区别是什么?
- 主键的特殊的索引,不能重复,不能为空,一个表只能有一个主键(从数据库完整性的角度出发)
- 索引:从提高查询速度的角度出发,相当于字典的目录,一个表可以有多个索引。索引是基于一个列创建的,索引他把这些值存储在b树中。
2,为什么使用B树做索引的数据结构?
- 因为它的时间复杂度低是对数级别的,查找插入,删除速度快,关键字有序查找时可以减少IO的次数(树的高度低)
- B+树比B树,占用的磁盘空间更小,IO读写代价更低。
- 主键外键必须有索引,链接的字段,where字句的字段,大表中的小字段建立索引
3,ACID指的是什么:
- A:是原子性,每个事物都是不可分割的单元,要么所有操作都执行要么都没有执行
- C:是一致性,数据库要一直处于一致的状态,强调数据的可见性,中间状态的数据不可见,最初和最终的状态可见。且保持一致。总的前没有变
- I:隔离性,多个事物并发执行时,一个事物的运行结果不能影响其它事物。
- D:永久性:已经执行的操作就永久生效(系统崩溃也不会丢失数据)
4,表级锁与行级锁的区别?
- 表级锁:开销小,加锁快,无死锁。锁粒度大,并发度低
- 行级锁相反。
5,数据库并发时可能出现的问题有哪些?
- 脏读:A添加了数据但没有提交事物,B却查到了A添加的数据
- 不可重复读:A修改了数据,导致B事物两次查询的结果不一致
- 幻读:A删除或者添加数据,导致B查询的结果不一致
- 解决方法:读未提交——读提交——可重复读——窜行化
6,删除表关键字有哪些,他们的区别是?
- 有truncate,delete,drop
- truncate 和delete不删除表结构,Drop删除表结构,
- truncate是直接清空表中的记录速度快(和事物无关) 和delete是一条一条的删除
1,为什么要使用spring?
- 为了方便解耦,将所有的对象创建和依赖关系的维护交spring容器管理
- spring还支持AOP编程,可以很方便的实现对程序进行程序拦截,运行监控的等功能
- spring还提供声明式事物的支持(通过配置完成对事物的支持,不需要手动编程实现)
- 方便测试,spring对Junit4支持,可以通过注解来测试测序
- 方便集成各种优秀的框架。
2,你是如何理解AOP的
- 我们平常写核心代码的时候是纵向编程的,直接跟着流程往下写。但是写到一些模块的时候,比如权限控制,日志记录,事物控制时,会出现大量的重复代码,于是我就把相关的重复代码抽出来写出一个公共的代码块,并且把它交个spring容器管理,实现解耦。(Active,jointPoint,pointCut,Aspect是前面两者的结合),感觉像装饰器模式,通过其它公用的方法对一些方法进行了增强。
- AOP是面向切面编程,是OOP编程的有效补充,可以将一些系统性相关的工作独立实现,
3,如何理解IOC控制反转?
- 为了降低程序中雷雨类之间的耦合吗,我们把对象交给spring容器来管理(工厂模式,代理模式)
4,spring有哪些模块?
- core:spring的核心类库,spring的所有功能都依赖核心类库,只要实现的是IOC功能
- aop:面向切面编程,提供拦截器机制
- orm:对象关系映射,是一种将内存中的对象保存到关系型数据库中的技术。spring本身并不对orm进行实现,仅对常见的orm框架进行封装,并对它进行管理
- dao:提供对JDBC的支持,对JDBC进行封装,并且可以统一管理JDBC的事物
- mvc:提供了springMVC进行web开发
- web:提供了对springMVC框架的支持,Structs。可以在这些框架前后配置拦截器
- context:提供框架式的bean访问方式(注解注入),和context来获取配置文件对象,对配置文件进行初始化时得到bean中的对象
5,spring常用的注入方式有哪些?
- setter属性注入
- 构造方法注入
- 注解方式注入
6,spring中的bean是线程安全的吗?
- bean默认是单利模式,spring框架并没有对单例的bean进行多线程封装处理,对于dao类基本上是无状态,所以某种程度上bean是安全的,但是对于view model对象是有状态的,就需要我们去保证
7,spring支持的5种作用域如下:
- singleton:spring ioc 容器中只存在一个bean实例,bean以单例模式存在,是系统的默认值
- prototype:每次从容器中调用Bean的时候就创建一个新的实例,getBean()相当于new Bean()操作
- request:每次发送http请求时就会创建一个bean
- session:同一个http session共享一个bean实例
- global-session:用于portlet容器
8,spring自动装配bean有哪些方式?
- no:表示没有自动装配,使用显示的bean引用进行装配
- byName:根据bean的名称进行注入
- byType:根据类型注入依赖项
- 构造函数:需要配置大量的参数
9,spring的事物实现有哪些方式
- 事物声明:xml配置,注解@Transaction
- 编码方式:提供编码的形式管理和维护事物
10,说一下spring的事物隔离?
有5大事物隔离
- 1,默认是isolation_default:使用数据库的设置,其它四个隔离和数据库的隔离是一致的
- 2,isolation_read_uncommitted:未提交读,最低的隔离级别,会出现幻读,不可重复读,脏读
- 3,isolation_read_committed:提交读,消除了脏读
- 4,isolation_repeaTable_read:可重复读。默认
- 5,isolation_seriable:序列化
11,说一下spring的运行流程:
- springMVC将请求发给DispatcherSercelet调度控制器,调度器查询一个或者多个处理映射,找到处理请求的controller,调度处理器再把请求交给controller,controller进行业务逻辑的处理,会返回一个ModelAndView.
- 调度控制器查询一个或者多个视图解析器,找到ModelAndView的指定视图对象,视图对象负责渲染页面返回给客户端
12,springMVC有哪些组件?
- 前端控制器:DispatcherSercelet
- 映射控制器:HandlerMapping
- 处理器:Controller
- 模型和视图:ModelAndView
- 视图解析器:viewResolver
13@RequestMapping的作用是什么?
用来处理请求映射的注解,可以用在类或者注解上,用于类上表示类中的所有请求的方法以该地址作为父路径
它有6大属性:
- value:指定请求的实际地址,可以是url template的模式
- method:指定请求的method类型:get post put delete
- consumes:指定处理请求的提交内容类型(content-type)例如:application/json,text/html
- produces: 指定返回的类型,只能是返回request请求头中的accept类型中包含的指定类型才能返回
- params:指定request中必须包含某些参数值才能让该方法进行处理
- @Autowired的作用是什么?
- 可以对类成员变量,方法及其构造函数进行标注,完成自动装配的任务。需要调用bean中的对象时,直接使用该注解进行注入
14,${}和#{}的区别是什么?
- #{}:把传入的数据当成一个字符串,会对自动传入的数据加一个双引号
- ${}:不会加双引号,所以它无法防止sql注入,一般用于传入数据库对象,表名,列名
16,mybatis有几种分页方式?
- 逻辑分页:使用它自带的RowBounds进行分页,一次性查询大量的数据(不是所有的数据),然后进行分页
- 物理分页:手动写sql分页或使用PageHandler,去查询数据库指定条数的分页形式
17,mybatis是否支持延迟加载?延迟加载的原理是什么?
- 支持延迟加载,需要设置lazyLoadingEnablle=true
- 延迟加载的原理:
18,说一下mybatis的一级缓存和二级缓存
19,mybatis和hibernate的区别有哪些?
20,mybatis有哪些执行器?
21,mybatis的分页插件的实现原理是什么?
22,mybatis如何编写一个自定义插件?