SSM、SSH -企業開發MVC開源框架

SSM

SSM框架是spring MVC ,spring和mybatis框架的整合,是標準的MVC模式,將整個系統劃分爲表現層,controller層,service層,DAO層四層 使用spring MVC負責請求的轉發和視圖管理 spring實現業務對象管理,mybatis做爲數據對象的持久化引擎java

相比於以前的SSH(Struts+Spring+Hibernate),SSM更加輕量化和靈活,是目前比較主流的java web開發框架。node

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容器。python

AOP:面向切面編程

是面向對象開發的一種補充,它容許開發人員在不改變原來模型的基礎上動態的修改模型以知足新的需求;如:動態的增長日誌、安全或異常處理等。AOP使業務邏輯各部分間的耦合度下降,提升程序可重用性,提升開發效率。web

AOP只是Spring的特性,它就像OOP(面向對象編程)同樣是一種編程思想,並非某一種技術,AOP能夠說是對OOP的補充和完善。OOP引入封裝、繼承和多態性等概念來創建一種對象層次結構,用以模擬公共行爲的一個集合。當咱們須要爲分散的對象引入公共行爲的時候,OOP則顯得無能爲力。也就是說,OOP容許你定義從上到下的關係,但並不適合定義從左到右的關係。例如日誌功能。日誌代碼每每水平地散佈在全部對象層次中,而與它所散佈到的對象的核心功能毫無關係。在OOP設計中,它致使了大量代碼的重複,而不利於各個模塊的重用。將程序中的交叉業務邏輯(好比安全,日誌,事務等),封裝成一個切面,而後注入到目標對象(具體業務邏輯)中去。spring

實現AOP的技術,主要分爲兩大類: 一是採用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行爲的執行; 二是採用靜態織入的方式,引入特定的語法建立「方面」,從而使得編譯器能夠在編譯期間織入有關「方面」的代碼。sql

原理

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命令。api

事務管理

事務有四個特性: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嵌入):

一、客戶端初始化一個指向Servlet容器(例如Tomcat)的請求

二、這個請求通過一系列的過濾器(Filter)(這些過濾器中有一個叫作ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其餘框架的集成頗有幫助

三、接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請求是否須要調用某個Action

四、若是ActionMapper決定須要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy

五、ActionProxy經過Configuration Manager詢問框架的配置文件,找到須要調用的Action類

六、ActionProxy建立一個ActionInvocation的實例。

七、ActionInvocation實例使用命名模式來調用,在調用Action的過程先後,涉及到相關攔截器(Intercepter)的調用。

八、一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果一般是(但不老是,也可 能是另外的一個Action鏈)一個須要被表示的JSP或者FreeMarker的模版。

九、將處理結果返回給客戶端

hibernate:

優點:

  1. 對JDBC訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。
  2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工做
  3. hibernate使用Java反射機制,而不是字節碼加強程序來實現透明性。
  4. 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

orange.png
相關文章
相關標籤/搜索