Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
為一枚Java程序員,需要掌握哪些技術和工具才能完成一個JavaWeb項目呢?今天羅列一些常用技術和工具,這些技術都是我這10年工作中用的比較多的,我知道技術棧遠不止這些,本人只列自己熟悉和用的最多的,完成一個項目絕對夠用了。說這么多技術不是讓大家都要熟悉,有些太老的現在也用的少了甚至不用了,本人主要結合我這10年開發經驗告訴大家JavaWeb的常用技術棧。
下面這張是技術棧思維導圖:
什么是技術棧? 舉個例子: 開發一個普通管理系統,會用到Sprin Boot+MyBatis+Spring+Mysql+Redis+RabbitMq+Nginx+Vue+Shiro+html+等等,這些技術合起來就可以稱為技術棧。
我將技術棧大致分為5大塊:前端、后端、中間件、數據庫和工具。
JSP全稱Java Server Pages,是一種動態網頁開發技術。它使用JSP標簽在HTML網頁中插入Java代碼。
JSP本質上是一個servlet,主要用于實現Java web應用程序的用戶界面部分。
<html>
<head>
<title>第一個 JSP 程序</title>
</head>
<body>
<%
out.println("Hello World!");
%>
</body>
</html>
JSP這種網頁技術我猜5年以下的程序員基本沒接觸過,10年前我接觸的項目前端基本都是采用的JSP技術,jsp配合各種html+jquery/JavaScript+css完成前端頁面開發。
DWZ、EasyUI、EXT、BootStrap、KendoUI 都是基于基于 HTML、CSS、JavaScript/jquery的一些富文本客戶端UI框架,在當時簡直是后端開發人員的福音。這些框架最大的特點就是官網上提供了各種組件的使用方法,后端人員只要套到JSP頁面中,進行數據渲染即可。這些UI框架風格基本已經固定,更適合開發一些管理類系統,都包括:強大的數據源,通用的拖拉(Drag-and-Drop)功能,模板,和UI控件。
是中國人自己開發的基于jQuery實現的Ajax RIA開源框架,設計目標是簡單實用,快速開發,降低ajax開發成本。
官網:https://jui.org/
easyui是一種基于jQuery的用戶界面插件集合,為創建現代化,互動,JavaScript應用程序,提供必要的功能。使用easyui你不需要寫很多代碼,你只需要通過編寫一些簡單HTML標記,就可以定義用戶界面,為網頁開發的時間和規模。
官網;http://www.jeasyui.com/
ExtJS是基于YUI(雅虎用戶界面)的sencha的JavaScript框架和產品,它基本上是具有現代UI的桌面應用程序開發平臺。
中文官網:http://extjs-doc-cn.github.io/ext4api/#!/api/Ext
bootstrap是Twitter推出的一個用于前端開發的開源工具包
中文官網:https://www.bootcss.com/
是一套 JavaScript 函式庫,提供抽象化、可自訂主題的 GUI 控制項與動畫效果。基于 jQuery JavaScript 函式庫,可用來建構互動式的 Web 應用
官網:http://www.kendoui.io/
FreeMarker是一個免費的模板引擎,一個基于模板生成文本輸出的通用工具,使用純Java編寫的,用來生成HTML Web頁面,特別是基于MVC模式的應用程序。通常由Java程序準備要顯示的數據,由FreeMarker生成頁面,通過模板顯示準備的數據(如下圖)
FreeMarker不是一個Web應用框架,FreeMarker與容器無關,也可以在模板中使用JSP標記庫。
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Our latest product:
<a href="${latestProduct.url}">${latestProduct.name}</a>!
</body>
</html>
上面很多前端框架都是基于html的,需要你有js/jq、css基礎,這是所有前端框架的基礎。因為光框架有時并不能滿足我們的需求,有時需要對框架無法實現的功能需要在框架基礎上調整;還有這個飛速發展的互聯網時代,對前端的要求越來越高,原生html得到了快速發展,基本所有前端效果使用原生時可以實現的。
vue.js 使用了基于 HTML 的模板語法,允許開發者聲明式地將 DOM 綁定至底層 Vue 實例的數據。所有 Vue.js 的模板都是合法的 HTML,所以能被遵循規范的瀏覽器和 HTML 解析器解析。
在底層的實現上,Vue 將模板編譯成虛擬 DOM 渲染函數。結合響應系統,Vue 能夠智能地計算出最少需要重新渲染多少組件,并把 DOM 操作次數減到最少。
VUE+elementUI目前使用最多的,尤其是開發一些后臺管理系統還是比較簡單便捷的。
servlet是Server Applet的簡稱,翻譯過來就是服務程序,簡單的講就是是運行在服務器上的一個小程序,用來處理服務器請求的。我們通過瀏覽器訪問一個應用,在這個過程中,我們的瀏覽器發送訪問請求,服務器接收請求,并對瀏覽器的請求作出相應的處理,這就是我們熟悉的B/S模型(瀏覽器-服務器模型).而servlet就是對請求作出處理的組件,運行于支持Java的應用服務器中。如圖如是:
struts主要是指struts1和struts2,是經典的MVC框架,除去一些老項目,現在用的越來越少了。但struts1和struts2還是有區別的,主要區別二者本質不一樣。
struts1:通過采用Java Servlet/JSP技術,實現了基于Java EE Web應用的Model-View-Controller(MVC)設計模式的應用框架,是MVC經典設計模式中的一個經典產品。
struts2:以WebWork為核心,采用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器能夠與ServletAPI完全脫離開,所以Struts 2可以理解為WebWork的更新產品。
最經典的組合strutsMVC+SPring+Hibernate,號稱SSH,當年都是面試必問的技術。
Spring框架是一個開源Java應用框架,解決了開發者在開發中遇到的許多常見的問題,提供了功能強大IOC、AOP及Web MVC等功能。Spring可以單獨應用于應用程序,也可以和Struts、Webwork等眾多Web框架組合使用。Spring框架主要由七部分組成,分別是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。
JDBC(Java Data Base Connectivity,java數據庫連接)是一種用于執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。
早期項目大部分都是通過對JDBC封裝來操作數據庫,實現增刪改查,對性能考慮也不多,隨時間推移不斷衍生出很多框架,例如:mybatis,hibernate等。
iBATIS一詞來源于“internet”和“abatis”的組合,是一個由Clinton Begin在2001年發起的開放源代碼項目。最初側重于密碼軟件的開發,現在是一個基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO),同時還提供一個利用這個框架開發的JPetStore實例。
iBATIS 目前提供了三種語言實現的版本,包括:Java、.NET以及Ruby。
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。
MyBatis 是一款優秀的持久層框架,它支持定制化SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。
Mybatis 增強工具包 - 只做增強不做改變,簡化CRUD操作
JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0注解或XML描述對象-關系表的映射關系,并將運行期的實體對象持久化到數據庫中。
Sun引入新的JPA ORM規范出于兩個原因:其一,簡化現有Java EE和Java SE應用開發工作;其二,Sun希望整合ORM技術,實現天下歸一。
SpringBoot是由Pivotal團隊在2013年開始研發、2014年4月發布第一個版本的全新開源的輕量級框架。它基于Spring4.0設計,不僅繼承了Spring框架原有的優秀特性,而且還通過簡化配置來進一步簡化了Spring應用的整個搭建和開發過程。另外SpringBoot通過集成大量的框架使得依賴包的版本沖突,以及引用的不穩定性等問題得到了很好的解決。
Spring Cloud 為開發者提供了在分布式系統(如配置管理、服務發現、斷路器、智能路由、微代理、控制總線、一次性 Token、全局鎖、決策競選、分布式會話和集群狀態)操作的開發工具。使用 Spring Cloud 開發者可以快速實現上述這些模式。
Spring Cloud 的 GitHub 主頁:https://github.com/spring-cloud
Dubbo 是阿里巴巴公司開源的一個高性能優秀的服務框架,使得應用可通過高性能的 RPC 實現服務的輸出和輸入功能,可以和 Spring 框架無縫集成。
主要核心部件:
Remoting: 網絡通信框架,實現了 sync-over-async 和 request-response 消息機制
RPC: 一個遠程過程調用的抽象,支持負載均衡、容災和集群功能
Registry: 服務目錄框架用于服務的注冊和服務事件發布和訂閱
Spring Cloud Alibaba 致力于提供分布式應用服務開發的一站式解決方案。此項目包含開發分布式應用服務的必需組件,方便開發者通過 Spring Cloud 編程模型輕松使用這些組件來開發分布式應用服務。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以將 Spring Cloud 應用接入阿里分布式應用解決方案,通過阿里中間件來迅速搭建分布式應用系統。
Apache Shiro 是 Java 的一個安全框架。目前,使用 Apache Shiro 的人越來越多,因為它相當簡單,對比 Spring Security,可能沒有 Spring Security 做的功能強大,但是在實際工作時可能并不需要那么復雜的東西,所以使用小而簡單的 Shiro 就足夠了。對于它倆到底哪個好,這個不必糾結,能更簡單的解決項目問題就好了。
Spring Security是一個能夠為基于Spring的企業應用系統提供聲明式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉Inversion of Control ,DI:Dependency Injection 依賴注入)和AOP(面向切面編程)功能,為應用系統提供聲明式的安全訪問控制功能,減少了為企業系統安全控制編寫大量重復代碼的工作。
OAuth(開放授權)是一個開放標準,允許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如照片,視頻,聯系人列表),而無需將用戶名和密碼提供給第三方應用。
OAuth 2.0 是目前比較流行的做法,它率先被Google, Yahoo, Microsoft, Facebook等使用。之所以標注為 2.0,是因為最初有一個1.0協議,但這個1.0協議被弄得太復雜,易用性差,所以沒有得到普及。2.0是一個新的設計,協議簡單清晰,但它并不兼容1.0,可以說與1.0沒什么關系。
Maven 是 Apache 下的一個純 Java 開發的開源項目。利用一個中央信息片斷能管理一個項目的構建、報告和文檔等步驟。是一個項目管理工具,可以對 Java 項目進行構建、依賴管理。
ant 是一個將軟件編譯、測試、部署等步驟聯系在一起加以自動化的一個工具,大多用于Java環境中的軟件開發。在實際軟件開發中,有很多地方可以用到ant。
Gradle是一個基于Apache Ant和Apache Maven概念的項目自動化構建開源工具。它使用一種基于Groovy的特定領域語言(DSL)來聲明項目設置,目前也增加了基于Kotlin語言的kotlin-based DSL,拋棄了基于XML的各種繁瑣配置。
Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬于輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選
Apache(阿帕奇)是世界使用排名第一的Web服務器軟件。它可以運行在幾乎所有廣泛使用的計算機平臺上,由于其跨平臺和安全性被廣泛使用,是最流行的Web服務器端軟件之一
Jetty 是一個開源的servlet容器,它為基于Java的web容器,例如JSP和servlet提供運行環境。
WebLogic Server是專門為企業電子商務應用系統開發的。企業電子商務應用系統需要快速開發,并要求服務器端組件具有良好的靈活性和安全性,同時還要支持關鍵任務所必需的擴展、性能、和高可用性。WebLogic Server簡化了可移植及可擴展的應用系統的開發,并為其它應用 系統和系統提供了豐富的互操作性。
Nginx是一款輕量級的Web服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特點是占有內存少,并發能力強。
緩存是現在系統中必不可少的模塊,并且已經成為了高并發高性能架構的一個關鍵組件。緩存的主要作用:提升性能和緩解數據庫壓力,
Redis是一個開源的內存數據結構存儲,用作數據庫、緩存和消息代理。提供諸如字符串、哈希、列表、集合、帶范圍查詢的排序集合、位圖、超日志、地理空間索引和流等數據結構。具有內置的復制、Lua腳本、LRU逐出、事務和不同級別的磁盤持久性,并通過Redis Sentinel和Redis Cluster的自動分區提供高可用性。
MongoDB 是一個基于分布式文件存儲的數據庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。
Memcached是一個自由開源的,高性能,分布式內存對象緩存系統,用來提高Web應用擴展性的重要因素。是一個基于內存的key-value存儲,用來存儲小塊的任意數據(字符串、對象)。簡潔而強大,它的簡潔設計便于快速開發,減輕開發難度,解決了大數據量緩存的很多問題。一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。
差異性我就不多說了,簡單說下他們的使用場景:
Solr是一個獨立的企業級搜索應用服務器,它對外提供類似于Web-service的API接口。用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,并得到XML格式的返回結果。
Elasticsearch是一個基于Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口
es基本是開箱即用,非常簡單,Solr略微復雜。
Solr 支持更多格式的數據,比如JSON、XML、CSV,而 Elasticsearch 僅支持json文件格式。
Solr 查詢快,但更新索引時慢(即插入刪除慢),ES建立索引快(即查詢慢),即實時性查詢快。
之所以推薦ELK是因為面對分布式微服務情況下,會顯示出他的威力,不管是數據收集、數據處理、還是數據分析可以節約很多時間。ELK是Elasticsearch + Logstash + Kibana三個開源軟件的組合,但是通常為了提高性能需要借助kafka,利用Filebeat進行日志收集,下面這個架構圖是我做過的一個日志服務平臺。
說定定時任務大家可能都接觸過,例如Spring自帶的定時任務SpringTask,但是SpringTask是存在很多問題的,例如:最致命的一個問題就是一旦定時拋出異常,生命就結束,下一次不會再執行。復雜業務中使用起來是不方便的,這里推薦兩個定時任務框架Quartz和xx-job,第三方的功能比較強大,好用。
Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,完全由Java開發,可以用來執行定時任務,類似于java.util.Timer。但是相較于Timer, Quartz增加了很多功能:
XXL-JOB是一個輕量級分布式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放源代碼并接入多家公司線上產品線,開箱即用。
目前已有多家公司接入xxl-job,包括比較知名的大眾點評,京東,優信二手車,北京尚德,360金融 (360),聯想集團 (聯想),易信 (網易)等等.... Quartz作為開源作業調度中的佼佼者,是作業調度的首選
Quartz在集群環境下只能通過API的方式對任務管理,同時,系統侵入性相當嚴重,而XX-JOB可以完美解決集群下任務額管理。所以,可以根據自己業務情況選擇合適定時任務框架,
什么是配置中心?
集中將應用系統中對配置信息的管理作為一個新的應用功能模塊,區別與傳統的配置信息分散到系統各個角落方式,進行集中統一管理,并且提供額外功能。尤其是在微服務架構中,是不可或缺組件,甚至是必要組件之一。
為什么要使用配置中心?
在微服務體系中,服務的數量以及配置信息的日益增多,比如各種服務器參數配置、各種數據庫訪問參數配置、各種環境下應用配置信息的不同、配置信息修改之后實時生效等等,傳統的配置文件方式或者將配置信息存放于數據庫中的方式已無法滿足開發人員對配置管理的要求。常見的配置中心中間件有:SpringCloud Config ,Nacos,apollo等。
2014年9月開源,Spring Cloud 生態組件,可以和Spring Cloud體系無縫整合,Spring Cloud Config支持通過/bus/refresh端點的destination參數來指定要更新配置的機器,不過整個流程不夠自動化和體系化。相對于Apollo和Nacos還是比較弱的。
2018年6月,阿里開源的配置中心,也可以做DNS和RPC的服務發現。Nacos使用起來相對比較簡潔,在對性能要求比較高的大規模場景更適合。此外,Nacos除了提供配置中心的功能,還提供了動態服務發現、服務共享與管理的功能,降低了服務化改造過程中的難度。
2016年5月,攜程開源的配置管理中心,具備規范的權限、流程治理等特性,Apollo可以直接在控制臺上點灰度發布指定發布機器的IP,接著再全量發布,做得比較體系化。
核心功能: Apollo和Nacos相對于Spring Cloud Config的生態支持更廣
實時推送: Nacos和Apollo在配置實時推送鏈路上是比較簡單高效的,Spring Cloud Config比較復雜。
高可用部署: Nacos的部署結構比較簡單,運維成本較低。Apollo部署組件較多,運維成本比Nacos高。Spring Cloud Config生產高可用的成本最高。
服務器監控是實時掌握服務器工作狀態,并在需要時可以隨時調用監控記錄進行查看。
Spring Boot Admin用來管理和監控Spring Boot應用程序,通過UI來查看應用程序的狀態,例如Spring Beans,系統屬性,線程,http的調用情況等有限狀態。
我知道Druid更多的用途就是連接池,其實他還有一個對SQL監控功能。
Skywalking是由國內開源愛好者吳晟(原OneAPM工程師,目前在華為)開源并提交到Apache孵化器的產品,它同時吸收了Zipkin/Pinpoint/CAT的設計思路,支持非侵入式埋點。是一款基于分布式跟蹤的應用程序性能監控系統。另外社區還發展出了一個叫OpenTracing的組織,旨在推進調用鏈監控的一些規范和標準工作。
把涉及到數據庫相關或者可以作為數據倉庫的中間件都歸到一起了。
Mycat是一個開源數據庫中間件,是一個實現了MySQL協議的的數據庫中間件服務器,我們可以把它看作是一個數據庫代理,用MySQL客戶端工具和命令行訪問Mycat,而Mycat再使用用MySQL原生(Native)協議與多個MySQL服務器通信,也可以用JDBC協議與大多數主流數據庫服務器通信,包括SQL Server、Oracle、DB2、PostgreSQL等主流數據庫,也支持MongoDB這種新型NoSQL方式的存儲,未來還會支持更多類型的存儲;一般地,Mycat主要用于代理MySQL數據庫,雖然它也支持去訪問其他類型的數據庫;
Mycat官網:http://www.mycat.io/
我們先看官網的介紹
canal,譯意為水道/管道/溝渠,主要用途是基于 MySQL 數據庫增量日志解析,提供增量數據訂閱和消費。
這句介紹有幾個關鍵字:增量日志,增量數據訂閱和消費。
這里我們可以簡單地把canal理解為一個用來同步增量數據的一個工具。
接下來我們看一張官網提供的示意圖:
定位為輕量級Java框架,在Java的JDBC層提供的額外服務。 它使用客戶端直連數據庫,以jar包形式提供服務,無需額外部署和依賴,可理解為增強版的JDBC驅動,完全兼容JDBC和各種ORM框架。
主要功能
ZooKeeper是Hadoop的正式子項目,它是一個針對大型分布式系統的可靠協調系統,提供的功能包括:配置維護、名字服務、分布式同步、組服務等。ZooKeeper的目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
這個事務更多指的是分布式事務處理插件。
Apache ShardingSphere(Incubator) 是一套開源的分布式數據庫中間件解決方案組成的生態圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(規劃中)這3款相互獨立,卻又能夠混合部署配合使用的產品組成。它們均提供標準化的數據分片、分布式事務和數據庫治理功能,可適用于如Java同構、異構語言、容器、云原生等各種多樣化的應用場景。
Seata 是 Simple Extensible Autonomous Transaction Architecture 的簡寫,由 feascar 改名而來。是阿里開源的分布式事務框架,屬于二階段提交模式。
消息隊列是一個存放消息的容器,當我們需要使用消息的時候可以取出消息供自己使用。消息隊列是分布式系統中重要的組件,使用消息隊列主要是為了通過異步處理提高系統性能和削峰、降低系統耦合性。目前使用較多的消息隊列有ActiveMQ,RabbitMQ,Kafka,RocketMQ。
1.通過異步處理提高系統性能(削峰、減少響應所需時間);
2.降低系統耦合性;
Kafka是由Apache軟件基金會開發的一個開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分布式發布訂閱消息系統,它可以處理消費者在網站中的所有動作流數據。這些數據通常是由于吞吐量的要求而通過處理日志和日志聚合來解決。 對于像Hadoop一樣的日志數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是通過Hadoop的并行加載機制來統一線上和離線的消息處理,也是為了通過集群來提供實時的消息。
AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的中間件設計。消息中間件主要用于組件之間的解耦,消息的發送者無需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、隊列、路由(包括點對點和發布/訂閱)、可靠性、安全。 RabbitMQ是一個開源的AMQP實現,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。
ActiveMQ是一種開源的基于JMS(Java Message Servie)規范的一種消息中間件的實現,ActiveMQ的設計目標是提供標準的,面向消息的,能夠跨越多語言和多系統的應用集成消息通信中間件。
特性 ActiveMQ RabbitMQ kafka 開發語言 java erlang scala 單機吞吐量 萬級 萬級 10萬級 時效性 ms級 us級 ms級以內 可用性 高(主從架構) 高(主從架構) 非常高(分布式架構) 功能特性 成熟的產品,在很多公司得到應用;有較多的文檔;各種協議支持較好 基于erlang開發,所以并發能力很強,性能極其好,延時很低;管理界面較豐富 只支持主要的MQ功能,像一些消息查詢,消息回溯等功能沒有提供,畢竟是為大數據準備的,在大數據領域應用廣。
該數據庫主要是指關系型數據庫,是按照數據結構來組織、存儲和管理數據的倉庫,數據庫是存放數據的倉庫,是一個系統或者軟件必不可少的一部分。每個數據庫都有一個或多個不同的 API 用于創建,訪問,管理,搜索和復制所保存的數據。我們也可以將數據存儲在文件中,但是在文件中讀寫數據速度相對較慢。
所以,現在我們使用關系型數據庫管理系統來存儲和管理大數據量。所謂的關系型數據庫,是建立在關系模型基礎上的數據庫,借助于集合代數等數學概念和方法來處理數據庫中的數據。
關系數據庫管理系統的特點:
常見的數據管理系統主要有:oracle、mysql、SQL Server、access、TiDB。
Oracle Database,簡稱 Oracle。Oracle 數據庫系統是美國 Oracle 公司(甲骨文)提供的以分布式數據庫為核心的一組軟件產品,是目前最流行的客戶/服務器(client/server)的數據庫之一。Oracle 數據庫是目前世界上使用最為廣泛的數據庫管理系統,作為一個通用的數據庫系統,它具有完整的數據管理功能;作為一個關系型數據庫,它是一個完備關系的產品;作為分布式數據庫它實現了分布式處理功能,但它的所有知識,只要在一種機型上學習了Oracle知識,便能在各種類型的機器上使用它。
MySQL 是最流行的關系型數據庫管理系統,在 WEB 應用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關系數據庫管理系統)應用軟件之一。目前也是Oracle 公司來托管。
美國Microsoft公司推出的一種關系型數據庫系統。SQL Server是一個可擴展的、高性能的、為分布式客戶機/服務器計算所設計的數據庫管理系統,實現了與WindowsNT的有機結合,提供了基于事務的企業級信息管理系統方案。
Access是微軟把數據庫引擎的圖形用戶界面和軟件開發工具結合在一起的一個數據庫管理系統。它是微軟OFFICE的一個成員, 在包括專業版和更高版本的office版本里面被單獨出售。
TiDB 是 PingCAP 公司自主設計、研發的開源分布式關系型數據庫,是一款同時支持在線事務處理與在線分析處理 (Hybrid Transactional and Analytical Processing, HTAP)的融合型分布式數據庫產品,具備水平擴容或者縮容、金融級高可用、實時 HTAP、云原生的分布式數據庫、兼容 MySQL 5.7 協議和 MySQL 生態等重要特性。目標是為用戶提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解決方案。TiDB 適合高可用、強一致要求較高、數據規模較大等各種應用場景。
上面這幾個數據庫優缺點都比較明顯,不在啰嗦了,大家在工作中可以根據自己實際情況選擇合適的數據。
IntelliJ在業界被公認為最好的java開發工具,尤其在智能代碼助手、代碼自動提示、重構、JavaEE支持、各類版本工具(git、svn等)、JUnit、CVS整合、代碼分析、 創新的GUI設計等方面的功能可以說是超常的。IDEA是JetBrains公司的產品,這家公司總部位于捷克共和國的首都布拉格,開發人員以嚴謹著稱的東歐程序員為主。它的旗艦版本還支持HTML,CSS,PHP,MySQL,Python等。免費版只支持Java,Kotlin等少數語言。
Eclipse 是一個開放源代碼的、基于 Java 的可擴展開發平臺, 是 Java 的集成開發環境(IDE),當然 Eclipse 也可以作為其他開發語言的集成開發環境,如C,C++,PHP,和 Ruby 等。
MyEclipse,是在Eclipse 基礎上加上自己的插件開發而成的功能強大的企業級集成開發環境,主要用于Java、Java EE以及移動應用的開發。在最新版本的MyEclipse中,配合CodeMix使用支持也十分廣泛,尤其是對各種開源產品和主流開發框架的支持相當不錯。目前已支持PHP、Python、Vue、Angular、React、Java、Java EE等語言和框架開發。
這三款工具好壞我也不做任何評價,每個工具用戶都不少,我周圍IntelliJ IDEA和MyEclipse都有,我個人比較喜歡用IntelliJ IDEA。
常見的版本空間工具svn和git
TortoiseSVN 是 Subversion 版本控制系統的一個免費開源客戶端,可以超越時間的管理文件和目錄。文件保存在中央版本庫,除了能記住文件和目錄的每次修改以外,版本庫非常像普通的文件服務器。你可以將文件恢復到過去的版本,并且可以通過檢查歷史知道數據做了哪些修改,誰做的修改。這就是為什么許多人將 Subversion 和版本控制系統看作一種“時間機器”。
Git 是用于Linux內核開發的版本控制工具。與常用的版本控制工具 Subversion 不同,它采用了分布式版本庫的方式,不必服務器端軟件支持,代碼的發布和交流極其方便。 Git 的速度很快,這樣的大項目來說自然很重要。 Git 最為出色的是它的合并跟蹤(merge tracing)能力。
SVN的特點是簡單,只是需要一個放代碼的地方時用是OK的。
Git的特點版本控制可以不依賴網絡做任何事情,對分支和合并有更好的支持(這應該算是開發者最關心的地方)。
Navicat是一套快速、可靠并價格相當便宜的數據庫管理工具,專為簡化數據庫的管理及降低系統管理成本而設。它的設計符合數據庫管理員、開發人員及中小企業的需要。Navicat 是以直覺化的圖形用戶界面而建的,讓你可以以安全并且簡單的方式創建、組織、訪問并共用信息。
PL/SQL Developer是一個集成開發環境,專門開發面向Oracle數據庫的應用。PL/SQL也是一種程序語言,叫做過程化SQL語言(Procedural Language/SQL)。PL/SQL是Oracle數據庫對SQL語句的擴展。在普通SQL語句的使用上增加了編程語言的特點,所以PL/SQL把數據操作和查詢語句組織在PL/SQL代碼的過程性單元中,通過邏輯判斷、循環等操作實現復雜的功能或者計算,PL/SQL 只有 Oracle 數據庫有。
Redis Desktop Manager是一款windows平臺下的可視化redis數據庫桌面管理工具,使用它你可以查看、刪除、修改你的redis數據庫數據!
XShell是一個強大的安全終端模擬軟件,它支持SSH1,SSH2,以及Microsoft Windows平臺的TELNET協議。 XShell可以在Windows界面下用來訪問遠端不同系統下的服務器,從而比較好的達到遠程控制終端的目的。
寶塔面板是一個可以安裝在服務器上的集成環境,并配套了web管理面板,可以在瀏覽器上直接控制你的服務器,非常方便。 可以一鍵創建網站、FTP、數據庫、SSL;安全管理,計劃任務,文件管理,PHP多版本共存及切換;自帶基礎網站環境,支持windows系統(apache)和linux系統(apache或nginx)。
Secure CRT 是一款SSH客戶端軟件,通過使用內含的VCP命令行程序可以進行加密文件的傳輸。
Postman一款非常流行的API調試工具。其實,開發人員用的更多。因為測試人員做接口測試會有更多選擇,例如Jmeter、soapUI等。不過,對于開發過程中去調試接口,Postman確實足夠的簡單方便,而且功能強大。
Typora+PicGo,最好用的Markdown+最好用的圖床工具!如果寫博客的可以收藏起來。
Notepad++中文版是程序員必備的文本編輯器,Notepad++中文版小巧高效,支持27種編程語言,通吃C,C++ ,Java ,C#, XML, HTML, PHP,JS 等,Notepad++中文版編輯器可完美地取代微軟的記事本。
Office Visio 是Office軟件系列中的負責繪制流程圖和示意圖的軟件,是一款便于IT和商務人員就復雜信息、系統和流程進行可視化處理、分析和交流的軟件。使用具有專業外觀的 Office Visio 圖表,可以促進對系統和流程的了解,深入了解復雜信息并利用這些知識做出更好的業務決策。常見軟件架構、流程圖都可以在里面完成。
ProcessOn是一個在線作圖工具的聚合平臺, 它可以在線畫流程圖、思維導圖、UI原型圖、UML、網絡拓撲圖、組織結構圖等等, 您無需擔心下載和更新的問題,不管Mac還是Windows,一個瀏覽器就可以隨時隨地的發揮創意,規劃工作。
官網:https://www.processon.com/
owerDesigner是一款非常全面的數據庫設計工具。使用PowerDesigner可以快速創建表,支持表與表之間建立關系,界面簡潔,功能強大。同時支持將sql腳本導出,多種導出類型任意挑選,簡單實用。
XMind 是一個全功能的思維導圖和頭腦風暴軟件,為激發靈感和創意而生。作為一款有效提升工作和生活效率的生產力工具,受到全球百千萬用戶的青睞。
說到 iReport 不得不先介紹 Jasperreport,Jasperreport 是一個報表制作程序,用戶需要按照它制定的規則編寫一個 XML 文件,然后得到用戶需要輸出的格式文件。它支持輸出的文件格式包括 PDF,HTML,XML,XLS,CVS 等等。而 iReport 就是一個制作 Jasperreport 的 XML 文件的可視化開發工具。
Google Chrome是一款由Google公司開發的網頁瀏覽器,該瀏覽器基于其他開源軟件撰寫,包括WebKit,目標是提升穩定性、速度和安全性,并創造出簡單且有效率的使用者界面。
搜狗瀏覽器 由搜狗公司開發,基于谷歌chromium內核,力求為用戶提供跨終端無縫使用體驗,讓上網更簡單、網頁閱讀更流暢的瀏覽器。
Mozilla Firefox,中文俗稱“火狐”,是一個由Mozilla開發的自由及開放源代碼的網頁瀏覽器。其使用Gecko排版引擎,支持多種操作系統,如Windows、macOS及GNU/Linux等
Internet Explorer(簡稱:IE)是微軟公司微軟公司推出的一款網頁瀏覽器。原稱Microsoft Internet Explorer(6版本以前)和Windows Internet Explorer(7、8、9、10、11版本)。在IE7以前,中文直譯為“網絡探路者”,但在IE7以后官方便直接俗稱"IE瀏覽器"。
如果做前端開發,這幾款瀏覽器兼容性都得兼顧。很早之前IE瀏覽器市場是比較大,隨著時間推移,谷歌瀏覽器占據了比較大的市場。我個人日常開發中谷歌用的比較多,特殊情況才會使用其它瀏覽器。
JMeter是Apache組織開發的基于Java的壓力測試工具。用于對軟件做壓力測試,它最初被設計用于Web應用測試,但后來擴展到其他測試領域。 它可以用于測試靜態和動態資源,例如靜態文件、Java 服務程序、CGI 腳本、Java 對象、數據庫, 等等。
apache bench簡稱ab,它是apache自帶的壓力測試工具。ab非常實用,它不僅可以對apache服務器進行網站訪問壓力測試,也可以對或其它類型的服務器進行壓力測試。
MAT是Java堆內存分析工具,可從http://www.eclipse.org/mat/中下載。
你在成為大神的路上都學習了哪些技術,歡迎留言交流。
對程序員的有狀態模型,針對用戶的無狀態體驗
一般的 Web 開發有時候很有趣,但是通常卻是令人煩惱的。Java Web 開發人員要花費很長時間來提供無狀態模型,但是產生的性能和部署的簡單性使得這種努力是值得的。在本文中,我將討論一種完全不同的 Web 開發方式,稱為延續服務器(continuation server)。延續服務器提供了一個有狀態的編程模型,同時又沒有舍棄無狀態所固有的可伸縮性,從而使 Web 應用程序開發更加容易。
Web 的出現
當 20 世紀 90 年代中期整個行業轉向 Web 開發時,軟件開發人員們欣喜若狂。與 “終端加主機” 模式相比,我們現在構建的客戶機-服務器應用程序對用戶更友好,但是也有幾個問題困擾著我們:
客戶機-服務器計算仍然向前發展。公司常常是根據比較低的軟件和硬件開銷來做出財務決策,但是在進入生產階段之后管理開銷會大大增加。到了 1995 年,客戶機-服務器模型需要進行重大的改進,而且這種改進確實出現了。
進入 Web 開發
Web 開發在 20 世紀 90 年代中期迅速發展起來。由于 Java 語言的出現,開發人員可以用新功能來構建分布式 Web 應用程序,同時解決了最嚴重的客戶機-服務器問題。這些新功能包括:
性能、可伸縮性、可管理性和可移植性都大大提高了,互聯網革命因此進入了快車道。但是,您必須面對一些重要的問題。
不是烏托邦
無狀態(stateless)這個簡單的單詞將沉重的負擔從系統轉移到了開發人員身上。其后果是不容質疑的:盡管由于不必為每個用戶維護一個服務(或 servlet),而獲得了很好的可伸縮性;但是,對狀態進行管理的責任從編程語言轉移到了開發人員身上。目前,可以將 Web 開發看成一系列無狀態的請求,見圖 1:
圖 1. Web 應用程序由請求/響應對組成
采用這種模型,瀏覽器得到了嚴格控制。應用程序只對瀏覽器發出的請求進行響應。如果請求是小型的獨立請求,那么這個模型是有效的;但不幸的是,對于驅動有多個應用組成部分的 Web 應用程序,它是不合適的。最常見的例子是在線購物。點擊 Submit 按鈕兩次,常常會意外地重復訂購同一商品。以后當您發現購物車中有重復的商品時會大感意外。
向用戶提供有狀態體驗的方法通常是:將與一次交談相關的所有數據放進一個會話中,并用 cookie、隱藏字段或 URL 變量在客戶機上標識用戶會話。對于每個新的請求,必須依次執行以下步驟:
我對這個問題說得太輕描淡寫了,因為使用無狀態模型來模擬有狀態應用程序可能造成更嚴重的問題。最嚴重的問題從 Web 開發剛出現時就存在了,就是如何處理 Back 按鈕。
老問題的新答案
在 Web 開發中,可以利用有狀態模型為用戶提供無狀態體驗。您聽到這種說法可能會感到震驚。實際上,在 Hackers and Painters(參見 參考資料)中,Paul Graham 就討論了早在 1995 年在 ViaWeb 中使用的底層方法。這種方法使用一種稱為延續(continuation) 的編程控制結構。
基本思想是:可以讓編程框架在請求之前裝載應用程序的狀態,并在每個請求之后保存應用程序的狀態。我首先介紹一下 Ruby 編程語言中的延續。
一個 Ruby 示例
如果希望執行代碼,請安裝 Ruby 并輸入 irb。通過在 > 字符后面輸入命令,定義一個稱為 loop 的方法,見清單 1:
清單 1. 創建 loop 方法
irb(main):001:0> def loop(interrupt) irb(main):002:1> for i in 1..10 irb(main):003:2> puts "Value of i: #{i}" irb(main):004:2> callcc {|c| return c} if i==interrupt irb(main):005:2> end irb(main):006:1> end=> nil
loop 方法接受一個稱為 interrupt 的參數。它啟動一個從 1 到 i 的 for 循環,打印 i 的值,然后做一些奇怪的事兒。神秘的 callcc 語句意味著用延續進行調用。可以把延續看成在某一時間點上 “凍結的” 程序狀態。Ruby 調用花括號中的代碼塊,同時傳遞一個延續對象。花括號中的代碼是一個閉包,它僅僅是傳遞給 callcc 的代碼塊。最終結果是,callcc 捕獲執行的狀態并將結果存儲在 c 中。現在,可以調用這個方法并在循環的任意位置中斷執行,這會捕獲程序的狀態。在以后,可以恢復狀態。
現在,執行這個方法兩次,見清單 2:
清單 2. 執行 loop 方法
irb(main):007:0> cont=loop 5 Value of i: 1 Value of i: 2 Value of i: 3 Value of i: 4 Value of i: 5=> #<Continuation:0x2b5a358> irb(main):008:0> cont.call Value of i: 6 Value of i: 7 Value of i: 8 Value of i: 9 Value of i: 10=> 1 10 irb(main):009:0> cont=loop 8 Value of i: 1 Value of i: 2 Value of i: 3 Value of i: 4 Value of i: 5 Value of i: 6 Value of i: 7 Value of i: 8=> #<Continuation:0x2b562f0> irb(main):010:0> cont.call Value of i: 9 Value of i: 10
每次執行調用時,延續會獲得執行的狀態。所以,使用延續的 Web 開發框架可以在處理每個請求之后捕獲一個延續,并用一個標識符將它存儲在會話中。然后,框架可以在處理每個新請求之前從會話中恢復延續,采用的方法與存儲用戶數據一樣。
優點和缺點
延續服務器方式在許多方面都很出色 —— 有狀態的編程模型和具有無狀態性能的用戶體驗。這種方式的優點如下:
延續大大簡化了 Web 開發模型。有了延續,就可以將 Web 應用程序看成具有一系列請求的應用程序,能夠提供更多的用戶信息。圖 2 給出了修改后的應用程序流。在用戶啟動應用程序之后,Web 服務器處于控制之中。應用程序不再是應付以任意次序到達的任意請求,而是變成了與一個用戶進行統一且直接的交談。
圖 2. 延續支持更自然的應用程序流
與許多高階抽象相似,延續也有缺點。這些缺點將影響依賴于延續的整體方式。延續服務器必須解決下面這些常見問題:
總的來說,我相信延續代表著一種重大的技術進步,在不久的將來您可能會看到流行的延續服務器實現。現在我們來看看其他語言中的某些實現,然后我展示一些具體的細節。
其他語言中的實現
有好幾種語言都具有基于延續的方法(參見 參考資料 中的鏈接以了解關于它們的更多信息)。最常見的實現是用 Lisp、Ruby 和 Smalltalk 編寫的。
還有一些沒有在這里列出的延續服務器。目前,大多數延續服務器實現是用支持延續的語言編寫的,而這些語言不是主流語言。但是,以后的情況可能會不一樣。
Java 語言中的延續服務器
Java 開發人員正在注意到基于延續的方式對構建 Web 框架的好處,但是 Java 語言不支持本機延續。如果您的語言不支持延續,那么就只有幾種辦法了:模擬延續、將延續添加到現有的語言中或者選用另一種語言。不同的 Java 框架(參見 參考資料)采用了不同的辦法:
模擬本機延續
不一定非使用延續來捕獲執行狀態。暫停的線程和狀態機都可以捕獲執行狀態。線程化方式簡單地凍結并存儲現有的線程。這種方式有一點兒受限制,因為它不提供無狀態性能 —— 實際上是為每個用戶使用一個單獨的線程。
但是,狀態機(state machine)是不錯的延續方式。狀態機是一種定義了狀態之間的轉換的程序。到目前為止,具有延續服務器特征的最流行的 Java 框架是 Spring 的 Web Flow。Web Flow 采用狀態機形式對用戶界面頁面之間的導航進行建模。Web Flow 可以將程序流建模成 Java 對象,但是常常使用 XML 來描述程序流。請考慮清單 3 中來自 Web Flow 教程(參見 參考資料)的程序流表示:
清單 3. Web Flow 程序流表示
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE webflow PUBLIC "-//SPRING//DTD WEBFLOW//EN" "http://www.springframework.org/dtd/spring-webflow.dtd"> <webflow id="myFlow" start-state="displayForm"> <view-state id="displayForm" view="form"> <entry> <action bean="myFlowAction" method="setupForm"/> </entry> <transition on="submit" to="processSubmit"> <action bean="myFlowAction" method="bindAndValidate"/> </transition> </view-state> <action-state id="processSubmit"> <action bean="myFlowAction"/> <transition on="success" to="finish"/> </action-state> <end-state id="finish" view="success"/> </webflow>
這個流程有三個核心狀態:displayForm、processSubmit 和 finish。這個程序流定義了使機器從一個狀態轉換到下一個狀態的動作。例如,submit 將狀態從 displayForm 轉換到 processSubmit。Web Flow 在典型的模型-視圖-控制器級別上操作。可以使用許多不同的視圖技術來顯示表單。
當從一個狀態轉換到下一個狀態時,框架自動捕獲當前狀態,包括所有實例變量。這樣就可以獲得與其他延續服務器一樣的 Back 按鈕支持和有狀態編程模型。這種方式不使用本機延續,但是具有延續服務器的許多優點,還有其他一些優點:
其他語言
Cocoon 使用 Rhino,這是一種插入到 JVM 中的 JavaScript 虛擬機。Cocoon 控制器使用一個修改過的 Rhino 版本來表達延續,所以 Cocoon 允許用 Java 或 JavaScript 來表達控制器邏輯。請考慮清單 4 中來自 Cocoon 教程的應用程序(參見 參考資料):
清單 4. 使用 Cocoon
try { if (operator=="plus") cocoon.sendPage("result.html", {result: a + b}); else if (operator=="minus") cocoon.sendPage("result.html", {result: a - b}); else if (operator=="multiply") cocoon.sendPage("result.html", {result: a * b}); else if (operator=="divide") cocoon.sendPage("result.html", {result: a / b}); else cocoon.sendPage("invalidOperator.html", {operator: operator}); } catch (e) { cocoon.sendPage("error.html", {message: "Operation failed: " + e.toString()}); }
注意清單 4 中的 sendPage 方法。這個方法將一個頁面發送給用戶。這里沒有支持 Back 按鈕或者將用戶數據保存到會話中所需的冗長代碼 —— 這些都封裝在 Cocoon 的框架中了。
實現延續
RIFE 框架實現它自己的延續,而 WebWork 框架使用 RIFE 的延續實現。Jetty 6 也包含一個用 Java 編寫的延續實現。清單 5 給出了一個來自 RIFE 教程的例子,這個例子是一個猜數字游戲:
清單 5. RIFE 示例
while (mGuess !=answer) { print(template); pause(); guesses++; if (answer < mGuess) { template.setBlock("indication", "lower"); } else if (answer > mGuess).{ template.setBlock("indication", "higher"); } }
在這個例子中,pause() 方法捕獲延續并將模板發送回用戶供操作。RIFE 使延續變得很簡單,一般的 Web 開發人員也能夠使用延續。
不遠的將來
您可以看到,延續是 Web 開發框架中一項真正的技術進步。利用這種方式,可以獲得更高的生產效率。另外,因為采用直觀的 Java 代碼(而不是數百個互不相連的 servlet)來表達 Web 應用程序,應用程序更容易理解和維護。
Web 開發方面新的發展使延續方式變得越來越重要。Ajax 應用程序可以異步地獲得 Web 頁面的一小部分并將結果編織進現有的頁面中,而不是用傳統的請求/響應模型來獲得整個 Web 頁面。但是 Ajax 應用程序可能會迫使應用程序長期維持與用戶的連接,這樣應用程序才能進行響應并使狀態跟蹤代碼比較容易編寫。這種做法破壞了無狀態編程的優勢,因為需要為每個連接的用戶占用一定的資源。有了延續,就可以在延續中保存狀態并根據需要恢復狀態。
在不遠的將來,硬件的改進會使延續所增加的資源消耗變得無足輕重。如果不經過徹底的革新,Web 開發框架仍然會太復雜。Ajax 會使 Web 開發更加復雜。這些因素都會促使人們接受延續服務器。在兩年內,大多數新的 Web 開發將會使用某種延續服務器或延續的模擬。
下一次,我將談談領域特定的語言以及它們在 Ruby on Rails 中的作用。然后將介紹一些思想,向您說明在 Java 編程中領域特定的語言的影響。
Spring是一個解決了許多在J2EE開發中常見的問題的強大框架。
Spring提供了管理業務對象的一致方法,并且鼓勵了注入對接口編程而不是對類編程的良好習慣。
WebWork是由OpenSymphony組織開發的,致力于組件化和代碼重用的拉出式MVC模式J2EE Web框架。
在WebWork2.2中添加了對AJAX的支持,這個支持是構建在DWR與Dojo這兩個框架的基礎之上.
Struts是一個基于Sun J2EE平臺的MVC框架。
Struts把Servlet、JSP、自定義標簽和信息資源(message resources)整合到一個統一的框架中,開發人員利用其進行開發時不用再自己編碼實現全套MVC模式,極大的節省了時間。
Tapestry是一個開源的基于servlet的應用程序框架,它使用組件對象模型來創建動態的,交互的web應用。Tapestry使得java代碼與html完全分離,利用這個框架開發大型應用變得輕而易舉。并且開發的應用很容易維護和升級。
Tapestry支持本地化,其錯誤報告也很詳細。
Tapestry主要利用javabean和xml技術進行開發。
Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。
Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序實用,也可以在Servlet/JSP的Web應用中使用。
Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。
Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣復雜的日程序表。
Velocity是一個基于java的模板引擎。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。
當Velocity應用于web開發時,界面設計人員可以和java程序開發人員同步開發一個遵循MVC架構的web站點。
使用ibatis 提供的ORM機制,對業務邏輯實現人員而言,面對的是純粹的Java對象。
相對Hibernate等 “全自動”ORM機制而言,ibatis 以SQL開發的工作量和數據庫移植性上的讓步,為系統設計提供了更大的自由空間。
最后
為幫助那些往想互聯網方向轉行想學習,卻因為時間不夠,資源不足而放棄的人。我搜集整理了一套完整的IT學習資料,包括Java、SEO優化、Python入門書籍等等等,比自己在網上零散收集的結構性和連貫性更強,只為幫助那些想學習的人!需要的同學可私信!私信!回復“學習”
*請認真填寫需求信息,我們會在24小時內與您取得聯系。