06 SSM框架
1. 什么是 MyBatis?
JDBC是什么:Java访问数据库技术
1、MyBatis 是一个半自动 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 SQL,可以严格控制 SQL 执行性能,灵活度高。
2、MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
3、通过 xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过 Java 对象和 statement 中 SQL 的动态参数进行映射生成最终执行的 SQL 语句,最后由 MyBatis 框架执行 SQL 并将结果映射为 Java 对象并返回。(从执行 SQL 到返回 result 的过程)。
为什么是个半自动的ORM、而不是全自动的:“增删改不需要程序员编写SQL,但是查询还需要程序员编写SQL"
2. MyBatis 的优缺点?
优点:
1、基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 SQL 与程序代码的耦合,便于统一管理;提供 XML 标签,支持编写动态 SQL 语句,并可重用。
2、与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;
3、很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要 JDBC 支持的数据库 MyBatis 都支持)。
4、能够与 Spring 很好的集成;
5、提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
缺点:
1、SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有一定要求。
2、SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
MySql怎么分页?:limit---->select * from table limit 3,3(必问)
pageHelper(mysql插件、拦截sql语句后、给sql语句添加分页sql脚本)----根据不同的数据库添加不同的分页语句、
延申出来两个问题:1、jdbc访问数据库的步骤、2:分页的sql语句怎么写
Oracle分页语句:rownum---->select * from (select s.*,rownum from table s)(必问)
3. 什么是 ORM?
ORM 的全称是 Object Relational Mapping,即对象关系映射。它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。因此它的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。
3、mybatis的mapper如何生成的?
动态代理生成得mapper
3.JDBC访问数据库得步骤是什么
1.加载(注册)数据库驱动(到JVM)
2、建立(获取)数据库连接。
3.创建(获取)数据库操作对象。
4、定义操作的SQL语句。
5、执行数据库操作。
6、获取并操作结果集。
7、关闭对象,回收数据库资源(关闭结果集–>关闭数据库操作对象–>关闭连接)
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 的一级、二级缓存?(必问)
一级缓存默认打开:SqlSession级别、相同的SQL语句会从缓冲中获取数据、而不是去数据库查询数据、增删改能清空缓存。
二级缓存与一级缓存其机制相同,Mapper级别的缓存、默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态), 可在它的映射文件中配置 ;
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存 Namespaces) 的进行 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。
8. MyBatis 分页插件是什么?其实现原理是什么?
MySql分页SQL语句: limit—> select * from student limit 20 10
oracle分页:rownum—> select * from (select *,rownum from student s)
分页插件是:PageHelper。把查询SQL语句进行拦截、然后根据对应的数据库、生成对象的分页SQL语句
原理是:分页插件的原理就是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的 SQL,然后根据设置的 dialect(方言),和设置的分页参数,重写 SQL ,生成带有分页语句的 SQL,执行重写后的 SQL,从而实现分页所以原理还是基于拦截器。
9、谈谈你对Spring框架的理解(必问)
Spring就是一个大管家、用来管理所有对象和组件
10. 什么是 IOC?(必问)
控制反转:对象不再由程序员new、而是交给容器来管理
IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在 Java 开发中,IOC 意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
11、Spring对象的作用域:
Singleton(单例)、Prototype(多例)、Request(请求一次创建一次)、Session(一次会话创建一次)
12. 什么 AOP?(必问)
AOP 是 OOP 的延续,是 Aspect Oriented Programming 的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
AOP 设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP 可以说也是这种目标的一种实现。我们现在做的一些非业务,如:日志、事务、安全等都会写在业务代码中(也即是说,这些非业务类横切于业务类),但这些代码往往是重复,复制——粘贴式的代码会给程序的维护带来不便,AOP 就实现了把这些业务需求与系统需求分开来做。
13.AOP的实现原理
动态代理:调用的不再是目标类、而是动态生成的代理类
静态代理:王婆、西门庆、潘金莲----->
动态代理:王婆突然发现只代理潘金莲、利润太小、她想代理所有的XX、王婆此时就是一个超级代理人、动态代理
Java:有两种方式实现动态代理1、JDK自带的Proxy、2、CGlib工具类
JDK自带的动态代理类Proxy实现
spring5以后用的是cglib代理方式
14. AOP 通知增强有哪些?
-
前置增强(Before Advice)
-
后置增强(After Advice)
-
返回后增强(After Return Advice)
-
环绕增强(Around Advice)
-
异常增强(After Throwing Advice)
15.AOP 有哪些使用场景?
1. 场景一: 记录日志(异常增强)
2. 场景二: 监控方法运行时间 (监控性能)、环绕增强
3. 场景三: 权限控制------前置增强
4. 场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 )
5. 场景五: 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )-----异常增强
16. Spring 常用注解有哪些?(必问)
-
@Component 组件,没有明确的角色
-
@Service 在业务逻辑层使用(service 层)
-
@Repository 在数据访问层使用(dao 层)
-
@Controller 在展现层使用,控制器的声明(controller 层)
@Component、@Service、@Repository:这三个注解没有任何区别、@Controller:和前面三个差不多、一般用在控制器
-
@Autowired:属性注入
-
@Configuration 声明当前类为配置类,相当于 xml 形式的 Spring 配置(类上)
-
@Bean 注解在方法上,声明当前方法的返回值为一个 bean,替代 xml 中的方式(方法上)
-
@ComponentScan 用于对 Component 进行扫描,相当于 xml 中的(类上)
-
@WishlyConfiguration 为@Configuration 与@ComponentScan 的组合注解,可以替代这两个注解
-
@After 在方法执行之后执行(方法上)
-
@Before 在方法执行之前执行(方法上)
-
@Around 在方法执行之前与之后执行(方法上)
17.SpringMVC工作流程(必问)
用户的请求交给DispatcherServlet处理、DispatcherServlet控制器根据URL地址来分配到执行的Controller、
Controller处理完毕数据后、返回给DispatcherServlet处理器、然后交给视图渲染
(1)用户发送请求至前端控制器 DispatcherServlet;
(2)DispatcherServlet 收到请求后,调用 HandlerMapping 处理器映射器, 请求获取 Handle;
(3)处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter 处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler(Controller,也叫后端控制器);
(6)Handler(Controller) 执行完成返回 ModelAndView;
(7)HandlerAdapter 将 Handler 执行结果 ModelAndView 返回给
DispatcherServlet;
(8)DispatcherServlet 将 ModelAndView 传给 ViewResolver 视图解析器进行解析;
(9)ViewResolver 解析后返回具体 View;
(10)DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet 响应用户。
简化理解版
浏览器请求服务器、请求被核心处理器(DispatcherServlet)拦截
核心处理器解析(HandlerMapping )请求、找到对应的处理器(Controller),处理器(Controller)处理完后、返回给核心处理器(DispatcherServlet),核心处理器把返回的数据给视图解析器(ViewResolver ),视图解析器渲染后返回给浏览器。
18. SpringMVC 常用注解有哪些?
- @RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。
- @RequestParam:参数绑定注解。
- @ResponseBody:不进行视图跳转,直接进行数据响应。
- @PathVariable:可以将 URL 中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)。
- @SessionAttributes:即将值放到 session 作用域中,此注解可声明在类、接口、注解或枚举类上。
- @CookieValue:可以把 Request header 中关于 cookie 的值绑定到方法的参数上。
- @RequestHeader:可以把 Request 请求 header 部分的值绑定到方法的参数上。
19.Spring 依赖注入方式有那些?
- 通过构造器注入
- 通过 setter 注入
- 通过 filed 注入
20.Spring Boot 特点有哪些?(必问)
-
快速开发 Spring 应用的框架的工具、减少开发和测试时间
-
使用 JavaConfig 有助于避免使用 XML、避免大量的 Maven 导入和各种版本冲突
-
内嵌 Tomcat 和 Jetty 容器,不需要单独安装容器,jar 包直接发布一个 Web 应用
-
简化 Maven 配置,继承父工程这种方式,一站式引入需要的各种依赖
-
基于注解的零配置思想
-
和各种流行框架 Spring MVC、Mybatis、Spring Cloud 无缝整合
21.Spring Boot 常用注解有哪些?
-
@SpringBootApplication:这个注解是 Spring Boot 最核心的注解,用在 Spring Boot 的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。相关等同于@Configuration,@EnableAutoConfiguration 和@ComponentScan 三个注解同时使用。
-
@EnableAutoConfiguration:Spring Boot 自动配置开启注解。
-
@ConditionalOnXXXX:Spring Boot 基于@Conditional 扩展出的衍生注解,根据是否满足某一个特定条件来决定是否加载指定的 Bean。比如扩展出的注解有:@ConditionalOnBean、@ConditionalOnClass 等。
-
@ConfigurationProperties:基于类型安全的属性配置注入,可以将 properties 属性和一个 Bean 及其属性关联,从而实现类型安全配置。
Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
###22.SpringBoot配置文件加载的顺序
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
先加载的会被后加载的覆盖掉,所以**.properties和.yml同时存在时,.properties会失效,.yml**会起作用。
23.拦截器和过滤器的区别?
过滤器:过滤Servlet
拦截器:拦截的Controller
.properties -> bootstrap.yml -> application.properties -> application.yml**
先加载的会被后加载的覆盖掉,所以**.properties和.yml同时存在时,.properties会失效,.yml**会起作用。
23.拦截器和过滤器的区别?
过滤器:过滤Servlet
拦截器:拦截的Controller