SpringMVC
对springmvc的理解:
1.它基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是java组件,并且和spring提供的其他基础结构密集成.
2.不依赖Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)
3.可以任意使用各种视图技术
4.支持各种请求资源的映射策略.
5.易于扩展
SpringMVC的工作流程:
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器.
3.处理器映射器根据请求url找到具体的处理器,生成处理起对象及处理器拦截(如果有则生成)–并返回给DispatcherServlet.
4.DispatcherServlet通过HandlerAdaper处理器适配器调用处理器
5.执行处理器(Controler,也叫后端控制器).
6.Controller执行完成范湖ModelAndView
7.HandlerAdaper将执行结果ModelAndView返回DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatchServlet将View进行渲染视图(即模型数据填充至视图中)
11.DispatcherServlet响应用户
MyBatis
对mybatis的理解
1.对mybatis配置
2.SqlMapConfig.xml,此文件作为mybatis的全部配置文件,配置了mybatis的运行环境等信息.
3.mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句.此文件需要在SqlMapConfig.xml中加载.
4.通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
5.由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行
6.mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个基本执行器,一个缓存执行器.
7.Mapped
Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等.mapper.xml文件中一个sql对应一个Mapped
Statement也是mybatis一个底层封装对象,它包装了.它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped
Statement对象,sql的id即是Mapped statement的id。
8.Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped
Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
9.Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped
Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
MyBatis编程步骤
1.创建SqlSessionFactory
2.通过SqlSessionFactory创建SqlSession
3.通过sqlsession执行数据库操作
4.调用session.commit()提交事物
5.调用session.close()关闭会话
mybatis的一级缓存和二级缓存:
Mybatis首先缓存中查询结果集,如果没有则查数据库,如果有则从缓存中取出返回结果集就不走数据库.Mybatis内部缓存使用HashMap,
key为HashCode+sqlId+Sql语句.Value为从查询出来映射生成的Java对象Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,记在同一个那么space中查询sql可以缓存中获取数据.二级缓存可以跨SqlSession的
JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的:
1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决: Mybatis自动将java对象映射至sql语句。
4.对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象。
SqlMapConfig.xml中配置的内容和顺序如下:
properties(属性)
settings(配置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
使用MyBatis的mapper接口调用时有哪些要求:
1. Mapper接口方法名和mapper.xml中定义的每个sql的id相同
2. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
3. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
4. Mapper.xml文件中的namespace即是mapper接口的类路径。
Spring
Spring的ioc、aop(核心):
oC:
Inversion of Control 控制反转。
我们以前开发,在一个类中使用其他类对象的时候都是采用new的方式直接获取,或者高级一点是通过反射的方式的得到需要的对象实例。这就造成了程序的耦合度非常高,一个类的运行,严重依赖于其他的类。并且还会出现程序中硬编码的情况。
而spring中的IoC很好的解决了该问题,我们在一个类中使用其他类对象时,只需要定义一个接口类型的类成员变量,由使用者在使用时为我们注入具体的实现类对象,从而降低了程序的耦合度。
实现IoC的思想就只有两种:依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。
而依赖注入使用的更广泛一些。例如:构造函数注入,set方法注入等等。
AOP:
Aspect Oriented Programming 面向切面编程。
我们之前学习的java语言,号称是面向对象编程,它有自己的优势。但是也存在着一些弊端。
举例说明,在实际开发中,我们都会有一根业务主线,即客户(甲方)的需求。而程序员要做的就是围绕业务主线上的需求,实现功能(实现功能的方法我们叫做业务核心方法)。但是不可避免的,会有一些功能与业务主线没有关系,却又不能不做,比如权限的控制,事务的控制,日志的记录等等,这些功能绝大多数时候和业务主线没有关系,但是却和很多业务核心方法交织在一起,使我们的开发变得麻烦,并且冗余代码增多。
而spring的提供了一种思想,把这些和业务主线没有关系的功能剥离出来,而在需要使用这些公共方法时,适时适地的把它加到我们的代码中去,使程序员在开发时,把更多的精力放在理解需求,实现业务核心功能上,并且让我们的代码变得简洁。这种思想就是面向切面编程。
Spring实现面向切面编程使用的是动态代理技术,并且会根据实际情况来选择使用基于子类的还是基于接口的动态代理。
简单介绍控制反转:
它是spring的核心之一。或者说是spring的基础核心,spring的其余核心功能都必须有IoC的支持。
控制反转指的是,我们在获取对象的时候,由之前的主动出击,变成了被动接收。也就是说,在编写某个类时,只需要提供一个接口类型的类成员,并不需要关系具体的实现类,而是由使用者在使用时提供。这就降低了类和类之间的耦合度。
简单介绍依赖注入:
首先,明确依赖注入是实现控制反转的一种思想(另一种是依赖查找)。
其次,在开发过程中,我们需要某个类的实例时,是由使用者为我们提供该类的实例。而不是自己去获取。
最后,实现依赖注入的方式可以是使用构造方法注入或者set方法注入两种方式。
在spring中注入的方式就有很多了,比如constructor-arg元素,property元素,p名称空间等等。
在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释
spring管理事务的两种方式:
1、编程式事务,在代码中硬编码。(不推荐使用)
2、声明式事务,在配置文件中配置(推荐使用)
声明式事务又分为两种:
a、基于XML的声明式事务
b、基于注解的声明式事务
总结
SM优缺点、使用场景:
1.Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
2.Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
3.Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
- 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
注意 : 任何框架在植入项目之中都不能带来效率的提升,反而是会带来效率的下降。因为java核心机制的问题,内存中多创建一个对象,就会造成性能降低。
源网址:https://blog.csdn.net/qq_38334410/article/details/79494950