SSM
SSM框架是spring MVC ,spring和mybatis框架的整合,是标准的MVC模式,将整个系统划分为表现层,controller层,service层,DAO层四层
使用spring MVC负责请求的转发和视图管理
spring实现业务对象管理,mybatis作为数据对象的持久化引擎
相比于之前的SSH(Struts+Spring+Hibernate),SSM更加轻量化和灵活,是目前比较主流的java web开发框架。
Spring MVC
- Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
- 拥有控制器,作用跟Struts类似,接收外部请求,解析参数传给服务层
Spring
- Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架
- 容器属于协调上下文,管理对象间的依赖,提供事务机制
- 控制反转和依赖注入 创建对象交由容器管理,达到了解耦的作用
- Spring框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,
组成Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。
mybatis
- MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
- 属于orm持久层框架,将业务实体 与数据表联合 起来
- 主要用来操作数据库(数据库的增删改查)
IOC:控制反转
是一种降低对象之间耦合关系的设计思想;
也叫依赖注入。利用了工厂模式将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类(假设这个类名是A),分配的方法就是调用A的setter方法来注入,而不需要你在A里面new这些bean了。
例子,加深理解。例子:租房子,以前租房子需要一个房子一个房子找,费时费力,然后现在加入一个房屋中介,把你需要的房型告诉中介,就可以直接选到需要的房子,中介就相当于spring容器。
AOP:面向切面编程
是面向对象开发的一种补充,它允许开发人员在不改变原来模型的基础上动态的修改模型以满足新的需求;如:动态的增加日志、安全或异常处理等。AOP使业务逻辑各部分间的耦合度降低,提高程序可重用性,提高开发效率。
AOP只是Spring的特性,它就像OOP(面向对象编程)一样是一种编程思想,并不是某一种技术,AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。
实现AOP的技术,主要分为两大类:
一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;
二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
原理
SpringMVC:
1.客户端发送请求到DispacherServlet(分发器)
2.由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller
3.Controller调用业务逻辑处理后,返回ModelAndView
4.DispacherSerclet查询视图解析器,找到ModelAndView指定的视图
5.视图负责将结果显示到客户端
Spring:
平时开发接触最多的估计就是IOC容器,它可以装载bean(也就是我们Java中的类,当然也包括service dao里面的),有了这个机制,我们就不用在每次使用这个类的时候为它初始化,很少看到关键字new。另外spring的aop,事务管理等等都是我们经常用到的;
Mybatis:
mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
事务管理。
事务有四个特性:ACID
原子性Atomicity,一致性Consistency,隔离性Isolation,持续性Durability。
MyBatis的事务设计的重点是Transaction接口,包含四个方法,获取连接,提交,回滚,关闭连接。
事务管理分别2种形式:
1.使用JDBC的事务管理机制:即利用java.sql.Connection完成对事物的操作;
2.使用MANAGED的事务管理机制,MyBatis自身不会去实现事务管理,而是让容器如WebLogic,JBOSS等来实现事务管理。
使用方法:
要完成一个功能:
1.先写实体类entity,定义对象的属性,(可以参照数据库中表的字段来设置,数据库的设计应该在所有编码开始之前)。
2.写Mapper.xml(Mybatis),其中定义你的功能,对应要对数据库进行的那些操作,比如 insert、selectAll、selectByKey、delete、update等。
3.写Mapper.java,将Mapper.xml中的操作按照id映射成Java函数。
4.写Service.java,为控制层提供服务,接受控制层的参数,完成相应的功能,并返回给控制层。
5.写Controller.java,连接页面请求和服务层,获取页面请求的参数,通过自动装配,映射不同的URL到相应的处理函数,并获取参数,对参数进行处理,之后传给服务层。
6.写JSP页面调用,请求哪些参数,需要获取什么数据
SSH
SSH框架则是Struts2,Spring和Hibernate框架的整合,其中Struts2 做控制器(controller),spring 管理各层的组件,hibernate 负责持久化层。
Struts2框架执行步骤(Struts2使用Filter嵌入):
1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。
9、将处理结果返回给客户端
hibernate:
优势:
- 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
- Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
- hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
- hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
原理:
1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的resource="com/xx/User.hbm.xml"/>读取并解析映射信息
3.通过config.buildSessionFactory();//创建SessionFactory
4.sessionFactory.openSession();//打开Sesssion
5.session.beginTransaction();//创建事务Transation
6.persistent operate持久化操作
7.session.getTransaction().commit();//提交事务
8.关闭Session
9.关闭SesstionFactory
对比
1.struts太重太繁琐,SpringMVC轻一级
2.Hibernate太重,想作的事太多了,我个人觉得,像hibernate事务,完全鸡肋,而缓存,大部分时候也用不上,需要用到的场景,完全可以自已开发,更轻,而数据关系变得复杂后,hibernate越难驾驭,分布式事务的时候,还是mybatis更灵活,必要时,直接写SQL。按业务类型,混合着用。
3.springboot,本质还是spring,坑比较多,升级版本一定要慎重,如果事务处理比较多,不建议用springboot打包的hibernate/mybatis,直接用原生会少踩坑,熟悉后开发运维都很溜,胶水的角色。
4.Hibernate是一种O/R关系型,即完成数据库表和持久化类之间的映射,而MyBitas是针对的SQL-Maping,个人理解是一种Hibernate把数据库给封装好以后,可以调用相应的数据库操作语句HQL,而MyBitas则是用的原始的数据库操作语句,可以减少查询字段。则Hibernate优化起来相对MyBitas较难。
5.针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。
6.Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
7.SSM会比SSH更轻量,更灵活。但是SSH封装性更多一些,开发更为轻松
8.SSM和SSH不同主要在MVC实现方式,以及ORM持久化方面不同(Hiibernate与Mybatis)。SSM越来越轻量级配置,将注解开发发挥到极致,且ORM实现更加灵活,SQL优化更简便;而SSH较注重配置开发,其中的Hiibernate对JDBC的完整封装更面向对象,对增删改查的数据维护更自动化,但SQL优化方面较弱,且入门门槛稍高。
9.JPA hibernate/mybatis都是面向sql的,面向nosql,如mongo/elasticsearch/solr,通用的crud,用jpa很高效,一套方法打遍天,当然太细的控制jpa就不行了,比如elasticsearch/solr想高亮,实际大部分nosql的服务对性能和事务的要求都不高,如无必要,还是用nodejs,python之类的开发更高效。
10.netty,可以把ssh的网络服务(在mvc之下,网络socket的部分)接管,早期还要启个轻量的tomcat/jboss/glassfish之类,现在多是直接启netty。jersey开发restful更高效,足以代替SpringMVC