夜光带你走进SSM框架 (五)新的领域

版权声明:Genius https://blog.csdn.net/weixin_41987706/article/details/88872035

夜光序言:

或许你的一句不经意的话,他都当真了

或许你的一个不经意的动作,他就爱上了

喜欢一个人是没有理由的

 

正文:二、 SpringMVC  组件实现原理
1 执行逻辑图

2 组件介绍
2.1DispatcherServlet


DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,

DispatcherServlet 的存在降低了组件之间的耦合性。

MVC 模式: 传统定义,一个 WEB 应用中,只有唯一的一个控制器和客户端交互. 所有的客户端请求和服务器单点接触. 这个控制器称为核心控制器(前端控制器)。 传统定义中,核心控制器的实现使用 Servlet 实现。如:SpringMVC,Struts1。

MVC 优势: 单点接触,可以有效的解耦。可以实现功能的重用。
M - model
V - view
C - controller

2.2HandlerMapping

处理映射器。
HandlerMapping 负责根据用户请求找到 Handler 即处理器(如:用户自定义的Controller),springmvc 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

映射器相当于配置信息或注解描述。 映射器内部封装了一个类似 map 的数据结构。使用 URL 作为 keyHandlerExecutionChain 作为 value。核心控制器,可以通过请求对象(请求对象中包含请求的 URL)在 handlerMapping 中查询 HandlerExecutionChain 对象。

是 SpringMVC 核心组件之一。是必不可少的组件。无论是否配置,SpringMVC 会有默认提供。

如 果 有 <mvc:annotation-driven/> 标 签 配 置 , 默 认 的 映 射 器 :
RequestMappingHandlerMapping
如果没有<mvc:annotation-driven/>标签配置,且使用注解开发 SpringMVC 代码,默认的
映射器是:RequestMappingHandlerMapping。(老版本中有其他的映射器,但是已经过时。)

2.3HandlerAdapter


通过 HandlerAdapter 对处理器(Handler)进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

典型的适配器: SimpleControllerHandlerAdapter。最基础的。处理自定义控制器(Handler)和 SpringMVC 控制器顶级接口 Controller 之间关联的。如 果 定 义 了 <mvc:annotation-driven/> 标 签 配 置 , 使 用 适 配 器 对 象 为 :
HttpRequestHandlerAdapter。

适配器也是 SpringMVC 中的核心组件之一。必须存在。SpringMVC 框架有默认值。


2.4Handler


处理器。
Handler 是继 DispatcherServlet 前端控制器的后端控制器(自定义控制器),在DispatcherServlet 的控制下 Handler 对具体的用户请求进行处理。由于 Handler 涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发 Handler。

在 SpringMVC 中对 Handler 没有强制的类型要求。在 SpringMVC 框架中,对 Handler的引用定义类型为 Object。

处理器理论上说不是必要的核心组件。

SpringMVC 框架是一个线程不安全的,轻量级的框架。一个 handler 对象,处理所有的请求。开发过程中,注意线程安全问题


2.5ViewResolver


ViewResolver 负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

是 SpringMVC 中 必 要 的 组 件 之 一 。 SpringMVC 提 供 默 认 视 图 解 析 器 。InternalResourceViewResolver。内部资源视图解析器。视图解析器是用于处理动态视图逻辑的。静态视图逻辑,不通过 SpringMVC 流程。直接通过 WEB 中间(Tomcat)就可以访问静态资源。


3 源码解读

三、 MyBatis  自动化生成& 关联查询
1 mybatis-generator-gui


代码自动生成插件。缺陷:没有多表操作.自动生成是针对互联网开发提出的.互联网开发中多表操作很少.

类似 MyEclipse 中的一个逆向工程组件.根据数据库表格设计,自动生成实体类型,Mapper/DAO 接口,有必要生成对应的实现类,相关的 Mapper/DAO 的配置文件。

MyBatis-generator : 是一个开发完善的 JavaSE 工程。主要实现方式,就是使用JDBC/MyBatis 连接数据库,查询表格信息,自动化生成对应的 java 代码。

版本:


gui 版本:提供可视化界面,操作简单。弊端是一次只能生成一张表格的对应代码。
console 版本:无可视化界面,操作相对麻烦。优势是可以一次性生成若干表格的对应代码。企业使用。

使用方式:


gui 版本:运行 com.Genius.mybatis.generator.MainUI。

2 mybatis-generator-console


插件工具。 是用于自动生成代码的。 可以生成的代码包括:实体类型,Mapper 接口,Mapper 接口对应的 SQL 映射文件。

2.1 代码生成方式


关注配置文件:generatorConfig.xml
配置文件中配置了需要逆向生成代码的表格有哪些。还配置了数据库的链接相关信息。

2.2 生成后的 Mapper  使用方式


详见代码。


2.3 自动生成代码的优缺点


2.3.1 优点


方便。SQL 规范。快捷。维护成本低


2.3.2 缺点


只能单表操作。(互联网应用中,多表联合查询相对较少。)
如果表格中有 Text,BLOB 字段。查询、更新的时候,需要特殊注意。默认的查询方法,不查询 Text 和 BLOB 字段,默认的更新方法不更新 Text 和 BLOB 字段。必须调用selectByExampleWithBLOBs,updateByExamaleWithBLOBs,updateByPrimaryKeyWithBLOBs

3 Interceptor


是 MyBatis 提供的一个插件(plugin 扩展)。代表拦截器。可以拦截代码中的数据库访问操作。就是 Statement 操作。

拦截后,可以去修改正在执行的 SQL 语句,可以额外访问数据库,可以实现若干数据计算和处理。

使用场景不多。针对某类型的 SQL 实现拦截的工具。粒度太粗糙。市场常用的 Interceptor 插件只有 PageHelper。
Interceptor 影响执行效率。


4 关联查询


在 MyBatis 中,关联查询分为一次查询和 N+1 次查询。
一次查询:是使用多表联合查询 SQL 语法实现。
一次查询 SQL 语法相对复杂,效率比较高。如果查询的数据量大,不推荐使用。
N+1 次查询:是使用多个单表查询 SQL 语法实现。
N+1 次查询效率低,多次访问数据库,网络操作为多次。可以使用 lazy 实现懒加载。
在 MyBatis 中懒加载并不是非常好用。
在一对一关系查询的时候,可以使用 AutoMapping 的方式实现查询。具体语法为:
select column as `关联属性名.关联对象内部属性名` from ....
AutoMapping 不推荐使用,语义不明确,维护成本高。

猜你喜欢

转载自blog.csdn.net/weixin_41987706/article/details/88872035