SM那些事

想啥呢?这里的SM当然是SpringMVC和MyBatis了。

不是ssm吗?Spring知识点挺多的,我就单独拎出来了。请看Spring详解

一. SpringMVC

Spring,Spring MVC和Spring Boot有什么区别?

  • Spring: Spring详解
  • Spring MVC:是Spring 对web框架的一套解决方案。提供了一套总的前端控制器Servlet,接收请求,然后定义一套路由策略,将结果通过视图解析器展示给前端
  • Spring Boot:是Spring 提供的一套快速开发Spring+SpringMVC应用的方案。 自动装配,开箱即用

SpringMVC的工作流程?

说明:handler就是具体逻辑的类/方法。 如果标注为@servlet就是一个类;标注为@requestMapper就是一个方法。


Spring MVC的主要组件?    9大组件(前两个最重要)

  1. HandlerMapping (映射器):相当于一个map,内部维护一个<url,handler>的映射,通过前端传来的url找到对应的handler。
  2. HandlerAdapter (适配器):对于前端传过来的http请求,有三种handler进行处理:
    • 实现Controller,重写里面的方法;@servlet;@requestMapper:根据不同的handler,适配器用不同的方法执行里面的逻辑
  3. HandlerExceptionResolver:全局异常处理器
  4. ViewResolver:视图解析器,将model中的数据转发到一个视图(view)中
  5. RequestToViewNameTranslator:对于一些handler,如果是void类型的,就要从request中获取跳转的view
  6. LocaleResolver:ViewResolver解析的时候,可以用到的国际化的资源或者主题
  7. ThemeResolver:解析主题,存放一些css样式,图片等,展示不同的分格
  8. MultipartResolver:处理文件上传的请求
  9. FlashMapManager:用来管理FlashMap的,FlashMap主要用在redirect中传递参数
 二. MyBatis

mybatis的优缺点?

  • 优点:
    • sql和代码分离,sql写在xml中,可复用
    • 与JDBC相比,减少了大量的代码量,数据库的链接和关闭都不需要管
    • 底层使用JDBC,所以和好多数据库兼容
    • 提供ORM (对象关系映射)的便签
    • 与Spring 很好的集成
  • 缺点:
    • sql编写的工作量大,需要开发人员有深厚的sql功底。
    • sql语句依赖于数据库,数据库移植性较差。(比如一些oracle中的函数,换成mysql就不能用了)

MySQL和hibernate的对比?   sql 和 ORM 的争论,永远都不会终止

  • mysql是半自动的ORM框架,需要自己写sql语句;hibernate是全自动的ORM框架,不用自己写sql
    • 开发速度的对比:MySQL的学习速度要比hibernate快。
    • 业务:主要看业务,如果业务中都是简单的增删改查,用hibernate; 如果大量的使用多表关联,mybatis定制化就高,用mybatis比较好
    • sql优化:mysql是定制化的sql,所以可以自己进行优化。

#{}和${}的区别?      它俩都可以输出变量的值

  • #{}:占位符,就是prepared statement,可以防止sql注入问题 (在预处理的时候先占着位置)
  • ${}:拼接符,就是statement,有sql注入问题 (预处理的时候就把sql补充完整) 

虽然#{}要比${}安全,但是还是没有剔除${}。因为${}还有独特的作用。

  • 比如:Mybaties排序时使用order by动态参数时需要注意,使用${}而不用#{}。 因为占位符是用' '进行占位,order by 'abc' 是不正确的sql语句,必须写成order by abc。

这样也会有sql注入问题,怎么解决?

  • 你得手动处理过滤一下输入的内容:
    • 如判断一下输入的参数的长度是否正常(注入语句一般很长)
    • 更精确的过滤则可以查询一下输入的参数是否在预期的参数集合中。

简述mybatis的插件运行原理?    拦截器+AOP实现插件

  • 就像我们常用的分页插件等,它其实是在mybatis拦截器中做了一些事。
    •  mybatis的拦截器只针对于四种接口:(也就是说在这四种情况下,可以插入拦截器)
      • ParameterHandler:在给sql注入参数的时候(#{xxx})
      • ResultSetHandler:结果集返回的时候
      • StatementHandler:执行一个sql的时候
      • Executor:执行器执行的时候
    • mybatis使用JDK的动态代理,为拦截的接口生成一个代理类对象,每次执行这四个接口的时候,就会进入代理对象中,进入拦截器中。执行插件的具体业务。

如何编写一个插件?

  • 实现mybatis的interceptor接口并重写intercept()方法,然后给插件编写注解,指定拦截哪种接口的哪种方法

 

寄语:只有创造,才是真正的享受,只有拼搏,才是充实的生活。

posted @ 2021-12-01 14:54  小猴子_X  阅读(322)  评论(0编辑  收藏  举报