一、Mybatis
1. 简述mybatis中#{}和${}的区别?
Mybatis中 ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换。
示例:${driver}会被静态替换为com.mysql.jdbc.Driver。
#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号。
在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值。
示例:ps.setInt(0, parameterValue),#{item.name}的取值方式为使用反射从参数对象中获取item对象的name属性值,相当于param.getItem().getName()。
#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入攻击,提高系统安全性。
2. Mybatis 结果集的映射方式有几种,并分别解释每种映射方式如何使用?
自动映射 ,通过resultType来指定要映射的类型即可。
自定义映射 通过resultMap来完成具体的映射规则,指定将结果集中的哪个列映射到对象的哪个属性。
3. 简述Mybatis提供的两级缓存,以及缓存的查找顺序?
1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认二级缓存时是开启的,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),需要在它的映射文件中配置 ;
3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。
4. Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
if 标签
通常用于 WHERE 语句、UPDATE 语句、INSERT 语句中,通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值。
foreach 标签
主要用于构建 in 条件,可在 sql 中对集合进行迭代。也常用到批量删除、添加等操作中。
choose 标签
从多个选项中选择一个,MyBatis 提供了 choose 元素,按顺序判断 when 中的条件出否成立,如果有一个成立,则 choose 结束。
当 choose 中所有 when的条件都不满则时,则执行 otherwise 中的 sql。
类似于 Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
where 标签
当 if 标签较多时,如果标签返回的内容是以 AND 或 OR 开头的,则它会剔除掉.
set 标签
使用 set 标签可以将动态的配置 set关键字,和剔除追加到条件末尾的任何不相关的逗号。
trim 标签
格式化输出,也可以通过 trim 标签设定或忽略前后缀来实现.
配置关联关系
collection 标签 配置一对多
association 标签 配置一对一
sql 标签
当多种类型的查询语句的查询字段或者查询条件相同时,可以将其定义为常量,方便调用。为求 结构清晰也可将 sql 语句分解。
include标签
引入sql片段。
selectKey标签
为不支持自增的主键生成策略标签。
二、Spring
1. 当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
第2种: 通过 映射字段名和实体类属性名的一一对应的关系
2. spring框架的深入理解?
Spring一款容器框架,其核心是IOC和AOP
(1)IOC就是控制反转,指创建对象的控制权转移给Spring框架进行管理,并由Spring根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。
DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部依赖。
(2)最直观的表达就是,以前创建对象的主动权和时机都是由自己把控的,IOC让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。
(3)AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理。
AOP实现的关键在于 代理模式,AOP代理主要分为静态代理和动态代理。静态代理的代表为AspectJ;动态代理则以Spring AOP为代表。
3. 请解释Spring Bean的生命周期?
1.默认情况下,IOC容器中bean的生命周期分为五个阶段:
①调用构造器 或者是通过工厂的方式创建Bean对象
②给bean对象的属性注入值
③调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的.
④使用
⑤IOC容器关闭时,销毁Bean对象.
2.当加入了Bean的后置处理器后,IOC容器中bean的生命周期分为七个阶段:
① 调用构造器 或者是通过工厂的方式创建Bean对象
② 给bean对象的属性注入值
③ 执行Bean后置处理器中的 postProcessBeforeInitialization
④调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的.
⑤执行Bean的后置处理器中 postProcessAfterInitialization
⑥使用
⑦IOC容器关闭时, 销毁Bean对象
4. spring bean的作用域有哪些?
(1)singleton:默认作用域,单例bean,每个容器中只有一个bean的实例。
(2)prototype:为每一个bean请求创建一个实例。
(3)request:为每一个request请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
(4)session:与request范围类似,同一个session会话共享一个实例,不同会话使用不同的实例。
(5)global-session:全局作用域,所有会话共享一个实例。如果想要声明让所有会话共享的存储变量的话,那么这全局变量需要存储在global-session中。
5. spring框架中通知类型的理解?
(1)前置通知(Before Advice):在连接点(Join point)之前执行的通知。
(2)返回后通知(AfterReturning Advice):在连接点正常完成后执行的通知(如果连接点抛出异常,则不执行)
抛出异常后通知(AfterThrowing advice):在方法抛出异常退出时执行的通知
(3)后置通知(After Advice):当连接点退出的时候执行的通知(不论是正常返回还是异常退出。
(4) 环绕通知(Around Advice):包围一个连接点的通知,这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也可以选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
三、SpringMVC
1.springmvc的运行流程?
1.发送请求到前端控制器(dispatcherservlet)
2.前端控制器(dispatcherservlet)接收到请求后,根据URL调用HandlerMapping获得该handler配置的所有相关的对象,最后以HandlerExecutionChain对象的形式返回
3.dispatchersevlet根据获得的handler,选择一个合适的handlerAdapter
4.提取request中的数据模型,填充handler入参(返回参数),开始执行handler(也就是cotroller)
5.handler执行完成后,向dispatcherservlet返回一个modelandview对象
6.dispatcherservlet接收到modelandview对象,将modelandview对象传给viewresolve
7.viewresolver解析后返回具体的view
8.dispatcherservlet将渲染视图,返回给客户端
2. springmvc中常用的注解,并阐明其作用?
- @Controller,使用它标记的类就是一个SpringMVC Controller 对象
- @RequestMapping,处理请求映射地址
- @PathVariable,用于对应restful风格url中的参数
- @RequestParam,将请求的参数绑定到方法中的参数上
- @ResponseBody,将返回类型直接输入到http response body中
- @RequestBody,方法参数直接被绑定到http request body中
3. 想在拦截的方法里面得到从前台传入的普通参数,怎么得到?
直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样。
4. 如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?
直接在方法中声明这个参数,SpringMVC会把参数自动装配到这个对象中。
5. Springmvc怎么和ajax相互调用的?
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象。具体步骤如下∶
1.加入Jackson.jar
2.在配置文件中配置json的映射
3.在接受Ajax方法里面可以直接返回Object,List等,但方法前面要加上@ResponseBody注解。
6. @RequestMapping注解用在类上面有什么作用?
它是一个用来处理请求地址映射的注解,可用于类或方法上。
用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
7. SpringMVC怎么样设定重定向和转发的?
(1)在返回值前面加"forward:“就可以让结果转发,譬如"forward:user?name=method4”
(2)在返回值前面加"redirect:“就可以让返回值重定向,譬如"redirect:http://www.atguigu.com”