- Mybatis 是一个可以自定义 SQL 、存储过程和高级映射的持久层框架。
- 内部封装了 JDBC,开发的时候只需要关注 SQL 语句本身,性能高、效率高、灵活性高
| 接口的类路径 | sql 的 namespace |
|---|---|
| 方法名(不能重载) | sql 的 id(唯一) |
| 输入参数类型 | sql 的 parameterType |
| 输出参数类型 | sql 的 resultType |
- Mapper接口的工作原理是JDK的动态代理,Mybatis 运行时会使用 JDK动态代理为 Mapper 接口生成代理对象 proxy,代理对象会拦截接口方法,从而执行所代表的sql,然后将sql的执行结果返回。
- 使用 resultMap 标签,定义数据库列名和对象属性之间的映射关系
- 使用 sql 列的别名功能,将列的别名书写为对象属性名
- 有了列名与属性名的映射关系后,MyBatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回
- MyBatis 的缓存分为一级缓存、二级缓存,一级缓存存放在 session 中,默认就有
- 二级缓存存放在命名空间中,默认是不打开的,使用二级缓存属性类需要实现 serializable 接口,可以在映射文件中配置 cache 标签开启
| 执行原理 | 根据表达式的值完成逻辑判断并动态拼接 SQL |
|---|---|
| if | 使用if标签,让我们可以有选择的加入 SQL 语句的片段 |
| where | where标签会自动去掉标签体内前面多余的 and / or |
| set | 使用set标签动态管理更新(set) 子句,并且动态去掉两端多余的逗号 |
| trim | 使用trim标签控制条件部分两端是否包含某些字符 |
| choose/when/otherwise | 在多个分支条件中,仅执行一个,类似于 java 的 if,else |
| foreach | 迭代,批量更新 |
| #{} | ${} |
|---|---|
| 预编译处理 | 字符串替换 |
| Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值 | Mybatis在处理 $ {}时,就是把${}替换成变量的值 |
| 可以有效的防止SQL注入,安全 | 有 SQL 注入的风险,不安全 |
| 概念 | IOC 即控制反转,将创建对象和对象间的依赖关系放入 IOC 容器中交给 Spring 管理 |
|---|---|
| 作用 | 管理对象的创建(生命周期)、维护对象间的依赖关系、解耦 |
| 原理 | IOC 的实现原理就是工厂模式加反射机制 |
| 概念 | AOP 也就是面向切面编程,是面向对象的一种补充,在不修改源代码的基础上对业务功能进行增强 |
|---|---|
| 作用 | 减少系统的重复代码、降低系统的耦合度、提高了系统的可维护性、常用于事务、日志处理等 |
| 原理 | 基于动态代理( JDK 的动态代理、Cglib动态代理) |
| 工厂模式 | Spring 通过 BeanFactory 或者 ApplicationContext 创建 Bean 对象的时候用到了工厂模式 |
|---|---|
| 单例模式 | Spring 中 bean 的作用域默认为是单例模式的(singleton) |
| 代理模式 | Spring AOP 基于动态代理,如果要代理的对象实现了某个接口,SpringAOP 会使用 JDK 的动态代理创建代理对象;如果对象没有实现接口,Spring AOP会使用 CGLib 生成一个被代理对象的子类作为代理对象 |
| 模板方法模式 | Spring 中的 jdbcTemplate 等以 Template 结尾的对数据库操作的类就使用了模板方法模式 |
| 适配器模式 | SpringAOP 的增强(Advice)使用了适配器模式、SpringMVC的 HandlerAdapter 也是适配器模式 |
| 观察者模式 | 定义的对象有一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被自动更新,Spring事件驱动模型就是观察者模式一个很经典的应用 |
| beanFactory | applicationContext |
|---|---|
| beanFactory 是 Spring 里面最顶层的接口 | applicationContext 继承BeanFactory 接口 |
| beanFactory 是最底层的实现,是面向框架本身的 | applicationContext 应用上下文,有更多高级的用法,是面向开发者的 |
| beanfactory 在容器启动的时候不会去实例化 bean,而是在获取 bean 的时候才实例化 | applicationContext 在启动的时候就把所有的 bean 全部实例化了 |
- 调用构造器或者工厂模式创建 Bean 对象
- 给 Bean 对象的属性注入值(依赖注入)
- 调用初始方法,进行初始化
- 使用 Bean 对象
- IOC 容器关闭时,销毁 Bean 对象
| Singleton(单例模式) | Spring 容器中只会存在一个共享的 Bean 实例,无论有多少个 Bean 引用它,始终指向同一对象,线程不安全 |
|---|---|
| Prototype(原型模式) | 每次通过 Spring 容器获取 prototype 定义的 Bean 时,容器都将创建一个新的 Bean 实例 |
| Request | 在一次 Http 请求中,Spring 容器会返回该 Bean 的同一实例 |
| Session | 在一次 Http Session 中,Spring 容器会返回该 Bean 的同一实例 |
| global Session | 在一个全局的 Http Session 中,Spring 容器会返回该 Bean 的同一个实例 |
| 属性注入 | 有选择的通过Setter方法完成调用类所需依赖的注入,更加灵活方便 |
|---|---|
| 构造器注入 | 通过调用类的构造器,将接口实现类通过构造函数变量传入 |
| 接口注入 | 将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供的注入方法(必须先声明一个借接口) |
- 使用Spring的IOC容器,将对象之间的依赖关系交由 Spring 管理,降低了组件之间的耦合性
- 使用 AOP 技术,可以利用它可以实现一些拦截,如权限拦截
- 对主流的框架提供了很好的支持,如 MyBatis
-
Spring MVC 是一个基于 Java 的实现了 MVC设计思想的轻量级 Web 框架
-
MVC 的设计思想,就是复杂的 web 应用分成 Model,View,Controller 三层,有利于前后端分离、简化开发、方便开发人员之间的配合
- 与Spring框架无缝集成,如AOP、IOC容器等
- 全方位覆盖表述层各个领域需要解决的问题,提供全面解决方案
- 支持各种请求资源的映射策略
- 支持各种视图技术,比如Thymeleaf,而不仅仅局限于JSP
- 代码清新简洁,性能卓著,大幅度提升开发效率
- restful 风格是一种软件互联架构风格、设计风格、而不是标准,只是提供了一组设计原则和约束条件。
- 主要用于客户端和服务端交互类的软件,基于这个风格设计的软件可以更简洁更有层次更易于实现缓存等机制
- 可以将异常抛给 Spring 框架来处理
- 也可以配置简单的异常处理器,同时添加异常视图页面
| 作用 | 该注解的作用是用来完成请求与请求处理方法的映射 |
|---|---|
| 位置 | 该注解可以标注在类上或者是方法上 |
| value 属性 | 用于指定映射的请求 URL,默认属性,唯一时可省略 |
| method 属性 | 指定映射的请求方式 |
| params 属性 | 指定映射的请求参数 |
| headers 属性 | 指定映射的请求头信息 |
- 负责处理由 DispatcherServlet 分发的请求,把用户请求的数据经过业务层处理之后封装成一个模型 Model ,然后再把该 Model 返回给对应的视图进行展示
| 过滤器 | 拦截器 |
|---|---|
| 过滤器基于函数回调 | 拦截器基于反射机制 |
| 过滤器基于Servlet容器 | 拦截器基于 SpringMVC 这样的表述层框架 |
| 过滤器可以对所有请求生效 | 拦截器只能在框架内部生效 |
| 过滤器不能直接访问框架内的资源对象 | 拦截器可以访问框架内的资源对象(例如Spring IOC容器中的对象) |
| 前端控制器 DispatcherServlet | 接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度 |
|---|---|
| 处理器映射器 HandlerMapping | 根据请求的 URL 来查找 Handler 方法 |
| 处理器适配器 HandlerAdapter | 负责执行 Handler 方法 |
| 后端控制器(处理器) Handler | 需要程序员开发 |
| 视图解析器 ViewResolver | 进行视图的解析,根据视图逻辑名将ModelAndView解析成真正的视图 |
| 视图 View | View是一个接口, 它的实现类支持不同的视图类型 |
(1)用户发送请求至前端控制器 DispatcherServlet
(2) DispatcherServlet 收到请求后,调用 HandlerMapping 处理器映射器,请求获取Handle方法
(3)处理器映射器根据请求 url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet
(4)DispatcherServlet 调用 HandlerAdapter 处理器适配器
(5)HandlerAdapter 经过适配调用具体处理器(Handler,也叫后端控制器)
(6)Handler执行完成返回 ModelAndView
(7)HandlerAdapter 将 ModelAndView 返回给 DispatcherServlet
(8)DispatcherServlet 将 ModelAndView 传给ViewResolver 视图解析器进行解析
(9)ViewResolver 解析后返回具体的视图 View
(10)DispatcherServlet 对视图 View 进行渲染视图(将模型数据填充至视图中)
(11)最后 DispatcherServlet 响应给用户



