第一题:Mybatis中#{…}和${…}的区别
答案:
#{…}:会把参数的位置使用“?”做占位符,执行SQL的时候才会替换“?”的值
${…}:直接把参数中的值作为SQL的一部分来执行→可能会有SQL注入的问题
如何选用:
.
.
.
:
当
插
入
的
参
数
是
作
为
S
Q
L
执
行
的
一
部
分
的
时
候
必
须
使
用
{...}:当插入的参数是作为SQL执行的一部分的时候必须使用
...:当插入的参数是作为SQL执行的一部分的时候必须使用{…}
#{…}:当传入的参数是同数据库进行交互的时候,使用#{…}
简单地判断:传入的参数在SQL中是否能够加上单引号。可以加单引号,使用#{…},不能加单引号,使用${…}
第二题:Mybatis使用mapper接口开发,需要遵循的一些约束条件
答案:
1.mapper映射文件中的namespace的值,必须等于mapper接口的全限定名
2.mapper映射文件中的Sql的id,必须等于mapper接口中的方法名
3.mapper映射文件中的Sql的paramterType必须跟对应的方法的类型相同.
4.方法的返回值必须和resultType或者resultMap的值保持一致
第三题:Maven的常用命令,及其含义
答案:
根目录下 shift+右键 打开命令窗口
mvn compile 编译
mvn clean 清除字节码
mvn clean compile 先清除字节码,再编译
mvn test 执行测试
mvn package 当前项目打包 .jar .war
mvn clean site 生成项目帮助文档
mvn install 将项目打成包安装到maven仓库中
第四题:Maven管理依赖时的作用范围的取值有哪些?以及各个取值的含义是什么?
答案:
1、compile (编译范围)
compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath 中可用,同时它们也会被打包。
2、provided (已提供范围)
provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API;这个Servlet API JAR 由你的应用服务器或者servlet 容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。
3、runtime (运行时范围)
runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC
驱动实现。
4、test (测试范围)
test范围依赖 在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
5、system (系统范围)
system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中 JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的, Maven 也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个 systemPath 元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。
第五题:简介Mybatis的缓存机制
答案:
在内存空间开辟一个区域用来存放数据,在内存中存放的数据叫缓存
目的:提高查询的效率
原理:因为cpu同内存交互的速度高于同磁盘交互的速度
本质:map
mybatis的缓存分为一级缓存和二级缓存
一级缓存:
在每次开启一个sqlsession对象的时候,在sqlsession中都会开辟一个空间作为一级缓存,存放数据
有一定的局限:作用范围只是一个sqlsession内部,但是sqlsession的生命周期比较短暂。一级缓存对于性能的提升非常有限
真正提升性能要使用二级缓存
二级缓存:
1、什么样的数据适合放到缓存中去?
经常被查询的数据,不经常被修改的数据,读取远远大于写的数据
2、缓存的命中率
从缓存中获取的数据量/总的获取的数据的数据量
3、最大生存时间
数据能够在内存中存在的最长时间
一级缓存和二级缓存可以共存
一级缓存是sqlsession级别
二级缓存是namespace级别(在映射文件中,添加)
第六题:Mybatis常用的动态SQL标签有哪些
答案:
if:
适用于动态的包含where字句的一部分
if的特点是
当if的判断条件满足时,添加if标签中的字句
当if的判断条件不满足时,什么都不添加
choose:
适用于:
当判断的条件为true时,执行一个语句
当判断的条件为false时,执行另一个语句
where和set:
where的作用:
1、当where标签中的语句不为空时,会在语句之前拼接上“where”关键字
2、假如where标签中的语句是以“and”或者“or”开头,那么这个“and”或者“or”会被省略掉
set的作用:
1、假如set标签中的语句不为空,那么会在开头拼接“set”关键字
2、假如set标签中的语句是以“,”结尾,那么这个“,”会被去掉
Trim:
prefix:前缀,在赶回的字符串之前添加什么内容
suffix:后缀,在返回的字符串之后添加什么内容
prefixoverrides:当字符串以其中的内容开头时,该内容会被覆盖
suffixoverrides:当字符串以其中的内容结尾时,该内容会被覆盖
Foreach:
注意:当接口中方法的参数为数组或者集合时,mybatis会自动的把该参数封装成一个map
map的key为参数类型,首字母小写
默认:数组的key为“array”,集合的key为“list”,map的key为“map”
collection:参数在封装成的map中的key值
open:表示字符串以什么开始
close:表示字符串以什么结束
item:给集合中的每一个元素起的别名
separator:集合中元素的分隔符
第七题:Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
答案:
不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复.
第八题:当实体类中的属性名和表中的字段名不一样,如何实现对象的封装
答案:
方法一:通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
方法二:通过来映射字段名和实体类属性名的一一对应的关系
第九题:association标签的作用是什么?使用association标签常用的属性和作用是什么?
答案:
Association:处理单一的关联对象 处理单一属性的关联关系
property:注入给员工中哪个属性
select:发送哪一条sql语句
javaType:把sql语句查询出的结果集,封装给哪个类的对象(可以省略)
column:查询员工的结果集中,用哪个列的值作为条件去查询关联的对象
第十题:mybatis实现将关联对象赋值的方式有几种,分别是什么,请简要简述
答案:
两种.分别是关联查询和额外SQL查询.
关联查询是发送一个SQL语句将主对象和关联对象同时查询出来进行封装.
额外SQL查询是先执行一条SQL查询主对象,根据主对象结果集中的外键列的值,执行另外一条SQL查询关联对象,并且赋值给主对象.
第十一题:简述Spring创建对象的方式
答案:
1、构造器
2、静态工厂
3、实例化工厂
4、实现FactoryBean接口
第十二题:Spring/SpringMVC常用的注解及其作用(至少8个)
答案:
@Component,@Repository,@Service,@controller:由Spring管理类的对象的创建
@Autowired,@Resource:从容器中获取类的对象并给字段赋值
@RequestMapping:映射方法的访问路径
@ResponseBody:将方法返回的对象转换为JSON
@Scope:设置对象的作用域
@PostConstruct,@PreDestory:设置对象的生命周期
@Aspect:设置为切面类
@Transactional:添加事务控制
第十三题:谈谈对Spring的IoC/DI的理解
答案:Spring的IoC和DI是同一个概念不同角度的描述。IoC强调对象的创建的权利由Spring完成。DI强调对象的属性由Spring自动的注入值。
第十四题:@Autowired注解给字段注入值时从容器中获取对象的顺序
答案:首先按照字段的类型获取,如果没有类型,则会抛出异常.如果有一个匹配的类型就会直接注入;如果有多个匹配的类型,则再寻找名为为字段名的对象.如果能找到则直接注入,如果没有匹配的名字怎抛出异常
第十五题:Spring完成IoC功能的四个注解,以及各自的作用
答案:
四个注解为@Component,@Repository,@Service,@Controller
四个注解的功能完成一样.
区别为:不同的注解标注不同层的组件.
@Repository标注Dao层组件
@Service标注业务层组件
@Controller层标注控制层组件
@Component标注无法准确区分属于哪一层的组件
第十六题:静态代理和动态代理的区别
答案:
静态代理是在程序运行之前就已经存在了代理对象的字节码,目标对象和代理对象的关系是在程序运行之前就已经确定了.
动态代理是在程序运行之前没有代理对象的字节码,字节码是在程序运行期间有JVM动态的生成.代理对象和被代理对象的关系是在程序运行时才确定了的.
第十七题:BeanFactory和ApplicationContext的异同
答案:
两者都为Spring的容器对象.都可以管理Spring的容器.
不同点是,ApplicationContext是BeanFactory的子接口.ApplicationContext除了实现了BeanFactory接口之外还实现了消息机制,国际化等其他接口.因此ApplicationContext的功能更强.
两个容器在创建对象的时机是不同的.BeanFactory是在从容器中获取对象时才会创建对象.而ApplicationContext是在实例化容器对象时就会实例化容器中管理的对象.
第十八题:在类com.text.oa.permissionPermissionCheck类中存在检查权限的check()方法,现在要为com.text.oa.service.DepartmentService中的所有方法,在方法开始时,添加权限检查的功能,写出aop的xml配置代码
答案:
<bean id="pc" class=com.text.oa.permissionPermissionCheck""></bean>
<aop:config ref="pc">
<aop:pointcut id="pointcut" expression="execution( *com.text.oa.service.DepartmentService.*(..))">
<aop:before method="check" pointcut-ref="pointcut"/>
</aop:config>
第十九题:Spring的AOP中五不同时机的增强分别是什么,并简要解释
答案:
before:前置增强,在方法开始时执行的操作
after-returning:后置增强,在方法正常返回时执行的操作
after-throwing:异常增强,在方法发生异常时执行的操作
after:最终增强,在方法结束之后执行的操作,无论方法是否正常结束都会执行
around:环绕增强,可以自定义的增强方式
第二十题:Spring两种声明式事务管理的优点
答案:
xml方式:优点是,在xml配置文件中统一配置,可以通过一段配置给所有需要加事务的业务方法同时添加事务,统一管理,易于维护.缺点是:配置文件过程繁琐,配置文件臃肿.
注解方式:优点是,配置简单,只需要在业务类标注注解就可以添加事务.缺点是,需要为所有需要添加事务的类标注注解,配置分散,不利于维护.
第二十一题:SpringMVC中,forward和redirect字符串的作用
答案:
两个字符串的共同功能是使视图解析器的前缀和后缀不再生效.forward的作用是以请求转发的方式跳转到视图页面,redirect是以重定向的方式跳转到视图页面
第二十二题:SpringMVC的执行流程
答案:
(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。
第二十三题:配置SpringMVC的请求编码过滤器(org.springframework.web.filter.CharacterEncodingFilter)
答案:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
第二十四题:对用户(user)表进行分页分析,每页显示十条数据时,查询出第5页数据的SQL语句是什么?
答案:
select * from user limit 40,10
第二十五题:使用SpringMVC框架响应一个JSON对象的开发步骤(前端控制器,Controller控制器已经配置完成)
答案:
1.导入jackson的依赖
2.创建返回对象的方法,并标注@RequestMapping,指定方法的访问路径
3.方法上标注@ResponseBody注解.
第二十六题:HanderInterceptor接口定义了什么方法,实现该接口的类中的方法,分别在什么时机执行
答案:
preHandle :执行 Handler方法之前执行
postHandle:执行Handler方法之后,视图渲染之前执行
afterCompletion:返回ModelAndView,进行视图渲染之后.
第二十七题:在UserMapper的接口中存在List queryAll()的方法,如何使用PageHelper的插件的API对查询进行分页(写伪代码即可)
答案:
PageHelper.startPage(查询的页码,每个显示的数量);
List list = mapper.query();
PageInfo info = new PageInfo(list);
第二十八题:Spring和Mybatis整合时,配置SqlSessionFactoryBean时,有哪些属性值需要注入值(写出属性的含义或者属性名均可)
答案:
数据源(dataSource)
关联mybatis的配置文件(configLocation)
关联mapper映射文件(mapperLocations)
配置别名(typeAliasesPackage).
第二十九题:在配置SpringMVC的前端控制器时,”/”和”/* ”有什么区别,是否可以配置为”/* ”
答案:
“/* “会匹配.jsp文件,”/“不会匹配.jsp文件.不能配置为”/* “,因为配置为”/*”,则所有的jsp文件会被前端控制器拦截,但是前端控制器不能处理jsp文件.
第三十题:SpringMVC的方法返回String和ModelAndView时,如何跳转页面和向页面传递数据,请分别说明
答案:
返回字符String时,返回的字符串就就直接是对应的视图的名字,可以使用方法的形参中的Model对象的addAttribute方法传递数据.
返回ModelAndView对象时,使用对象的addObject方法传递数据,使用对象的setViewName方法设置视图的名称.
第三十一题:ResultMap和ResultType的区别
答案:
两者都是表示查询结果集与java对象之间的一种关系,处理查询结果集映射到java对象。
ResultMap:表示将查询结果集中的列一一映射到bean对象的各个属性。
ResultType:表示的是bean中的对象类,此时可以省略掉resultMap标签的映射,但是必须保证查询结果集中的属性 和 bean对象类中的属性是一一对应的,此时大小写不敏感,但是有限制。