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大组件(前两个最重要)
- HandlerMapping (映射器):相当于一个map,内部维护一个<url,handler>的映射,通过前端传来的url找到对应的handler。
- HandlerAdapter (适配器):对于前端传过来的http请求,有三种handler进行处理:
- 实现Controller,重写里面的方法;@servlet;@requestMapper:根据不同的handler,适配器用不同的方法执行里面的逻辑。
- HandlerExceptionResolver:全局异常处理器
- ViewResolver:视图解析器,将model中的数据转发到一个视图(view)中
- RequestToViewNameTranslator:对于一些handler,如果是void类型的,就要从request中获取跳转的view
- LocaleResolver:ViewResolver解析的时候,可以用到的国际化的资源或者主题
- ThemeResolver:解析主题,存放一些css样式,图片等,展示不同的分格
- MultipartResolver:处理文件上传的请求
- 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的拦截器只针对于四种接口:(也就是说在这四种情况下,可以插入拦截器)
如何编写一个插件?
- 实现mybatis的interceptor接口并重写intercept()方法,然后给插件编写注解,指定拦截哪种接口的哪种方法
寄语:只有创造,才是真正的享受,只有拼搏,才是充实的生活。