Model1和Model2
Model1的时代,应用几乎全部都是有JSP页面组成,view和controller混合在一起,代码重用性低,增加了系统的扩展和维护的难度。 Model2时代,servlet作为前端控制器,负责收发消息,jsp只负责显示逻辑。层次清晰,代码更具可维护性。
Spring MVC 的优势
- 灵活性、非入侵性、可配置性
- 提供了前端控制器DidpatchServlet,开发者无需额外开发控制器对象
- 分工明确,包括控制器、验证器、命令对象、模型对象、处理程序映射、视图解析器等,每个功能由专门的对象负责完成
- 可以自动绑定用户输入,并正确的转换数据类型
- 使用了key-value的Map对象实现更加灵活的模型数据传输
- 内置了常见的校验器,可以校验用户输入
- 支持国际化
- 支持多种视图技术,包括JSP
- 提供了简单而强大的标签库,支持数据绑定
SpringMVC常见注解
- @Controller 用来标记一个Spring MVC Controller 对象,即一个控制器类。
- @RequestMapping 用来映射一个请求,可标注在一个@Controller类或者该类的方法。
- @GetMapping 用来映射一个get请求
- @PostMapping 用来映射一个post请求
- @RequestRaram 用来标注一个形参,将请求的参数赋值给该形参
- @PathVariable 用来获取url中的动态参数
- @MatrixVariable 多个变量可以使用";"隔开,允许开发者进行多条件组合查询
- @CrossOrigin 用于在MVC中处理跨域请求
- @RequestHeader 获取请求头的信息比如User-Agent 等信息
- @CookieValue 用于将请求的cookie数据映射到注解的参数上
- @RequestAttribute 用于访问由请求处理方法、过滤器或拦截器创建的】预先处在于request作用域中的属性,将该属性转换到目标参数上
- @SessionAttribute 用于访问由请求处理方法、过滤器或拦截器创建的】预先处在于session作用域中的属性,将该属性转换到目标参数上
- @SessionAttributes 允许有选择性的制定Model中哪些属性转移到HttpSession对象中
- @ModelAttribute 用于将请求参数绑定到对象
- @RequestBody 用来处理Content-Type不是application/x-www-form-urlencoded编码的内容。
- @ResponseBody 用于将Controller的请求处理方法返回的对象,通过适当的HttpMessageconverter转换为制定格式后,写入到Response对象的body数据区,当返回数据不是HTML标签的页面,而是其他某种格式的数据时使用它。
- @RestController 组合注解,包含了@Controller和@ResponseBody
- @ResponseStatus 用于标注一个异常类
- @ExceptionHandle 标注一个方法
- @ControllerAdvice 控制器增强注解,?
- RestControllerAdvice 组合了@ControllerAdvice 和@RequestBody
拦截器
Spring MVC 中的Interceptor拦截器拦截请求是通过实现HandlerInterceptor接口来完成的。可实现接口的preHandl、postHandle、afterCompletion 方法。
Mybatis常用对象
- SqlSessionFactory 用于创建SqlSession对象
- SelSession 是Mybatis的关键对象,是持久化操作的对象。包含了以数据库为背景的所有SQL操作的方法,底层封装了JDBC连接,可以用SqlSession实例来直接执行已经映射的SQL语句。
Mybatis中的关联映射
一对一 一对多 多对多
Mybatis动态SQL
常用的动态SQL元素包括 if choose where set foreach bind
MyBatis 调用存储过程
MyBatis 事务管理
MyBatis缓存机制
- 一级缓存 SqlSession级别的缓存。作用域是SqlSession范围的,当在同一个SqlSession中执行两次SQL语句时,第一次执行完毕将会从数据库中查询的数据写入到缓存(内存),第二次查询会从缓存中获取数据,不再去底层数据库中查询。
- 二级缓存 mapper级别。不同的SqlSession两次执行相同的namespace下的SQL语句,且向SQL中传递的参数也相同,即最终执行相同的SQL语句,当第一个SqlSession调用close()方法关闭一级缓存时,第一次从数据库中查询的结果会保存到二级缓存,第二次查询时,会从二级缓存中获取数据,而不从底层数据库查询。