Book(8) Spring+MyBatis企业应用实战(第2版)

182 阅读4分钟
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()方法关闭一级缓存时,第一次从数据库中查询的结果会保存到二级缓存,第二次查询时,会从二级缓存中获取数据,而不从底层数据库查询。