1.什么是MyBatis?
MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis摒除了大部分的JDBC代码、手工设置参数和结果集重获。
MyBatis只使用简单的XML和注解来配置和映射基本数据类型、Map接口和POJO到数据库记录。
2.MyBatis的优缺点?【了解】
优点:
1. 与JDBC相比,减少了50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接。
2. 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,
便于统一管理。
4. 提供 XML 标签,支持编写动态 SQL 语句,并可重用。(XML中使用if, else)。
5. 提供映射标签,支持对象与数据库的ORM字段关系映射(在XML中配置映射关系,也可以使用注解)。
5.很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要 JDBC 支持的数据库 MyBatis 都支持)。
缺点:
6. SQL语句的编写工作量较大,尤其是字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
7. SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
3.什么是ORM?
Object-Relational Mapping(对象关系映射),它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,
这样开发人员就可以把对数据库的操作转化为对这些对象的操作。因此它的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。
4.MyBatis与Hibernate有哪些不同?【了解】
1、Mybatis是半ORM组件,需要编写大量SQL语句。Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,
适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。
但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。
2、Hibernate是完全的ORM组件,可以完全不用写一行SQL语句。 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,
如果用Hibernate开发可以节省很多代码,提高效率。
5.#{}和${}的区别是什么?(必问)
#{}:预编译的、能防止SQL注入、PreparedStatement对象来执行SQL语句
${}:字符串替换,没有预编译、不能防止SQL注入、Statement对象来执行SQL语句
6.MyBatis动态sql有什么用?执行原理?有哪些动态sql?
Mybatis动态sql可以在 Xml 映射文件内,以标签的形式编写动态 sql。
执行原理:解析了XML的动态标签并拼接成sql语句。
MyBatis提供了9种动态sql标签 :trim、where、set、foreach、if、choose、when、otherwise、bind
7.什么是MyBatis的一级、二级缓存?
mybatis一级缓存:
一级缓存是默认开启的,用来保存用户对数据库的操作和数据库返回的数据,结果会存入到SqlSession提供的一块区域中,该区域的结构是一个Map。
如果下一次用户再执行相同的SQL语句会从缓冲中获取数据,而不是去数据库查询数据。增删改能清空缓存。因为一级缓存是依赖于SqlSession对象的,
当SqlSession对象消失时,Mybatis的一级缓存也就消失了。
mybatis二级缓存:
Mybatis的二级缓存是默认关闭的,它指的是Mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的
SqlSession共享其二级缓存。二级缓存是Mapper级别的缓存。在关闭sqlsession后(close),才会把该sqlsession一级缓存中的
数据添加到namespace的二级缓存中。使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),
可在它的映射文件中配置。
8.MyBatis分页插件是什么?其实现原理是什么?
MySql分页SQL语句:limit---> select * from student limit m n(从m开始拉取n条)
Oracle分页:rownum---> select * from (select *,rownum from student s)
分页插件是:PageHelper。
原理是:分页插件的原理就是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的SQL,
然后根据设置的dialect(方言)和设置的分页参数,重写SQL,生成带有分页语句的 SQL,执行重写后的SQL,从而实现分页。
所以原理还是基于拦截器。
9.什么是IOC?(必问)
IoC 即控制反转(Inversion of Control),对象不再由程序员new、而是交给容器来管理。
IOC原理:配制文件(XML) + 反射
10.什么是AOP? (必问)
面向切面编程(Aspect Oriented Programming),对方法功能的扩展通过动态的植入功能而不是直接修改源代码,AOP的设计用的是动态代理模式。
11.AOP通知类型有哪些?
1.前置通知@Before
作用:设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行
@Before("pt()")
public void before() {
System.out.println("before advice ...");
}
2.后置通知@After
作用:设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法后运行
@After("pt()")
public void after() {
System.out.println("after advice ...");
}
3.返回后通知@AfterReturning(了解)
作用:设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法正常执行完毕后运行
@AfterReturning("pt()")
public void afterReturning() {
System.out.println("afterReturning advice ...");
}
4.抛出异常后通知@AfterThrowing(了解)
作用:设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法运行抛出异常后执行
@AfterThrowing("pt()")
public void afterThrowing() {
System.out.println("afterThrowing advice ...");
}
2.5 环绕通知@Around(重点,常用)
作用:设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前后运行
@Around("pt()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("around before advice ...");
Object ret = pjp.proceed();
System.out.println("around after advice ...");
return ret;
}
12.Spring常用注解有哪些?(必问)
1. @Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注
2. @Service 在业务逻辑层使用(service 层)
3. @Repository 在数据访问层使用(dao 层)
4. @Controller 在展现层使用,控制器的声明(controller 层)
@Component、@Service、@Repository:这三个注解没有任何区别,@Controller:和前面三个差不多,一般用在控制器
5. @Autowired:按类型自动注入
6. @Resource :根据对象名称注入
7. @Configuration 声明当前类为配置类,相当于 xml 形式的 Spring 配置(类上)
8. @Bean 注解在方法上,声明当前方法的返回值为一个bean,替代 xml 中的方式(方法上)
9. @ComponentScan 用于对Component进行扫描,相当于xml中的(类上)
10. @WishlyConfiguration 为@Configuration 与@ComponentScan 的组合注解,可以替代这两个注解
11. @After 在方法执行之后执行(方法上)
12. @Before 在方法执行之前执行(方法上)
13. @Around 在方法执行之前与之后执行(方法上)
13.SpringMVC工作流程|原理 (必问)

用户的请求交给DispatcherServlet处理,DispatcherServlet控制器根据URL地址来分配到执行的Controller,Controller处理完毕数据后,
返回给DispatcherServlet处理器,然后交给视图渲染。
1.用户发送请求至前端控制器 DispatcherServlet;
2.DispatcherServlet 收到请求后,调用 HandlerMapping 处理器映射器,请求获取Handler;
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响应用户。
14.SpringMVC常用注解有哪些?
1.@RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。
GetMapping | PostMapping | PutMapping | DeleteMapping
2.@RequestParam:参数绑定注解
3.@ResponseBody|@RequestBody:将对象序列化为JSON| 将JSON数据反序列化为对象
4.@PathVariable:可以将 URL 中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)
5.@SessionAttributes:即将值放到session作用域中,此注解可声明在类、接口、注解或枚举类上。
6.@CookieValue:可以把Request header中关于cookie的值绑定到方法的参数上
7. @RequestHeader:可以把 Request 请求 header 部分的值绑定到方法的参数上
15.Spring依赖注入方式有哪些?
1.属性注入
@Service
public class UserService {
@Autowired
private Wolf1Bean wolf1Bean;
}
2.setter方法注入
@Service
public class UserService {
private Wolf3Bean wolf3Bean;
@Autowired
public void setWolf3Bean(Wolf3Bean wolf3Bean) {
this.wolf3Bean = wolf3Bean;
}
}
3.构造器注入
@Service
public class UserService {
private Wolf2Bean wolf2Bean;
@Autowired
public UserService(Wolf2Bean wolf2Bean) {
this.wolf2Bean = wolf2Bean;
}
}
16.Spring Boot特点有哪些?
Spring Boot的特点:
(1)快速搭建 Spring 应用的框架
(2)内嵌 Tomcat 和 Jetty 容器,不需要单独安装容器,jar 包直接发布一个 Web 应用
(3)简化 Maven 配置,继承父工程这种方式,一站式引入需要的各种依赖
(4)基于注解的零配置思想
(5)和各种流行框架 Spring MVC、Mybatis、Spring Cloud 无缝整合
17.Spring Boot常用注解有哪些?
1. @SpringBootApplication:这个注解是 Spring Boot 最核心的注解,用在 Spring Boot 的主类上,标识这是一个 Spring Boot 应用,
用来开启 Spring Boot 的各项能力。相关等同于@Configuration,@EnableAutoConfiguration 和 @ComponentScan 三个注解同时使用。
2. @EnableAutoConfiguration:Spring Boot 自动配置开启注解。
3. @ConditionalOnXXXX:Spring Boot 基于@Conditional 扩展出的衍生注解,根据是否满足某一个特定条件来决定是否加载指定的 Bean。
比如扩展出的注解有:@ConditionalOnBean、@ConditionalOnClass 等。
5. @ConfigurationProperties:基于类型安全的属性配置注入,可以将 properties 属性和一个 Bean 及其属性关联,从而实现类型安全配置。
18.AOP有哪些使用场景?
1.权限管理
情景1:控制用户的功能权限
3.记录日志
情景1:按产品的需求,有的接口需要记录操作日志
1.自定义注解,需要记录操作日志的,则在Controller的方法上加此注解
2.AOP中判断,如果有这个自定义注解,则将参数异步写到日志数据库
5.事务控制(调用方法前开启事务, 调用方法后提交关闭事务 )
情景1:使用Spring的@Transactional
19.拦截器和过滤器的区别?
1.拦截器是基于java的反射机制的,而过滤器是基于函数回调。
2.过滤器过滤servlet,拦截器拦截的Controller。