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