前言:暂时不准备填充太多内容,仅给个标题梳理脉络
Spring框架相关
- SpringMVC
- Spring MVC的理解
- Spring MVC的优点
- Spring MVC的工作原理或流程
- Spring MVC的控制器是不是单例模式?如果是,有什么问题?怎么解决?
- SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代?
- 怎么样在方法里面得到Request或者Session?
- 在拦截的方法里面得到从前台传入的参数,怎么得到?
- 如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?
- SpringMvc中函数的返回值是什么?
- SpringMVC怎么样设定重定向和转发?
- SpringMvc用什么对象从后台向前台传递数据的?
- 怎么样把ModelMap里面的数据放入Session里面?
- SpringMvc怎么和AJAX相互调用的?
- SpringMvc里面拦截器是怎么写的?
- Spring
- Mybatis
- Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
- #{}和ͅ{}的区别是什么?
- 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
- Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
- MyBatis与Hibernate有哪些不同?
- MyBatis的好处是什么?
- 简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?
- 什么是MyBatis的接口绑定,有什么好处?
- 接口绑定有几种实现方式,分别是怎么实现的?
- 什么情况下用注解绑定?什么情况下用xml绑定?
- MyBatis实现一对一有几种方式?具体怎么操作的?
- Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
- Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
- 模糊查询like语句该怎么写?
- 通常一个Xml映射文件,都会写一个Dao接口与之对应, Dao的工作原理,是否可以重载?
- Mybatis中如何执行批处理?
- Mybatis都有哪些Executor执行器?它们之间的区别是什么?
- 如何获取自动生成的(主)键值?
- 在mapper中如何传递多个参数?
- resultType resultMap的区别?
- 使用MyBatis的mapper接口调用时有哪些要求?
SpringMVC
Spring MVC的理解
M V C
Spring MVC的优点
基于组件,前端控制器各种角色分配等
任意使用各种视图
易扩展、集成
支持各种请求资源的映射策略(不理解就看下列补充)
补充:SpringMVC3强大的请求映射规则详解
Spring MVC的工作原理或流程
一张各个角色的运行图
程序员主要工作:处理器Handler、视图View
Spring MVC的控制器是不是单例模式?如果是,有什么问题?怎么解决?
是
SpingMvc中的控制器的注解一般用那个,有没有别的注解可以替代?
@Controller
怎么样在方法里面得到Request或者Session?
直接在方法的形参中声明request,SpringMvc就自动把request对象传入
在拦截的方法里面得到从前台传入的参数,怎么得到?
直接在形参里面声明这个参数就可以,但必须名字和传过来的参数一样
或者形参前加@Param(“xxx”),xxx和上一层传过来的参数一样
如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎么样快速得到这个对象?
直接在方法中声明这个对象,SpringMvc就自动会把属性赋值到这个对象里面
注:可能转换失败
SpringMvc中函数的返回值是什么?
返回值可以有很多类型,有String, ModelAndView,当一般用String比较好
SpringMVC怎么样设定重定向和转发?
在返回值String前面加"forward:“就可以让结果转发,
譬如"forward:user.do?name=method4”
在返回值前面加"redirect:"就可以让返回值重定向,
譬如"redirect:http://www.baidu.com
SpringMvc用什么对象从后台向前台传递数据的?
除了使用ModelAndView方式外,这个返回值类型。
还可以使用Map,Model和ModelMap来向前台页面传值,都是在方法参数中,指定一个该类型的参数。
Map<String,Object>就是hashMap<>
//ModelAndView是一个类,这个类把视图和数据都合并的一起
public class ModelAndView extends Object
// Model 就是个接口,里面可以转化为Map
public interface Model {
Model addAttribute(String var1, @Nullable Object var2);
Model addAttribute(Object var1);
Model addAllAttributes(Collection<?> var1);
Model addAllAttributes(Map<String, ?> var1);
Model mergeAttributes(Map<String, ?> var1);
boolean containsAttribute(String var1);
Map<String, Object> asMap();
}
public class ModelMap extends java.util.LinkedHashMap<String, Object>
怎么样把ModelMap里面的数据放入Session里面?
Controller类里面有方法,方法体里面有Model,添加了键值对
在Controller类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key
@SessionAttributes("xxx")
// 分开写,示意能看懂就行
model.addAttribute("xxx", )
SpringMvc怎么和AJAX相互调用的?
通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象
在接受Ajax方法里面可以直接返回Object,List或Map等,但方法前面要加上@ResponseBody注解
注:
1、一般返回Map<String, Object>方便
2、自定义类,封装状态,如成功与否,成功返回的对象或对象列表,失败返回的错误码或错误信息也可以,但是注意都要转化为json,@ResponseBody注解实现转化功能
3、当一个方法向AJAX返回特殊对象,譬如Object,List等,需要做什么处理?要加上@ResponseBody注解
SpringMvc里面拦截器是怎么写的?
两种方法
1、实现HandlerInterceptor 接口
2、继承适配器类HandlerInterceptorAdapter
两者都是接着在接口方法preHandle当中,实现处理逻辑(判断后选择是否放行,true表示放行);然后在Spring MVC的配置文件中配置拦截器即可
补充:SpringMVC 通过实现HandlerInterceptor接口 实现拦截器功能
// HandlerInterceptor 接口
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
// HandlerInterceptorAdapter类,里面还是实现了HandlerInterceptor 接口
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
public HandlerInterceptorAdapter() {
}
// 只有这里返回boolean类型
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
//在业务处理器处理请求完成之后,生成视图之前执行 ,可以看到形参里面有modelAndView
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
// 在DispatcherServlet完全处理完请求之后被调用,可用于清理资源
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
}
}
Spring
这里面比较全:Spring面试题(2020最新版)
什么是Spring框架?Spring框架有哪些主要模块?
轻量级Java开发框架
解决了开发中基础性的问题(基础架构),简化Java开发,专注于应用程序
不必担心Spring是如何在后台进行工作的
主要模块:核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块
使用Spring框架能带来哪些好处?
方便解耦,简化开发:对象的创建和依赖关系的维护,交给spring容器
AOP
声明式事务
测试
集成
什么是控制反转(IOC)?什么是依赖注入?
背熟:
把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理
核心:对组件对象控制权的转移,从程序代码本身转移到了外部容器
责任:创建,管理(通过依赖注入(DI),装配,配置对象,并且管理对象的整个生命周期
注:
这里的工厂模式需要会写,
如水果Fruit接口,苹果Apple与橘子Orange类实现接口,
工厂类Factory里的静态方法getInstance(String xxx)根据全限定类名,调用反射Class.forName(xxx).newInstance()生成并返回一个实体类的接口引用。
Spring 的 IoC设计支持功能?
有依赖注入,依赖检查、自动装配等
核心:依赖注入,有哪几种注入方式?
理解:依赖注入让bean与bean之间以配置文件组织在一起,而不是以硬编码的方式耦合在一起。至于怎么组织在一起,就要靠逐层往下找依赖关系。
补充:这篇排版不好,但是解释很好什么是依赖注入
请解释下Spring框架中的IoC?
Spring中的 org.springframework.beans 包和 org.springframework.context包构成了Spring框
架IoC容器的基础
BeanFactory 是Spring IoC容器的具体实现,用来包装和管理前面提到的各种bean。
BeanFactory接口是Spring IoC 容器的核心接口。
ApplicationContext主要看几个实现类,如ClassPathXmlApplicationContext,AnnotationConϐigApplicationContext等
IOC:把对象的创建、初始化、销毁交给spring来管理,而不是由开发者控制,实现控制反
转。
BeanFactory 源码:基本都是根据字符串创建对象,也有根据类对象
package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String var1) throws BeansException;
<T> T getBean(String var1, Class<T> var2) throws BeansException;
Object getBean(String var1, Object... var2) throws BeansException;
<T> T getBean(Class<T> var1) throws BeansException;
<T> T getBean(Class<T> var1, Object... var2) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> var1);
<T> ObjectProvider<T> getBeanProvider(ResolvableType var1);
boolean containsBean(String var1);
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
String[] getAliases(String var1);
}
BeanFactory和ApplicationContext有什么区别?
BeanFactroy采用的是延迟加载形式来注入Bean的,不能发现一些存在的Spring的配置问题
ApplicationContext,它是在容器启动时,一次性创建了所有的Bean,容易发现Spring中存在的配置错误
ApplicationContext的优点就是缺点:
相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。
当应用程序配置Bean较多时,程序启动较慢。
Spring有几种配置方式?
xml、注解
如何用基于XML配置的方式配置Spring?
beans
bean
class
如何用基于Java配置的方式配置Spring?
@Configuration注解和@Bean注解
注:最好需要开启注解驱动
请解释Spring Bean的生命周期?
Spring Bean的作用域之间有什么区别?
Mybatis
Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
目的:在xml映射文件里,以标签形式,完成逻辑判断和动态拼接sql
9种动态sql标签:
if标签
where标签:配合if
set标签:更新时配合if
foreach标签:collection, item,index,open,separator,close(6个)
choose (when, otherwise)标签
trim标签:可以用来实现 where 和 set 的效果
bind标签:没用过
执行原理为:使用OGNL从sql参数对象中计算表达式的值,根据表达式的值,动态拼接
sql
注:
1、OGNL是Object Graphic Navigation Language(对象图导航语言)
2、choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。
当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql,
类似于sql server语句(case when then)
#{}和ͅ{}的区别是什么?
1)#{}是预编译处理,${}是字符串替换。
2)Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋
值;
3)Mybatis在处理 ${}替换成变量的值。
4)使用#{}可以有效的防止SQL注入,提高系统安全性
为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
手动编写SQL,灵活配置
Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
仅支持association关联对象和collection关联集合对象的延迟加载
原理:用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法
MyBatis与Hibernate有哪些不同?
门槛低,直接编写原生态sql,可严格控制sql执行性能,写的sql代码多,
但无法做到数据库无关性
MyBatis的好处是什么?
1、sql语句在xml中,从java程序中独立,维护便利
2、封装底层jdbc的api细节,并自动将结果转化为bean对象
3、直接编写SQL,更灵活,比全自动更高的查询效率,复杂查询
简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?
ParameterMap对象
ResultMap对象
MappedStatement对象
BoundSql对象
什么是MyBatis的接口绑定,有什么好处?
在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,我们直接调用接口方法就可以
接口绑定有几种实现方式,分别是怎么实现的?
注解绑定
xml绑定
什么情况下用注解绑定?什么情况下用xml绑定?
选择一种就行,按理简单用注解,复杂用xml,但初期就只选择一种
MyBatis实现一对一有几种方式?具体怎么操作的?
联合查询或嵌套子查询
联合查询只查询一次
嵌套查询一般查两次:(感觉这个是注解里复杂查询这么用)
嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置,(类似于又一个id,result)
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
关联对象查询,有两种实现方式。(一对一和一对多均有两种)
1、嵌套查询 的查询语句写起来简单,但是执行的sql语句多,性能要低一点,
2、嵌套结果 的查询语句写起来难一点,而且sql语句只执行一条,性能相对较高
Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。
第二种是使用 sql 列的别名功能,将列的别名书写为对象属性名。(就是将select语句的返回字段as一次)
有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
模糊查询like语句该怎么写?
第一种,在 Java 代码中添加 sql 通配符,sql语句中照常用 like #{ }
第二种,在 sql 语句中拼接通配符,会引起 sql 注入,不推荐
通常一个Xml映射文件,都会写一个Dao接口与之对应, Dao的工作原理,是否可以重载?
不能重载,因为通过Dao寻找Xml对应的sql的时候全限名+方法名的保存和寻找策略。接口
工作原理为jdk动态代理原理,运行时会为dao生成proxy,代理对象会拦截接口方法,去执
行对应的sql返回数据。
Mybatis中如何执行批处理?
BatchExecutor完成批处理
Mybatis都有哪些Executor执行器?它们之间的区别是什么?
Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
1)SimpleExecutor:
每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象
2)ReuseExecutor:
执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map
3)BatchExecutor:完成批处理
如何获取自动生成的(主)键值?
useGeneratedKeys=“true”
在mapper中如何传递多个参数?
1)直接在方法中传递参数,xml文件用#{0} #{1}来获取
2)使用 @param(“xxx”) 注解:这样可以直接在xml文件中通过#{xxx}来获取
resultType resultMap的区别?
resultType 数据库表中的字段名和实体类中的属性完全一致时
ResultMap更强大一点,ResultMap可以实现将查询结果映射为复杂类型的pojo
使用MyBatis的mapper接口调用时有哪些要求?
4)Mapper.xml文件中的namespace即是mapper接口的类路径,全限定类名
1)Mapper接口方法名和mapper.xml中定义的每个sql的id相同
2)Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型
相同
3)Mapper接口方法的返回参数类型和mapper.xml中定义的每个sql的resultType的类型相同