整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          WebService是什么?他究竟和WebSocket有什么關(guān)系?

          、WebService到底是什么?

          一言以蔽之:WebService是一種跨編程語(yǔ)言和跨操作系統(tǒng)的遠(yuǎn)程調(diào)用技術(shù)。

          其以 HTTP 協(xié)議為基礎(chǔ),通過(guò) XML 進(jìn)行客戶端和服務(wù)器端通信的框架 / 組件。

          兩個(gè)關(guān)鍵點(diǎn) :

          1.服務(wù)端提供的功能 , 通過(guò) xml 描述

          2.第一步中的描述的功能 , 嵌入到 HTTP 協(xié)議中 , 使得能通過(guò) HTTP 協(xié)議進(jìn)行通信【所謂的 SOAP 】

          二、他和WebSocket 的區(qū)別是什么?

          要注意的是,有些人會(huì)和WebSocket 搞混淆。WebSocket 是HTML5支持的新特性,適用于即時(shí)通信,將以前C/S架構(gòu)上的Socket通信搬到B/S上,但是有跟Socket有差別,以往的Web即時(shí)通信通過(guò)Ajax的輪詢實(shí)現(xiàn)(很low很low),現(xiàn)在WebSocket的誕生將改變這一解決方案。

          WebService則是服務(wù)器端的技術(shù),遠(yuǎn)程訪問(wèn)數(shù)據(jù)(看上面)。

          三、為什么要用Web service,他的好處是?

          web service能解決:

          1. 跨平臺(tái)調(diào)用
          2. 跨語(yǔ)言調(diào)用
          3. 遠(yuǎn)程調(diào)用

          四、什么時(shí)候使用web Service?

          1. 同一家公司的新舊應(yīng)用之間

          2. 不同公司的應(yīng)用之間

          3. 一些提供數(shù)據(jù)的內(nèi)容聚合應(yīng)用:天氣預(yù)報(bào)、股票行情

          五、怎么開(kāi)發(fā),是從零開(kāi)始開(kāi)發(fā)web Service嗎?

          市面上挺多框架可以選擇,比如CXF(Celtix + XFire),是apache的用于開(kāi)發(fā)webservice服務(wù)器端和客戶端的框架。axis,等。

          六、WebService開(kāi)發(fā)

          WebService開(kāi)發(fā)可以分為服務(wù)器端開(kāi)發(fā)和客戶端開(kāi)發(fā)兩個(gè)方面。(這里所說(shuō)的客戶端和服務(wù)端并不是傳統(tǒng)的用戶瀏覽器就是客戶端,java開(kāi)發(fā)這方是服務(wù)端。而是我們java開(kāi)發(fā)(客戶端)調(diào)用別人寫好的的WebService(服務(wù)端),兩者都是在開(kāi)發(fā)的角度。就相當(dāng)于我們使用三大框架開(kāi)發(fā)java web是開(kāi)發(fā),絕大部分的人只是去用這三大框架的水平。人家開(kāi)發(fā)三大框架也是開(kāi)發(fā),但是能力層次上不同)。

          1、服務(wù)端開(kāi)發(fā)

          把公司內(nèi)部系統(tǒng)的業(yè)務(wù)方法發(fā)布成WebService服務(wù),供遠(yuǎn)程合作單位和個(gè)人調(diào)用。

          2、客戶端開(kāi)發(fā)

          調(diào)用別人發(fā)布的WebService服務(wù),大多數(shù)人從事的開(kāi)發(fā)都屬于這個(gè)方面,例如,調(diào)用天氣預(yù)報(bào)WebService服務(wù)。(下面會(huì)給出實(shí)例)

          3、WebService 的工作調(diào)用原理理解:

          對(duì)客戶端而言,我們給這各類WebService客戶端API傳遞wsdl文件的url地址,這些API就會(huì)創(chuàng)建出底層的代理類,我調(diào)用 這些代理,就可以訪問(wèn)到webservice服務(wù)。代理類把客戶端的方法調(diào)用變成soap格式的請(qǐng)求數(shù)據(jù)再通過(guò)HTTP協(xié)議發(fā)出去,并把接收到的soap 數(shù)據(jù)變成返回值返回。對(duì)服務(wù)端而言,各類WebService框架的本質(zhì)就是一個(gè)大大的Servlet,當(dāng)遠(yuǎn)程調(diào)用客戶端給它通過(guò)http協(xié)議發(fā)送過(guò)來(lái) soap格式的請(qǐng)求數(shù)據(jù)時(shí),它分析這個(gè)數(shù)據(jù),就知道要調(diào)用哪個(gè)java類的哪個(gè)方法,于是去查找或創(chuàng)建這個(gè)對(duì)象,并調(diào)用其方法,再把方法返回的結(jié)果包裝成 soap格式的數(shù)據(jù),通過(guò)http響應(yīng)消息回給客戶端。

          >二范式(2NF)要求數(shù)據(jù)庫(kù)表中的每個(gè)行必須可以被唯一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲(chǔ)各個(gè)實(shí)例的唯一標(biāo)識(shí)。(主鍵) 滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡(jiǎn)而言之,第三范式(3NF)要求一個(gè)數(shù)據(jù)庫(kù)表中不包含已在其它表中已包含的非主關(guān)鍵字信息。(外鍵)反三范式,有的時(shí)候?yàn)榱诵剩梢栽O(shè)置重復(fù)或者可以推導(dǎo)出的字段. 訂單(總價(jià))和訂單項(xiàng)(單價(jià))2.3.3事務(wù)四個(gè)基本特征或 ACID 特性。事務(wù)是并發(fā)控制的單位,是用戶定義的一個(gè)操作序列。這些操作要么都做,要么都不做,是一個(gè)不可分割的工作單位。一個(gè)轉(zhuǎn)賬必須 A賬號(hào)扣錢成功,B賬號(hào)加錢成功,才算正真的轉(zhuǎn)賬成功。 事務(wù)必須滿足四大特征:原子性,一致性,隔離性持久性/持續(xù)性 原子性:表示事務(wù)內(nèi)操作不可分割。要么都成功、要么都是失敗. 一致性:要么都成功、要么都是失敗.后面的失敗了要對(duì)前面的操作進(jìn)行回滾。 隔離性:一個(gè)事務(wù)開(kāi)始后,不能后其他事務(wù)干擾。 持久性/持續(xù)性:表示事務(wù)開(kāi)始了,就不能終止。2.3.4 mysql數(shù)據(jù)庫(kù)的默認(rèn)的最大連接數(shù)?100 為什么需要最大連接數(shù)?特定服務(wù)器上面的數(shù)據(jù)庫(kù)只能支持一定數(shù)目同時(shí)連接,這時(shí)候我們一般都會(huì)設(shè)置最大連接數(shù)(最多同時(shí)服務(wù)多少連接)。在數(shù)據(jù)庫(kù)安裝時(shí)都會(huì)有一個(gè)默認(rèn)的最大連接數(shù)為1002.3.5說(shuō)一下msyql的分頁(yè)?Oracle的分頁(yè)?為什么需要分頁(yè)?在很多數(shù)據(jù)是,不可能完全顯示數(shù)據(jù)。進(jìn)行分段顯示.Mysql是使用關(guān)鍵字limit來(lái)進(jìn)行分頁(yè)的 limit offset,size 表示從多少索引去多少位.Oracle的分頁(yè),大部分情況下,我們是記不住了。說(shuō)思路,要使用三層嵌套查詢。 Oracle的分頁(yè)有點(diǎn)兒記不住了,只記得一些大概。是使用了三層嵌套查詢。如果在工作中使用了,可以到原來(lái)的項(xiàng)目中拷貝或上網(wǎng)查詢。mysql: String sql = "select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize; oracle: String sql = "select * from " + (select *,rownum rid from (select * from students order by postime desc) where rid<=" + pagesize*pagenumber + ") as t" + "where t>" + pageSize*(pageNumber-1);2.3.6簡(jiǎn)單講一下數(shù)據(jù)庫(kù)的觸發(fā)器的使用場(chǎng)景?觸發(fā)器,需要有觸發(fā)條件,當(dāng)條件滿足以后做什么操作。觸發(fā)器用處還是很多的,比如校內(nèi)網(wǎng)、開(kāi)心網(wǎng)、Facebook,你發(fā)一個(gè)日志,自動(dòng)通知好友,其實(shí)就是在增加日志時(shí)做一個(gè)后觸發(fā),再向通知表中寫入條目。因?yàn)橛|發(fā)器效率高。而UCH沒(méi)有用觸發(fā)器,效率和數(shù)據(jù)處理能力都很低。每插入一個(gè)帖子,都希望將版面表中的最后發(fā)帖時(shí)間,帖子總數(shù)字段進(jìn)行同步更新,用觸發(fā)器做效率就很高。 2.3.7 簡(jiǎn)單講一下數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程的使用場(chǎng)景?數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程具有如下優(yōu)點(diǎn):1、存儲(chǔ)過(guò)程只在創(chuàng)建時(shí)進(jìn)行編譯,以后每次執(zhí)行存儲(chǔ)過(guò)程都不需再重新編譯,而一般 SQL 語(yǔ)句每執(zhí)行一次就編譯一次,因此使用存儲(chǔ)過(guò)程可以大大提高數(shù)據(jù)庫(kù)執(zhí)行速度。2、通常,復(fù)雜的業(yè)務(wù)邏輯需要多條 SQL 語(yǔ)句。這些語(yǔ)句要分別地從客戶機(jī)發(fā)送到服務(wù)器,當(dāng)客戶機(jī)和服務(wù)器之間的操作很多時(shí),將產(chǎn)生大量的網(wǎng)絡(luò)傳輸。如果將這些操作放在一個(gè)存儲(chǔ)過(guò)程中,那么客戶機(jī)和服務(wù)器之間的網(wǎng)絡(luò)傳輸就會(huì)大大減少,降低了網(wǎng)絡(luò)負(fù)載。3、存儲(chǔ)過(guò)程創(chuàng)建一次便可以重復(fù)使用,從而可以減少數(shù)據(jù)庫(kù)開(kāi)發(fā)人員的工作量。4、安全性高,存儲(chǔ)過(guò)程可以屏蔽對(duì)底層數(shù)據(jù)庫(kù)對(duì)象的直接訪問(wèn),使用 EXECUTE 權(quán)限調(diào)用存儲(chǔ)過(guò)程,無(wú)需擁有訪問(wèn)底層數(shù)據(jù)庫(kù)對(duì)象的顯式權(quán)限。正是由于存儲(chǔ)過(guò)程的上述優(yōu)點(diǎn),目前常用的數(shù)據(jù)庫(kù)都支持存儲(chǔ)過(guò)程,例如 IBM DB2,Microsoft SQL Server,Oracle,Access 等,開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng) MySQL 也在 5.0 的時(shí)候?qū)崿F(xiàn)了對(duì)存儲(chǔ)過(guò)程的支持。定義存儲(chǔ)過(guò)程: 2.3.8 用jdbc怎么調(diào)用存儲(chǔ)過(guò)程?賈璉欲執(zhí)事加載驅(qū)動(dòng)獲取連接設(shè)置參數(shù)執(zhí)行釋放連接package com.huawei.interview.lym;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.Types;public class JdbcTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Connection cn = null; CallableStatement cstmt = null; try { //這里最好不要這么干,因?yàn)轵?qū)動(dòng)名寫死在程序中了 Class.forName("com.mysql.jdbc.Driver"); //實(shí)際項(xiàng)目中,這里應(yīng)用DataSource數(shù)據(jù),如果用框架, //這個(gè)數(shù)據(jù)源不需要我們編碼創(chuàng)建,我們只需Datasource ds = context.lookup() //cn = ds.getConnection(); cn = DriverManager.getConnection("jdbc:mysql:///test","root","root"); cstmt = cn.prepareCall("{call insert_Student(?,?,?)}"); cstmt.registerOutParameter(3,Types.INTEGER); cstmt.setString(1, "wangwu"); cstmt.setInt(2, 25); cstmt.execute(); //get第幾個(gè),不同的數(shù)據(jù)庫(kù)不一樣,建議不寫 System.out.println(cstmt.getString(3)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { /*try{cstmt.close();}catch(Exception e){} try{cn.close();}catch(Exception e){}*/ try { if(cstmt != null) cstmt.close(); if(cn != null) cn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }2.3.9常用SQL略2.3.10簡(jiǎn)單說(shuō)一下你對(duì)jdbc的理解?Java database connection java數(shù)據(jù)庫(kù)連接.數(shù)據(jù)庫(kù)管理系統(tǒng)(mysql oracle等)是很多,每個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)支持的命令是不一樣的。Java只定義接口,讓數(shù)據(jù)庫(kù)廠商自己實(shí)現(xiàn)接口,對(duì)于我們者而言。只需要導(dǎo)入對(duì)應(yīng)廠商開(kāi)發(fā)的實(shí)現(xiàn)即可。然后以接口方式進(jìn)行調(diào)用.(mysql + mysql驅(qū)動(dòng)(實(shí)現(xiàn))+jdbc)2.3.11 寫一個(gè)簡(jiǎn)單的jdbc的程序。寫一個(gè)訪問(wèn)oracle數(shù)據(jù)的jdbc程序?賈璉欲執(zhí)事加載驅(qū)動(dòng)(com.mysql.jdbc.Driver,oracle.jdbc.driver.OracleDriver)獲取連接(DriverManager.getConnection(url,usernam,passord))設(shè)置參數(shù) Statement PreparedStatement cstmt.setXXX(index, value);執(zhí)行 executeQuery executeUpdate釋放連接(是否連接要從小到大,必須放到finnaly)2.3.12 JDBC中的PreparedStatement相比Statement的好處大多數(shù)我們都使用PreparedStatement代替Statement1:PreparedStatement是預(yù)編譯的,比Statement速度快 2:代碼的可讀性和可維護(hù)性雖然用PreparedStatement來(lái)代替Statement會(huì)使代碼多出幾行,但這樣的代碼無(wú)論從可讀性還是可維護(hù)性上來(lái)說(shuō).都比直接用Statement的代碼高很多檔次:stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");perstmt.setString(1,var1);perstmt.setString(2,var2);perstmt.setString(3,var3);perstmt.setString(4,var4);perstmt.executeUpdate();不用我多說(shuō),對(duì)于第一種方法,別說(shuō)其他人去讀你的代碼,就是你自己過(guò)一段時(shí)間再去讀,都會(huì)覺(jué)得傷心。 3:安全性PreparedStatement可以防止SQL注入攻擊,而Statement卻不能。比如說(shuō):String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";如果我們把[' or '1' = '1]作為varpasswd傳入進(jìn)來(lái).用戶名隨意,看看會(huì)成為什么?select * from tb_name = '隨意' and passwd = '' or '1' = '1';因?yàn)?#39;1'='1'肯定成立,所以可以任何通過(guò)驗(yàn)證,更有甚者:把[';drop table tb_name;]作為varpasswd傳入進(jìn)來(lái),則:select * from tb_name = '隨意' and passwd = '';drop table tb_name;有些數(shù)據(jù)庫(kù)是不會(huì)讓你成功的,但也有很多數(shù)據(jù)庫(kù)就可以使這些語(yǔ)句得到執(zhí)行。而如果你使用預(yù)編譯語(yǔ)句你傳入的任何內(nèi)容就不會(huì)和原來(lái)的語(yǔ)句發(fā)生任何匹配的關(guān)系,只要全使用預(yù)編譯語(yǔ)句你就用不著對(duì)傳入的數(shù)據(jù)做任何過(guò)慮。而如果使用普通的statement,有可能要對(duì)drop等做費(fèi)盡心機(jī)的判斷和過(guò)慮。2.3.13 數(shù)據(jù)庫(kù)連接池作用1、限定數(shù)據(jù)庫(kù)的個(gè)數(shù),不會(huì)導(dǎo)致由于數(shù)據(jù)庫(kù)連接過(guò)多導(dǎo)致系統(tǒng)運(yùn)行緩慢或崩潰2、數(shù)據(jù)庫(kù)連接不需要每次都去創(chuàng)建或銷毀,節(jié)約了資源3、數(shù)據(jù)庫(kù)連接不需要每次都去創(chuàng)建,響應(yīng)時(shí)間更快。2.4 前端部分2.4.1簡(jiǎn)單說(shuō)一下html,css,javascript在網(wǎng)頁(yè)開(kāi)發(fā)中的定位?HTML 超文本標(biāo)記語(yǔ)言 定義網(wǎng)頁(yè)的結(jié)構(gòu)CSS 層疊樣式表,用來(lái)美化頁(yè)面JavaScript主要用來(lái)驗(yàn)證表單,做動(dòng)態(tài)交互(其中ajax)2.4.2簡(jiǎn)單介紹一下Ajax? 什么是Ajax? 異步的javascript和xml 作用是什么?通過(guò)AJAX與服務(wù)器進(jìn)行數(shù)據(jù)交換,AJAX可以使網(wǎng)頁(yè)實(shí)現(xiàn)布局更新。 這意味著可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對(duì)網(wǎng)頁(yè)的某部分進(jìn)行更新。 怎么來(lái)實(shí)現(xiàn)Ajax XmlHttpRequest對(duì)象,使用這個(gè)對(duì)象可以異步向服務(wù)器發(fā)送請(qǐng)求,獲取獲取響應(yīng),完成局部更新。Open send responseText/responseXML 局部響應(yīng). 使用場(chǎng)景 登陸失敗時(shí)不跳轉(zhuǎn)頁(yè)面,注冊(cè)時(shí)提示用戶名是否存在,二級(jí)聯(lián)動(dòng)等等使用場(chǎng)景2.4.3 js和jQuery的關(guān)系? jQuery是一個(gè)js框架,封裝了js的屬性和方法。讓用戶使用起來(lái)更加便利。,并且增強(qiáng)了js的功能.使用原生js是要處理很多兼容性的問(wèn)題(注冊(cè)事件等),由jQuery封裝了底層,就不用處理兼容性問(wèn)題。原生的js的dom和事件綁定和Ajax等操作非常麻煩,jQuery封裝以后操作非常方便。2.4.4 jQuery的常用選擇器?ID選擇器 通過(guò)ID獲取一個(gè)元素Class選擇器 通過(guò)類(css)獲取元素標(biāo)簽選擇器 通過(guò)標(biāo)簽獲取元素通用選擇器(*) 獲取所以的元素div.myCls 獲取有myCls這個(gè)類的div層次選擇器 兒子選擇器 > 獲取下面的子元素 后代選擇器 空格 獲取下面后代,包括兒子、孫子等后代屬性選擇器 Tag[attrName='test'] 獲取有屬性名為xxxx并且屬性的值為test的所有xxx標(biāo)簽 <input type="checkbox" name="hobby"/> 吃飯<br/> <input type="checkbox" name="hobby"/> 睡覺(jué)<br/> Input[name='hobby'],表示獲取屬性名為name并且name屬性值為hobby的的所有input標(biāo)簽元素 2.4.5 jQuery的頁(yè)面加載完畢事件? 很多時(shí)候我們需要獲取元素,但是必須等到該元素被加載完成后才能獲取。我們可以把js代碼放到該元素的后面,但是這樣就會(huì)造成js在我們的body中存在不好管理。所有頁(yè)面加載完畢后所有的元素當(dāng)然已經(jīng)加載完畢。一般獲取元素做操作都要在頁(yè)面加載完畢后操作。 2.4.6 Jquery的Ajax和原生Js實(shí)現(xiàn)Ajax有什么關(guān)系?jQuery中的Ajax也是通過(guò)原生的js封裝的。封裝完成后讓我們使用起來(lái)更加便利,不用考慮底層實(shí)現(xiàn)或兼容性等處理。如果采用原生js實(shí)現(xiàn)Ajax是非常麻煩的,并且每次都是一樣的。如果我們不使用jQuery我們也要封裝Ajax對(duì)象的方法和屬性。有像jQuery這些已經(jīng)封裝完成,并經(jīng)過(guò)很多企業(yè)實(shí)際的框架,比較可靠并且開(kāi)源。我們就不需要封裝,直接使用成熟的框架(jQuery)即可.2.4.7簡(jiǎn)單說(shuō)一下html5?你對(duì)現(xiàn)在的那些新技術(shù)有了解?Html5是最新版本的html,是在原來(lái)html4的基礎(chǔ)上增強(qiáng)了一些標(biāo)簽。Html增加一些像畫板、聲音、視頻、web存儲(chǔ)等高級(jí)功能。但是html5有一個(gè)不好的地方,那就是html5太強(qiáng)調(diào)語(yǔ)義了,導(dǎo)致開(kāi)發(fā)中都不知道要選擇那個(gè)標(biāo)簽。 在做頁(yè)面布局是,無(wú)論頭部、主題、導(dǎo)航等模塊都使用div來(lái)表示,但是html5的規(guī)范,需要使用不同的標(biāo)簽來(lái)表示。(header footer等)你對(duì)現(xiàn)在的那些新技術(shù)有了解Html5 css3等2.4.8 簡(jiǎn)單說(shuō)一下css3? Css3是最新版本的css,是對(duì)原理css2的功能增強(qiáng)。 Css3中提供一些原來(lái)css2中實(shí)現(xiàn)起來(lái)比較困難或者不能實(shí)現(xiàn)的功能。 1、盒子圓角邊框 2、盒子和文字的陰影 3、漸變 4、轉(zhuǎn)換 移動(dòng)、縮放、旋轉(zhuǎn)等 5、過(guò)渡、動(dòng)畫都可以使用動(dòng)畫。 6、可以使用媒體查詢實(shí)現(xiàn)響應(yīng)式網(wǎng)站。 Css3最大缺點(diǎn)就是要根據(jù)不同的瀏覽器處理兼容性。對(duì)應(yīng)有一些處理兼容性的工具。不用擔(dān)心.2.4.9 bootstrap是什么?BootStrap是一個(gè)移動(dòng)設(shè)備優(yōu)先的UI框架。我們可以不用謝任何css,js代碼就能實(shí)現(xiàn)比較漂亮的有交互性的頁(yè)面。我們程序員對(duì)頁(yè)面的編寫是有硬傷的,所有要自己寫頁(yè)面的話就要使用類似于bootstrap這樣的UI框架。平時(shí)用得很多的:1、 模態(tài)框2、 表單,表單項(xiàng)3、 布局4、 刪格系統(tǒng)2.5 框架部分2.5.1什么是框架? 框架(Framework)是一個(gè)框子——指其約束性,也是一個(gè)架子——指其支撐性。 IT語(yǔ)境中的框架,特指為解決一個(gè)開(kāi)放性問(wèn)題而設(shè)計(jì)的具有一定約束性的支撐結(jié)構(gòu)。在此結(jié)構(gòu)上可以根據(jù)具體問(wèn)題擴(kuò)展、安插更多的組成部分,從而更迅速和方便地構(gòu)建完整的解決問(wèn)題的方案。1)框架本身一般不完整到可以解決特定問(wèn)題,但是可以幫助您快速解決特定問(wèn)題; 沒(méi)有框架所有的工作都從零開(kāi)始做,有了框架,為我們提供了一定的功能,我們就可以在框 架的基礎(chǔ)上開(kāi)發(fā),極大的解放了生產(chǎn)力。不同的框架,是為了解決不同領(lǐng)域的問(wèn)題。一定要為了解決問(wèn)題才去學(xué)習(xí)框架。2)框架天生就是為擴(kuò)展而設(shè)計(jì)的;3)框架里面可以為后續(xù)擴(kuò)展的組件提供很多輔助性、支撐性的方便易用的實(shí)用工具(utilities),也就是說(shuō)框架時(shí)常配套了一些幫助解決某類問(wèn)題的庫(kù)(libraries)或工具(tools)。 java中就是一系列的jar包,其本質(zhì)就是對(duì)jdk功能的擴(kuò)展.2.5.2 MVC模式 MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設(shè)計(jì)典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí),不需要重新編寫業(yè)務(wù)邏輯。最簡(jiǎn)單的、最經(jīng)典就是Jsp(view) +Servlet(controller) + JavaBean(model)1、 當(dāng)控制器收到來(lái)自用戶的請(qǐng)求2、 控制器調(diào)用JavaBean完成業(yè)務(wù)3、 完成業(yè)務(wù)后通過(guò)控制器跳轉(zhuǎn)JSP頁(yè)面的方式給用戶反饋信息4、 Jsp個(gè) 用戶做出響應(yīng)。 控制器都是核心2.5.3 MVC框架什么是MVC框架? 是為了解決傳統(tǒng)MVC模式(Jsp + Servlet + JavaBean)的一些問(wèn)題而出現(xiàn)的框架。傳統(tǒng)MVC模式問(wèn)題1、 所有的Servlet和Servlet映射都要配置在web.xml中,如果項(xiàng)目太大,web.xml就太龐大,并且不能實(shí)現(xiàn)模塊化管理。2、 Servlet的主要功能就是接受參數(shù)、調(diào)用邏輯、跳轉(zhuǎn)頁(yè)面,比如像其他字符編碼、文件上傳等功能也要寫在Servlet中,不能讓Servlet主要功能而需要做處理一下特例。3、接受參數(shù)比較麻煩(String name = request.getParameter("name"),User user=new User user.setName(name)),不能通過(guò)model接收,只能單個(gè)接收,接收完成后轉(zhuǎn)換封裝model.4、跳轉(zhuǎn)頁(yè)面方式比較單一(forword,redirect),并且當(dāng)我的頁(yè)面名稱發(fā)生改變時(shí)需要修改Servlet源代碼.現(xiàn)在比較常用的MVC框架有: struts webwork Struts2 Spring MVC2.5.4 簡(jiǎn)單講一下struts2的執(zhí)行流程?Struts2的原理?一個(gè)請(qǐng)求在Struts2框架中的處理大概分為以下幾個(gè)步驟:1、客戶端瀏覽器發(fā)送請(qǐng)求2、這個(gè)請(qǐng)求經(jīng)過(guò)一系列的過(guò)濾器(Filter)(這些過(guò)濾器中有一個(gè)叫做ActionContextCleanUp的可選過(guò)濾器,這個(gè)過(guò)濾器對(duì)于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin);3、接著FilterDispatcher(StrutsPrepareAndExecuteFilter)被調(diào)用,F(xiàn)ilterDispatcher(StrutsPrepareAndExecuteFilter)詢問(wèn)ActionMapper來(lái)決定這個(gè)請(qǐng)求是否需要調(diào)用某個(gè)Action;4、 如果ActionMapper決定需要調(diào)用某個(gè)Action,F(xiàn)ilterDispatcher (StrutsPrepareAndExecuteFilter)把請(qǐng)求的處理交給ActionProxy;5、ActionProxy通過(guò)Configuration Manager詢問(wèn)框架的配置文件,找到需要調(diào)用的Action類;6、ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例。7、ActionInvocation實(shí)例使用命名模式來(lái)調(diào)用,在調(diào)用Action的過(guò)程前后,涉及到相關(guān)攔截器(Intercepter)的調(diào)用。8、一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是,也可能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版。在表示的過(guò)程中可以使用Struts2框架中繼承的標(biāo)簽。在這個(gè)過(guò)程中需要涉及到ActionMapper。面試:1、 瀏覽器發(fā)送請(qǐng)求,經(jīng)過(guò)一系列的過(guò)濾器后,到達(dá)核心過(guò)濾器(StrutsPrepareAndExecuteFilter).2、 StrutsPrepareAndExecuteFilter通過(guò)ActionMapper判斷當(dāng)前的請(qǐng)求是否需要某個(gè)Action處理,如果不需要,則走原來(lái)的流程。如果需要?jiǎng)t把請(qǐng)求交給ActionProxy來(lái)處理3、 ActionProxy通過(guò)Configuration Manager詢問(wèn)框架的配置文件(Struts.xml),找到需要調(diào)用的Action類;4、 創(chuàng)建一個(gè)ActionInvocation實(shí)例,來(lái)調(diào)用Action的對(duì)應(yīng)方法來(lái)獲取結(jié)果集的name,在調(diào)用前后會(huì)執(zhí)行相關(guān)攔截器。5、 通過(guò)結(jié)果集的Name知道對(duì)應(yīng)的結(jié)果集來(lái)對(duì)瀏覽器進(jìn)行響應(yīng)。攔截、判斷、尋找、執(zhí)行、響應(yīng)2.5.5 Struts2中的攔截器,你都用它干什么? java里的攔截器是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象。它提供了一種機(jī)制可以使開(kāi)發(fā)者可以定義在一個(gè)action執(zhí)行的前后執(zhí)行的代碼,也可以在一個(gè)action執(zhí)行前阻止其執(zhí)行,同時(shí)也提供了一種可以提取action中可重用部分的方式。 在AOP(Aspect-Oriented Programming)中攔截器用于在某個(gè)方法或字段被訪問(wèn)之前,進(jìn)行攔截然后在之前或之后加入某些操作。面試: struts2中的的功能(參數(shù)處理、文件上傳、字符編碼等)都是通過(guò)系統(tǒng)攔截器實(shí)現(xiàn)的。如果業(yè)務(wù)需要,當(dāng)然我們也可以自定義攔截器,進(jìn)行可插拔配置,在執(zhí)行Action的方法前后、加入相關(guān)邏輯完成業(yè)務(wù)。使用場(chǎng)景:1、 用戶登錄判斷,在執(zhí)行Action的前面判斷是否已經(jīng)登錄,如果沒(méi)有登錄的跳轉(zhuǎn)到登錄頁(yè)面。2、 用戶權(quán)限判斷,在執(zhí)行Action的前面判斷是否具有,如果沒(méi)有權(quán)限就給出提示信息。3、 操作日志...... 4、......2.5.6 簡(jiǎn)單講一下SpringMVC的執(zhí)行流程?  1. 用戶向服務(wù)器發(fā)送請(qǐng)求,請(qǐng)求被Spring 前端控制Servelt DispatcherServlet捕獲;  2. DispatcherServlet對(duì)請(qǐng)求URL進(jìn)行解析,得到請(qǐng)求資源標(biāo)識(shí)符(URI)。然后根據(jù)該URI,調(diào)用HandlerMapping獲得該Handler配置的所有相關(guān)的對(duì)象(包括Handler對(duì)象以及Handler對(duì)象對(duì)應(yīng)的攔截器),最后以HandlerExecutionChain對(duì)象的形式返回; 3. DispatcherServlet 根據(jù)獲得的Handler,選擇一個(gè)合適的HandlerAdapter。(附注:如果成功獲得HandlerAdapter后,此時(shí)將開(kāi)始執(zhí)行攔截器的preHandler(...)方法)   4.  提取Request中的模型數(shù)據(jù),填充Handler入?yún)ⅲ_(kāi)始執(zhí)行Handler(Controller)。 在填充Handler的入?yún)⑦^(guò)程中,根據(jù)你的配置,Spring將幫你做一些額外的工作:      HttpMessageConveter: 將請(qǐng)求消息(如Json、xml等數(shù)據(jù))轉(zhuǎn)換成一個(gè)對(duì)象,將對(duì)象轉(zhuǎn)換為指定的響應(yīng)信息      數(shù)據(jù)轉(zhuǎn)換:對(duì)請(qǐng)求消息進(jìn)行數(shù)據(jù)轉(zhuǎn)換。如String轉(zhuǎn)換成Integer、Double等      數(shù)據(jù)根式化:對(duì)請(qǐng)求消息進(jìn)行數(shù)據(jù)格式化。 如將字符串轉(zhuǎn)換成格式化數(shù)字或格式化日期等      數(shù)據(jù)驗(yàn)證: 驗(yàn)證數(shù)據(jù)的有效性(長(zhǎng)度、格式等),驗(yàn)證結(jié)果存儲(chǔ)到BindingResult或Error中      5.  Handler執(zhí)行完成后,向DispatcherServlet 返回一個(gè)ModelAndView對(duì)象;      6.  根據(jù)返回的ModelAndView,選擇一個(gè)適合的ViewResolver(必須是已經(jīng)注冊(cè)到Spring容器中的ViewResolver)返回給DispatcherServlet ;      7. ViewResolver 結(jié)合Model和View,來(lái)渲染視圖      8. 將渲染結(jié)果返回給客戶端。面試:1、 用戶向服務(wù)器發(fā)送請(qǐng)求,請(qǐng)求被Spring 前端控制Servelt DispatcherServlet捕獲(捕獲)2、 DispatcherServlet對(duì)請(qǐng)求URL進(jìn)行解析,得到請(qǐng)求資源標(biāo)識(shí)符(URI)。然后根據(jù)該URI,調(diào)用HandlerMapping獲得該Handler配置的所有相關(guān)的對(duì)象(包括Handler對(duì)象以及Handler對(duì)象對(duì)應(yīng)的攔截器),最后以HandlerExecutionChain對(duì)象的形式返回;(查找handler)3、 DispatcherServlet 根據(jù)獲得的Handler,選擇一個(gè)合適的HandlerAdapter。 提取Request中的模型數(shù)據(jù),填充Handler入?yún)ⅲ_(kāi)始執(zhí)行Handler(Controller), Handler執(zhí)行完成后,向DispatcherServlet 返回一個(gè)ModelAndView對(duì)象(執(zhí)行handler)4、DispatcherServlet 根據(jù)返回的ModelAndView,選擇一個(gè)適合的ViewResolver(必須是已經(jīng)注冊(cè)到Spring容器中的ViewResolver) (選擇ViewResolver)5、通過(guò)ViewResolver 結(jié)合Model和View,來(lái)渲染視圖,DispatcherServlet 將渲染結(jié)果返回給客戶端。(渲染返回)快速記憶技巧:核心控制器捕獲請(qǐng)求、查找Handler、執(zhí)行Handler、選擇ViewResolver,通過(guò)ViewResolver渲染視圖并返回2.5.7 說(shuō)一下struts2和springMVC有什么不同?目前企業(yè)中使用SpringMvc的比例已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)Struts2,那么兩者到底有什么區(qū)別,是很多初學(xué)者比較關(guān)注的問(wèn)題,下面我們就來(lái)對(duì)SpringMvc和Struts2進(jìn)行各方面的比較:1. 核 心控制器(前端控制器、預(yù)處理控制器):對(duì)于使用過(guò)mvc框架的人來(lái)說(shuō)這個(gè)詞應(yīng)該不會(huì)陌生,核心控制器的主要用途是處理所有的請(qǐng)求,然后對(duì)那些特殊的請(qǐng)求 (控制器)統(tǒng)一的進(jìn)行處理(字符編碼、文件上傳、參數(shù)接受、異常處理等等),spring mvc核心控制器是Servlet,而Struts2是Filter。2.控制器實(shí)例:Spring Mvc會(huì)比Struts快一些(理論上)。Spring Mvc是基于方法設(shè)計(jì),而Sturts是基于對(duì)象,每次發(fā)一次請(qǐng)求都會(huì)實(shí)例一個(gè)action,每個(gè)action都會(huì)被注入 屬性,而Spring更像Servlet一樣,只有一個(gè)實(shí)例,每次請(qǐng)求執(zhí)行對(duì)應(yīng)的方法即可(注意:由于是單例實(shí)例,所以應(yīng)當(dāng)避免全局變量的修改,這樣會(huì)產(chǎn)生線程安全問(wèn)題)。3. 管理方式:大部分的公司的核心架構(gòu)中,就會(huì)使用到spring,而spring mvc又是spring中的一個(gè)模塊,所以spring對(duì)于spring mvc的控制器管理更加簡(jiǎn)單方便,而且提供了全 注解方式進(jìn)行管理,各種功能的注解都比較全面,使用簡(jiǎn)單,而struts2需要采用XML很多的配置參數(shù)來(lái)管理(雖然也可以采用注解,但是幾乎沒(méi)有公司那 樣使用)。4.參數(shù)傳遞:Struts2中自身提供多種參數(shù)接受,其實(shí)都是通過(guò)(ValueStack)進(jìn)行傳遞和賦值,而SpringMvc是通過(guò)方法的參數(shù)進(jìn)行接收。5.學(xué)習(xí)難度:Struts更加很多新的技術(shù)點(diǎn),比如攔截器、值棧及OGNL表達(dá)式,學(xué)習(xí)成本較高,springmvc 比較簡(jiǎn)單,很較少的時(shí)間都能上手。6.intercepter 的實(shí)現(xiàn)機(jī)制:struts有以自己的interceptor機(jī)制,spring mvc用的是獨(dú)立的AOP方式。這樣導(dǎo)致struts的配置文件量還是比spring mvc大,雖然struts的配置能繼承,所以我覺(jué)得論使用上來(lái)講,spring mvc使用更加簡(jiǎn)潔,開(kāi)發(fā)效率Spring MVC確實(shí)比struts2高。spring mvc是方法級(jí)別的攔截,一個(gè)方法對(duì)應(yīng)一個(gè)request上下文,而方法同時(shí)又跟一個(gè)url對(duì)應(yīng),所以說(shuō)從架構(gòu)本身上spring3 mvc就容易實(shí)現(xiàn)restful url。struts2是類級(jí)別的攔截,一個(gè)類對(duì)應(yīng)一個(gè)request上下文;實(shí)現(xiàn)restful url要費(fèi)勁,因?yàn)閟truts2 action的一個(gè)方法可以對(duì)應(yīng)一個(gè)url;而其類屬性卻被所有方法共享,這也就無(wú)法用注解或其他方式標(biāo)識(shí)其所屬方法了。spring3 mvc的方法之間基本上獨(dú)立的,獨(dú)享request response數(shù)據(jù),請(qǐng)求數(shù)據(jù)通過(guò)參數(shù)獲取,處理結(jié)果通過(guò)ModelMap交回給框架方法之間不共享變量,而struts2搞的就比較亂,雖然方法之間 也是獨(dú)立的,但其所有Action變量是共享的,這不會(huì)影響程序運(yùn)行,卻給我們編碼,讀程序時(shí)帶來(lái)麻煩。7. spring mvc處理ajax請(qǐng)求,直接通過(guò)返回?cái)?shù)據(jù),方法中使用注解@ResponseBody,spring mvc自動(dòng)幫我們對(duì)象轉(zhuǎn)換為JSON數(shù)據(jù)。而struts2是通過(guò)插件的方式進(jìn)行處理在SpringMVC流行起來(lái)之前,Struts2在MVC框架中占核心地位,隨著SpringMVC的出現(xiàn),SpringMVC慢慢的取代struts2,但是很多企業(yè)都是原來(lái)搭建的框架,使用Struts2較多。2.5.8 說(shuō)一下Spring中的兩大核心?Spring是什么?spring是J2EE應(yīng)用程序框架,是輕量級(jí)的IoC和AOP的容器框架(相對(duì)于重量級(jí)的EJB),主要是針對(duì)javaBean的生命周期進(jìn)行管理的輕量級(jí)容器,可以單獨(dú)使用,也可以和Struts框架,ibatis框架等組合使用。1、 IOC(Inversion of Control )或DI(Dependency Injection) IOC控制權(quán)反轉(zhuǎn) 原來(lái):我的Service需要調(diào)用DAO,Service就需要?jiǎng)?chuàng)建DAO Spring:Spring發(fā)現(xiàn)你Service依賴于dao,就給你注入. 核心原理:就是配置文件+反射(工廠也可以)+容器(map) 2、 AOP:面向切面編程 核心原理:使用動(dòng)態(tài)代理的設(shè)計(jì)模式在執(zhí)行方法前后或出現(xiàn)異常做加入相關(guān)邏輯。 我們主要使用AOP來(lái)做: 1、事務(wù)處理 2、權(quán)限判斷 3、日志 4、.... 2.5.9 AOP是什么?你都拿它做什么? 3、 AOP:面向切面編程 核心原理:使用動(dòng)態(tài)代理的設(shè)計(jì)模式在執(zhí)行方法前后或出現(xiàn)異常做加入相關(guān)邏輯。 我們主要使用AOP來(lái)做: 1、事務(wù)處理 執(zhí)行方法前,開(kāi)啟事務(wù)、執(zhí)行完成后關(guān)閉事務(wù)、出現(xiàn)異常后回滾事務(wù) 2、權(quán)限判斷 在執(zhí)行方法前,判斷是否具有權(quán)限 3、日志 在執(zhí)行前進(jìn)行日志處理 4、....2.5.10講一下Spring的事務(wù)傳播特性多個(gè)事務(wù)存在是怎么處理的策略1. PROPAGATION_REQUIRED: 如果存在一個(gè)事務(wù),則支持當(dāng)前事務(wù)。如果沒(méi)有事務(wù)則開(kāi)啟2. PROPAGATION_SUPPORTS: 如果存在一個(gè)事務(wù),支持當(dāng)前事務(wù)。如果沒(méi)有事務(wù),則非事務(wù)的執(zhí)行3. PROPAGATION_MANDATORY: 如果已經(jīng)存在一個(gè)事務(wù),支持當(dāng)前事務(wù)。如果沒(méi)有一個(gè)活動(dòng)的事務(wù),則拋出異常。4. PROPAGATION_REQUIRES_NEW: 總是開(kāi)啟一個(gè)新的事務(wù)。如果一個(gè)事務(wù)已經(jīng)存在,則將這個(gè)存在的事務(wù)掛起。5. PROPAGATION_NOT_SUPPORTED: 總是非事務(wù)地執(zhí)行,并掛起任何存在的事務(wù)。6. PROPAGATION_NEVER: 總是非事務(wù)地執(zhí)行,如果存在一個(gè)活動(dòng)事務(wù),則拋出異常7. PROPAGATION_NESTED:如果一個(gè)活動(dòng)的事務(wù)存在,則運(yùn)行在一個(gè)嵌套的事務(wù)中. 如果沒(méi)有活動(dòng)事務(wù), 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執(zhí)行PropagationRequired 需要 如果存在一個(gè)事務(wù),則支持當(dāng)前事務(wù)。如果沒(méi)有事務(wù)則開(kāi)啟Supports 支持 如果存在一個(gè)事務(wù),支持當(dāng)前事務(wù)。如果沒(méi)有事務(wù),則非事務(wù)的執(zhí)行Mandatory 必要的 如果已經(jīng)存在一個(gè)事務(wù),支持當(dāng)前事務(wù)。如果沒(méi)有一個(gè)活動(dòng)的事務(wù),則拋出異常。required_new 總是開(kāi)啟一個(gè)新的事務(wù)。如果一個(gè)事務(wù)已經(jīng)存在,則將這個(gè)存在的事務(wù)掛起。Not_support 總是非事務(wù)地執(zhí)行,并掛起任何存在的事務(wù)。Never 絕不 總是非事務(wù)地執(zhí)行,如果存在一個(gè)活動(dòng)事務(wù),則拋出異常Nested 嵌套的 如果有就嵌套、沒(méi)有就開(kāi)啟事務(wù)2.5.11 Spring事務(wù)的隔離級(jí)別1. ISOLATION_DEFAULT: 這是一個(gè)PlatfromTransactionManager默認(rèn)的隔離級(jí)別,使用數(shù)據(jù)庫(kù)默認(rèn)的事務(wù)隔離級(jí)別.另外四個(gè)與JDBC的隔離級(jí)別相對(duì)應(yīng)2. ISOLATION_READ_UNCOMMITTED: 這是事務(wù)最低的隔離級(jí)別,它充許令外一個(gè)事務(wù)可以看到這個(gè)事務(wù)未提交的數(shù)據(jù)。      這種隔離級(jí)別會(huì)產(chǎn)生臟讀,不可重復(fù)讀和幻像讀。3. ISOLATION_READ_COMMITTED: 保證一個(gè)事務(wù)修改的數(shù)據(jù)提交后才能被另外一個(gè)事務(wù)讀取。另外一個(gè)事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)4. ISOLATION_REPEATABLE_READ: 這種事務(wù)隔離級(jí)別可以防止臟讀,不可重復(fù)讀。但是可能出現(xiàn)幻像讀。      它除了保證一個(gè)事務(wù)不能讀取另一個(gè)事務(wù)未提交的數(shù)據(jù)外,還保證了避免下面的情況產(chǎn)生(不可重復(fù)讀)。5. ISOLATION_SERIALIZABLE 這是花費(fèi)最高代價(jià)但是最可靠的事務(wù)隔離級(jí)別。事務(wù)被處理為順序執(zhí)行。除了防止臟讀,不可重復(fù)讀外,還避免了幻像讀。其中的一些概念的說(shuō)明:  臟讀: 指當(dāng)一個(gè)事務(wù)正在訪問(wèn)數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒(méi)有提交到數(shù)據(jù)庫(kù)中,這時(shí),另外一個(gè)事務(wù)也訪問(wèn)這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。因?yàn)檫@個(gè)數(shù)據(jù)是還沒(méi)有提交的數(shù)據(jù), 那么另外一 個(gè)事務(wù)讀到的這個(gè)數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的。不可重復(fù)讀: 指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒(méi)有結(jié)束時(shí),另外一個(gè)事務(wù)也訪問(wèn)該同一數(shù)據(jù)。 那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改,那么第一個(gè)事務(wù)兩次讀到的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。 幻覺(jué)讀: 指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及 到表中的全部數(shù)據(jù)行。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒(méi)有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺(jué)一樣。2.5.12 什么是ORM? 對(duì)象關(guān)系映射(Object Relational Mapping,簡(jiǎn)稱ORM)模式是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)存在的互不匹配的現(xiàn)象的技術(shù)。簡(jiǎn)單的說(shuō),ORM是通過(guò)使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中。那么,到底如何實(shí)現(xiàn)持久化呢?一種簡(jiǎn)單的方案是采用硬編碼方式(jdbc操作sql方式),為每一種可能的數(shù)據(jù)庫(kù)訪問(wèn)操作提供單獨(dú)的方法。這種方案存在以下不足: 1.持久化層缺乏彈性。一旦出現(xiàn)業(yè)務(wù)需求的變更,就必須修改持久化層的接口 2.持久化層同時(shí)與域模型與關(guān)系數(shù)據(jù)庫(kù)模型綁定,不管域模型還是關(guān)系數(shù)據(jù)庫(kù)模型發(fā)生變化,都要修改持久化曾的相關(guān)程序代碼,增加了軟件的維護(hù)難度。 ORM提供了實(shí)現(xiàn)持久化層的另一種模式,它采用映射元數(shù)據(jù)來(lái)描述對(duì)象關(guān)系的映射,使得ORM中間件能在任何一個(gè)應(yīng)用的業(yè)務(wù)邏輯層和數(shù)據(jù)庫(kù)層之間充當(dāng)橋梁。Java典型的ORM框架有:Hibernate,ibatis(mybatis),speedframework。 ORM的方法論基于三個(gè)核心原則:    簡(jiǎn)單:以最基本的形式建模數(shù)據(jù)。    傳達(dá)性:數(shù)據(jù)庫(kù)結(jié)構(gòu)被任何人都能理解的語(yǔ)言文檔化。    精確性:基于數(shù)據(jù)模型創(chuàng)建正確標(biāo)準(zhǔn)化了的結(jié)構(gòu)。 對(duì)象關(guān)系映射(Object Relational Mapping,簡(jiǎn)稱ORM)模式是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)存在的互不匹配的現(xiàn)象的技術(shù)。可以簡(jiǎn)單的方案是采用硬編碼方式(jdbc操作sql方式),為每一種可能的數(shù)據(jù)庫(kù)訪問(wèn)操作提供單獨(dú)的方法。這種方法存在很多缺陷,使用使用ORM框架(為了解決解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)存在的互不匹配的現(xiàn)象的框架)來(lái)解決. Hibernate,ibatis(mybatis),2.5.13 iBatis(mybatis)與Hibernate有什么不同?相同點(diǎn): 都是java中orm框架、屏蔽jdbc api的底層訪問(wèn)細(xì)節(jié),使用我們不用與jdbc api打交道,就可以完成對(duì)數(shù)據(jù)庫(kù)的持久化操作。jdbc api編程流程固定,還將sql語(yǔ)句與java代碼混雜在了一起,經(jīng)常需要拼湊sql語(yǔ)句,細(xì)節(jié)很繁瑣。 ibatis的好處:屏蔽jdbc api的底層訪問(wèn)細(xì)節(jié);將sql語(yǔ)句與java代碼進(jìn)行分離;提供了將結(jié)果集自動(dòng)封裝稱為實(shí)體對(duì)象和對(duì)象的集合的功能.queryForList返回對(duì)象集合,用queryForObject返回單個(gè)對(duì)象;提供了自動(dòng)將實(shí)體對(duì)象的屬性傳遞給sql語(yǔ)句的參數(shù)。 Hibername的好處:Hibernate是一個(gè)全自動(dòng)的orm映射工具,它可以自動(dòng)生成sql語(yǔ)句,并執(zhí)行并返回java結(jié)果。不同點(diǎn): 1、hibernate要比ibatis功能強(qiáng)大很多。因?yàn)閔ibernate自動(dòng)生成sql語(yǔ)句。 2、ibatis需要我們自己在xml配置文件中寫sql語(yǔ)句,hibernate我們無(wú)法直接控制該語(yǔ)句,我們就無(wú)法去寫特定的高效率的sql。對(duì)于一些不太復(fù)雜的sql查詢,hibernate可以很好幫我們完成,但是,對(duì)于特別復(fù)雜的查詢,hibernate就很難適應(yīng)了,這時(shí)候用ibatis就是不錯(cuò)的選擇,因?yàn)閕batis還是由我們自己寫sql語(yǔ)句。 ibatis可以出來(lái)復(fù)雜語(yǔ)句,而hibernate不能。 3、ibatis要比hibernate簡(jiǎn)單的多。ibatis是面向sql的,不同考慮對(duì)象間一些復(fù)雜的映射關(guān)系。2.5.14 Hibernate映射對(duì)象的狀態(tài)臨時(shí)狀態(tài)/瞬時(shí)狀態(tài)(transient):剛剛用new語(yǔ)句創(chuàng)建,沒(méi)有被持久化 不處于session中(沒(méi)有使用session的方法去操作臨時(shí)對(duì)象)。該對(duì)象成為臨時(shí)對(duì)象持久化狀態(tài)/托管狀態(tài)(persistent):已經(jīng)被持久化,加入到session的緩存中。session是沒(méi)有關(guān)閉該狀態(tài)的對(duì)象為持久化對(duì)象。游離狀態(tài)/脫管狀態(tài)(detached):已經(jīng)被持久化,但不處于session中。 該狀態(tài)的對(duì)象為游離對(duì)象。刪除狀態(tài)(removed):對(duì)象有關(guān)聯(lián)的ID,并且在Session管理下,但是已經(jīng)被計(jì)劃(事務(wù)提交的時(shí)候,commit())刪除。如果沒(méi)有事務(wù)就不能刪除相互轉(zhuǎn)換2.5.15 介紹一下Hibernate的緩存?一、why(為什么要用Hibernate緩存?)Hibernate是一個(gè)持久層框架,經(jīng)常訪問(wèn)物理數(shù)據(jù)庫(kù)。為了降低應(yīng)用程序?qū)ξ锢頂?shù)據(jù)源訪問(wèn)的頻次,從而提高應(yīng)用程序的運(yùn)行性能。緩存內(nèi)的數(shù)據(jù)是對(duì)物理數(shù)據(jù)源中的數(shù)據(jù)的復(fù)制,應(yīng)用程序在運(yùn)行時(shí)從緩存讀寫數(shù)據(jù),在特定的時(shí)刻或事件會(huì)同步緩存和物理數(shù)據(jù)源的數(shù)據(jù)。為了提供訪問(wèn)速度,把磁盤或數(shù)據(jù)庫(kù)訪問(wèn)變成內(nèi)存訪問(wèn)。 二、what(Hibernate緩存原理是怎樣的?)Hibernate緩存包括兩大類:Hibernate一級(jí)緩存和Hibernate二級(jí)緩存。1.Hibernate一級(jí)緩存又稱為"Session的緩存"。Session緩存內(nèi)置不能被卸載,Session的緩存是事務(wù)范圍的緩存(Session對(duì)象的生命周期通常對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)事務(wù)或者一個(gè)應(yīng)用事務(wù))。一級(jí)緩存中,持久化類的每個(gè)實(shí)例都具有唯一的OID。2.Hibernate二級(jí)緩存又稱為"SessionFactory的緩存"。由于SessionFactory對(duì)象的生命周期和應(yīng)用程序的整個(gè)過(guò)程對(duì)應(yīng),因此Hibernate二級(jí)緩存是進(jìn)程范圍或者集群范圍的緩存,有可能出現(xiàn)并發(fā)問(wèn)題,因此需要采用適當(dāng)?shù)牟l(fā)訪問(wèn)策略,該策略為被緩存的數(shù)據(jù)提供了事務(wù)隔離級(jí)別。第二級(jí)緩存是可選的,是一個(gè)可配置的插件,默認(rèn)下SessionFactory不會(huì)啟用這個(gè)插件。Hibernate提供了org.hibernate.cache.CacheProvider接口,它充當(dāng)緩存插件與Hibernate之間的適配器。面試: Hibernate中的緩存分一級(jí)緩存和二級(jí)緩存。 一級(jí)緩存就是Session級(jí)別的緩存,在事務(wù)范圍內(nèi)有效是,內(nèi)置的不能被卸載。二級(jí)緩存是SesionFactory級(jí)別的緩存,從應(yīng)用啟動(dòng)到應(yīng)用結(jié)束有效。是可選的,默認(rèn)沒(méi)有二級(jí)緩存,需要手動(dòng)開(kāi)啟。 保存數(shù)據(jù)庫(kù)后,在內(nèi)存中保存一份,如果更新了數(shù)據(jù)庫(kù)就要同步更新。 什么樣的數(shù)據(jù)適合存放到第二級(jí)緩存中?   1) 很少被修改的數(shù)據(jù)  帖子的最后回復(fù)時(shí)間 2) 經(jīng)常被查詢的數(shù)據(jù) 電商的地點(diǎn)2) 不是很重要的數(shù)據(jù),允許出現(xiàn)偶爾并發(fā)的數(shù)據(jù)   3) 不會(huì)被并發(fā)訪問(wèn)的數(shù)據(jù)   4) 常量數(shù)據(jù) 擴(kuò)展:hibernate的二級(jí)緩存默認(rèn)是不支持分布式緩存的。使用memcahe,redis等中央緩存來(lái)代替二級(jí)緩存。    2.5.16 簡(jiǎn)單講一下webservice使用的場(chǎng)景?webservice是一個(gè)SOA(面向服務(wù)的編程)的架構(gòu),它是不依賴于語(yǔ)言,不依賴于平臺(tái),可以實(shí)現(xiàn)不同的語(yǔ)言間的相互調(diào)用,通過(guò)Internet進(jìn)行基于Http協(xié)議的網(wǎng)絡(luò)應(yīng)用間的交互。1、 異構(gòu)系統(tǒng)(不同語(yǔ)言)的整合2、 不同客戶端的整合 瀏覽器、手機(jī)端(android,ios.塞班)、微信單、PC端等終端來(lái)訪問(wèn)3、 實(shí)實(shí)在在的列子: 天氣預(yù)報(bào):可以通過(guò)實(shí)現(xiàn)webservice客戶端調(diào)用遠(yuǎn)程天氣服務(wù)實(shí)現(xiàn)的。 單點(diǎn)登錄:一個(gè)服務(wù)是所有系統(tǒng)的登錄2.5.17 簡(jiǎn)單介紹一下activiti? Activiti是一個(gè)業(yè)務(wù)流程管理(BPM)和工作流系統(tǒng),適用于開(kāi)發(fā)人員和系統(tǒng)管理員。其核心是超快速,穩(wěn)定的BPMN2流程引擎。它易于與 Spring集成使用。主要要在OA中,把線下流程放到線上。 把現(xiàn)實(shí)生活中一些流程固話定義到系統(tǒng)中,然后通過(guò)輸入表單數(shù)據(jù)完成業(yè)務(wù)。他可用在OA系統(tǒng)的流程管理中:請(qǐng)假流程 小于三天,一級(jí)主管審批,大于三天二級(jí)才能審批。報(bào)銷流程 1000 2000 3000>....如果你想找專門這方面的工作,要下去復(fù)習(xí)。2.6 高級(jí)部分2.6.1 有沒(méi)有用過(guò)linux?你都用它來(lái)做什么?Linux是一個(gè)長(zhǎng)時(shí)間運(yùn)行比較穩(wěn)定的操作系統(tǒng),所有我們一般會(huì)拿它作為服務(wù)器(web,db,app等)。Linux本身具有C的編譯環(huán)境、我們的一些軟件是沒(méi)有軟件包(redis、nginx等)的,需要在Linux的C編譯環(huán)境編譯得到軟件包.2.6.2 說(shuō)一下linux下面的一下常用命令?常用:Pwd 獲取當(dāng)前路徑Cd 跳轉(zhuǎn)到目錄Su -u 切換到管理員Ls ls 列舉目錄文件操作命令:文件 tail 查看 rm -rf vi文件夾 mkdir rm -r2.6.3 你是使用什么來(lái)連接遠(yuǎn)程的Linux服務(wù)器的?需要依賴于Linux服務(wù)器安裝ssh服務(wù)端,一般這個(gè)ssh服務(wù)的端口22.需要依賴于Linux服務(wù)器安裝sftp服務(wù)端,一般這個(gè)sftp服務(wù)的端口25.使用ssh客戶端連接linux服務(wù)器,就有點(diǎn)兒像windows下面的遠(yuǎn)程連接。但是linux通過(guò)ssh連接上以后是沒(méi)有圖形界面,全是命令行。PuttyXshell使用sftp客戶端來(lái)連接sftp服務(wù)端,來(lái)上傳和下載文件.(上傳安裝包,修改了配置文件上傳。)Winscpxftp企業(yè)中常用的兩種組合: putty+winscp Xshell+xftp=xmanager面試:使用xshell、putty等ssh客戶端來(lái)連接服務(wù)器,使用xftp、winscp等sftp客戶端來(lái)上傳和現(xiàn)在文件。連接和上傳、下載必須依賴于服務(wù)器的ssh、sftp服務(wù),也就是linux服務(wù)器需要啟動(dòng)這兩個(gè)服務(wù)。2.6.4 有沒(méi)有使用過(guò)云主機(jī)?使用過(guò),在原來(lái)的公司,我們沒(méi)有使用自己的服務(wù)器,而是租用阿里的云主機(jī)。沒(méi)有使用過(guò),但是有所了解。云主機(jī)就是一些云服務(wù)運(yùn)營(yíng)商(阿里、華為、西部數(shù)碼、新浪等),提供的遠(yuǎn)程的服務(wù)器功能,我們開(kāi)發(fā)者或者企業(yè)只需按需付費(fèi)就可以租用對(duì)應(yīng)的服務(wù)器。使用ssh和sftp來(lái)進(jìn)行操作。2.6.5 有沒(méi)有做過(guò)數(shù)據(jù)庫(kù)優(yōu)化方面的事情? 做過(guò)mysql數(shù)據(jù)庫(kù)的優(yōu)化、其他數(shù)據(jù)庫(kù)類似定位:查找、定位慢查詢優(yōu)化手段:a) 創(chuàng)建索引:創(chuàng)建合適的索引,我們就可以現(xiàn)在索引中查詢,查詢到以后直接找對(duì)應(yīng)的記錄。b) 分表 :當(dāng)一張表的數(shù)據(jù)比較多或者一張表的某些字段的值比較多并且很少使用時(shí),采用水平分表和垂直分表來(lái)優(yōu)化c) 讀寫分離:當(dāng)一臺(tái)服務(wù)器不能滿足需求時(shí),采用讀寫分離的方式進(jìn)行集群。d) 緩存:使用redis來(lái)進(jìn)行緩存e) 一些常用優(yōu)化技巧 2.6.6 查找慢查詢并定位慢查詢? 在項(xiàng)目自驗(yàn)項(xiàng)目轉(zhuǎn)測(cè)試之前,在啟動(dòng)mysql數(shù)據(jù)庫(kù)時(shí)開(kāi)啟慢查詢,并且把執(zhí)行慢的語(yǔ)句寫到日志中,在運(yùn)行一定時(shí)間后。通過(guò)查看日志找到慢查詢語(yǔ)句。要找出項(xiàng)目中的慢Sql時(shí)1、關(guān)閉數(shù)據(jù)庫(kù)服務(wù)器(關(guān)閉服務(wù))2、把慢查詢記錄到日志中3、 設(shè)置慢查詢時(shí)間4、找出日志中的慢查詢SQL 使用explain 慢查詢語(yǔ)句,來(lái)詳細(xì)分析語(yǔ)句的問(wèn)題.2.6.6 數(shù)據(jù)庫(kù)優(yōu)化之遵循范式? 數(shù)據(jù)庫(kù)表設(shè)計(jì)時(shí)需要遵循方式 表的范式,是首先符合1NF, 才能滿足2NF , 進(jìn)一步滿足3NF1NF: 即表的列的具有原子性,不可再分解,即列的信息,不能分解.只要數(shù)據(jù)庫(kù)是關(guān)系型數(shù)據(jù)庫(kù)(mysql/oracle/db2/sysbase/sql server),就自動(dòng)的滿足1NF.關(guān)系型數(shù)據(jù)庫(kù)中是不允許分割列的。2NF:表中的記錄是唯一的.通常我們?cè)O(shè)計(jì)一個(gè)主鍵來(lái)實(shí)現(xiàn)3NF:即表中不要有冗余數(shù)據(jù), 就是說(shuō),表的信息,如果能夠被推導(dǎo)出來(lái),就不應(yīng)該單獨(dú)的設(shè)計(jì)一個(gè)字段來(lái)存放.(外鍵)反3NF :沒(méi)有冗余的數(shù)據(jù)庫(kù)未必是最好的數(shù)據(jù)庫(kù),有時(shí)為了提高運(yùn)行效率,就必須降低范式標(biāo)準(zhǔn),適當(dāng)保留冗余數(shù)據(jù)。具體做法是: 在概念數(shù)據(jù)模型設(shè)計(jì)時(shí)遵守第三范式,降低范式標(biāo)準(zhǔn)的工作放到物理數(shù)據(jù)模型設(shè)計(jì)時(shí)考慮。降低范式就是增加字段,允許冗余。 訂單和訂單項(xiàng)、相冊(cè)瀏覽次數(shù)和照片的瀏覽次數(shù)2.6.7 選擇合適的存儲(chǔ)引擎在開(kāi)發(fā)中,我們經(jīng)常使用的存儲(chǔ)引擎 myisam / innodb/ memoryMyISAM存儲(chǔ)引擎如果表對(duì)事務(wù)要求不高,同時(shí)是以查詢和添加為主的,我們考慮使用myisam存儲(chǔ)引擎. 比如 bbs 中的 發(fā)帖表,回復(fù)表.INNODB存儲(chǔ)引擎: 對(duì)事務(wù)要求高,保存的數(shù)據(jù)都是重要數(shù)據(jù),我們建議使用INNODB,比如訂單表,賬號(hào)表.Memory 存儲(chǔ) 我們數(shù)據(jù)變化頻繁,不需要入庫(kù),同時(shí)又頻繁的查詢和修改,我們考慮使用memory, 速度極快.問(wèn) MyISAM 和 INNODB的區(qū)別(主要)1. 事務(wù)安全 myisam不支持事務(wù)而innodb支持2. 查詢和添加速度 myisam不用支持事務(wù)就不用考慮同步鎖,查找和添加和添加的速度快3. 支持全文索引 myisam支持innodb不支持4. 鎖機(jī)制 myisam支持表鎖而innodb支持行鎖(事務(wù))5. 外鍵 MyISAM 不支持外鍵, INNODB支持外鍵. (通常不設(shè)置外鍵,通常是在程序中保證數(shù)據(jù)的一致)2.6.8 數(shù)據(jù)庫(kù)優(yōu)化之創(chuàng)建合適的索引?索引(Index)是幫助DBMS高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。分類:普通索引/唯一索引/主鍵索引/全文索引普通索引:允許重復(fù)的值出現(xiàn)唯一索引:除了不能有重復(fù)的記錄外,其它和普通索引一樣(用戶名、用戶身份證、email,tel)主鍵索引:是隨著設(shè)定主鍵而創(chuàng)建的,也就是把某個(gè)列設(shè)為主鍵的時(shí)候,數(shù)據(jù)庫(kù)就會(huì)給改列創(chuàng)建索引。這就是主鍵索引.唯一且沒(méi)有null值全文索引:用來(lái)對(duì)表中的文本域(char,varchar,text)進(jìn)行索引, 全文索引針對(duì)MyIsamexplain select * from articles where match(title,body) against('database');【會(huì)使用全文索引】2.6.9 索引使用小技巧?*****索引弊端1.占用磁盤空間。2.對(duì)dml(插入、修改、刪除)操作有影響,變慢。使用場(chǎng)景:a: 肯定在where條件經(jīng)常使用,如果不做查詢就沒(méi)有意義b: 該字段的內(nèi)容不是唯一的幾個(gè)值(sex) c: 字段內(nèi)容不是頻繁變化.具體技巧:1. 對(duì)于創(chuàng)建的多列索引(復(fù)合索引),不是使用的第一部分就不會(huì)使用索引。alter table dept add index my_ind (dname,loc); // dname 左邊的列,loc就是右邊的列explain select * from dept where dname='aaa'\G 會(huì)使用到索引explain select * from dept where loc='aaa'\G 就不會(huì)使用到索引2. 對(duì)于使用like的查詢,查詢?nèi)绻?#39;%aaa'不會(huì)使用到索引而'aaa%'會(huì)使用到索引。 explain select * from dept where dname like '%aaa'\G不能使用索引 explain select * from dept where dname like 'aaa%'\G使用索引.所以在like查詢時(shí),'關(guān)鍵字'的最前面不能使用 % 或者 _這樣的字符.,如果一定要前面有變化的值,則考慮使用 全文索引->sphinx.3. 如果條件中有or,有條件沒(méi)有使用索引,即使其中有條件帶索引也不會(huì)使用。換言之,就是要求使用的所有字段,都必須單獨(dú)使用時(shí)能使用索引. 4. 如果列類型是字符串,那一定要在條件中將數(shù)據(jù)使用引號(hào)引用起來(lái)。否則不使用索引。expain select * from dept where dname='111';expain select * from dept where dname=111;(數(shù)值自動(dòng)轉(zhuǎn)字符串)expain select * from dept where dname=qqq;報(bào)錯(cuò)也就是,如果列是字符串類型,無(wú)論是不是字符串?dāng)?shù)字就一定要用 '' 把它包括起來(lái).5. 如果mysql估計(jì)使用全表掃描要比使用索引快,則不使用索引。 表里面只有一條記錄2.6.10 數(shù)據(jù)庫(kù)優(yōu)化之分表?分表分為水平(按行)分表和垂直(按列)分表根據(jù)經(jīng)驗(yàn),Mysql表數(shù)據(jù)一般達(dá)到百萬(wàn)級(jí)別,查詢效率會(huì)很低,容易造成表鎖,甚至堆積很多連接,直接掛掉;水平分表能夠很大程度較少這些壓力。按行數(shù)據(jù)進(jìn)行分表。如果一張表中某個(gè)字段值非常多(長(zhǎng)文本、二進(jìn)制等),而且只有在很少的情況下會(huì)查詢。這時(shí)候就可以把字段多個(gè)單獨(dú)放到一個(gè)表,通過(guò)外鍵關(guān)聯(lián)起來(lái)。 考試詳情,一般我們只關(guān)注分?jǐn)?shù),不關(guān)注詳情。水平分表策略:1.按時(shí)間分表這種分表方式有一定的局限性,當(dāng)數(shù)據(jù)有較強(qiáng)的實(shí)效性,如微博發(fā)送記錄、微信消息記錄等,這種數(shù)據(jù)很少有用戶會(huì)查詢幾個(gè)月前的數(shù)據(jù),如就可以按月分表。2.按區(qū)間范圍分表一般在有嚴(yán)格的自增id需求上,如按照user_id水平分表:table_1 user_id從1~100w table_2 user_id從101~200w table_3 user_id從201~300w 3.hash分表*****通過(guò)一個(gè)原始目標(biāo)的ID或者名稱通過(guò)一定的hash算法計(jì)算出數(shù)據(jù)存儲(chǔ)表的表名,然后訪問(wèn)相應(yīng)的表。2.6.11 數(shù)據(jù)庫(kù)優(yōu)化之讀寫分離一臺(tái)數(shù)據(jù)庫(kù)支持的最大并發(fā)連接數(shù)是有限的,如果用戶并發(fā)訪問(wèn)太多。一臺(tái)服務(wù)器滿足不要要求是就可以集群處理。Mysql的集群處理技術(shù)最常用的就是讀寫分離。 主從同步數(shù)據(jù)庫(kù)最終會(huì)把數(shù)據(jù)持久化到磁盤,如果集群必須確保每個(gè)數(shù)據(jù)庫(kù)服務(wù)器的數(shù)據(jù)是一直的。能改變數(shù)據(jù)庫(kù)數(shù)據(jù)的操作都往主數(shù)據(jù)庫(kù)去寫,而其他的數(shù)據(jù)庫(kù)從主數(shù)據(jù)庫(kù)上同步數(shù)據(jù)。讀寫分離 使用負(fù)載均衡來(lái)實(shí)現(xiàn)寫的操作都往主數(shù)據(jù)去,而讀的操作往從服務(wù)器去。2.6.12 數(shù)據(jù)庫(kù)優(yōu)化之緩存 在持久層(dao)和數(shù)據(jù)庫(kù)(db)之間添加一個(gè)緩存層,如果用戶訪問(wèn)的數(shù)據(jù)已經(jīng)緩存起來(lái)時(shí),在用戶訪問(wèn)時(shí)直接從緩存中獲取,不用訪問(wèn)數(shù)據(jù)庫(kù)。而緩存是在操作內(nèi)存級(jí),訪問(wèn)速度快。作用:減少數(shù)據(jù)庫(kù)服務(wù)器壓力,減少訪問(wèn)時(shí)間。Java中常用的緩存有, 1、hibernate的二級(jí)緩存。該緩存不能完成分布式緩存。2、 可以使用redis(memcahe等)來(lái)作為中央緩存。 對(duì)緩存的數(shù)據(jù)進(jìn)行集中處理2.6.13 語(yǔ)句優(yōu)化小技巧DDL優(yōu)化:1 、通過(guò)禁用索引來(lái)提供導(dǎo)入數(shù)據(jù)性能 。 這個(gè)操作主要針對(duì)有數(shù)據(jù)庫(kù)的表,追加數(shù)據(jù)//去除鍵alter table test3 DISABLE keys;//批量插入數(shù)據(jù)insert into test3 select * from test;//恢復(fù)鍵alter table test3 ENABLE keys;2、 關(guān)閉唯一校驗(yàn)set unique_checks=0 關(guān)閉set unique_checks=1 開(kāi)啟3、修改事務(wù)提交方式(導(dǎo)入)(變多次提交為一次)set autocommit=0 關(guān)閉//批量插入set autocommit=1 開(kāi)啟DML優(yōu)化(變多次提交為一次) insert into test values(1,2);insert into test values(1,3);insert into test values(1,4);//合并多條為一條insert into test values(1,2),(1,3),(1,4)DQL優(yōu)化Order by優(yōu)化 1、多用索引排序2、 普通結(jié)果排序(非索引排序)Filesort group by優(yōu)化 是使用order by null,取消默認(rèn)排序 子查詢優(yōu)化在客戶列表找到不在支付列表的客戶#在客戶列表找到不在"支付列表"的客戶 , 查詢沒(méi)買過(guò)東西的客戶explainselect * from customer where customer_id not in (select DISTINCT customer_id from payment); #子查詢 -- 這種是基于func外鏈explain select * from customer c left join payment p on(c.customer_id=p.customer_id) where p.customer_id is null -- 這種是基于"索引"外鏈 Or優(yōu)化在兩個(gè)獨(dú)立索引上使用or的性能優(yōu)于 1、 or兩邊都是用索引字段做判斷,性能好!!2、 or兩邊,有一邊不用,性能差3、 如果employee表的name和email這兩列是一個(gè)復(fù)合索引,但是如果是 :name='A' OR email='B' 這種方式,不會(huì)用到索引! limit優(yōu)化select film_id,description from film order by title limit 50,5;select a.film_id,a.description from film a inner join (select film_id from film order by title limit 50,5)b on a.film_id=b.film_id2.6.14 jdbc批量插入幾百萬(wàn)數(shù)據(jù)怎么實(shí)現(xiàn)?*****1、變多次提交為一次3、使用批量操作省出的時(shí)間可觀。像這樣的批量插入操作能不使用代碼操作就不使用,可以使用存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)。2.6.15 有沒(méi)有使用過(guò)redis? Redis是什么 Redis是一個(gè)key-value的nosql數(shù)據(jù)庫(kù).先存到內(nèi)存中,會(huì)根據(jù)一定的策略持久化到磁盤,即使斷電也不會(huì)丟失數(shù)據(jù)。支持的數(shù)據(jù)類型比較多。主要用來(lái)做緩存數(shù)據(jù)庫(kù)的數(shù)據(jù)和web集群時(shí)當(dāng)做中央緩存存放seesion2.4.15 Redis和memche的比較? 1、 Redis和Memcache都是將數(shù)據(jù)存放在內(nèi)存中,都是內(nèi)存數(shù)據(jù)庫(kù)。不過(guò)memcache還可用于緩存其他東西,例如圖片、視頻等等。2、Redis不僅僅支持簡(jiǎn)單的k/v類型的數(shù)據(jù),同時(shí)還提供list,set,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。3、虛擬內(nèi)存--Redis當(dāng)物理內(nèi)存用完時(shí),可以將一些很久沒(méi)用到的value 交換到磁盤 2.6.16 簡(jiǎn)單說(shuō)一下redis的使用場(chǎng)景? 緩存:把經(jīng)常需要查詢的、很少修改數(shù)據(jù),放到讀速度很快的空間(內(nèi)存),以便下次訪問(wèn)減少時(shí)間。減輕壓力,減少訪問(wèn)時(shí)間.計(jì)數(shù)器: redis中的計(jì)數(shù)器是原子性的內(nèi)存操作。 可以解決庫(kù)存溢出問(wèn)題.進(jìn)銷存系統(tǒng)庫(kù)存溢出。 session緩存服務(wù)器:web集群時(shí)作為session緩存服務(wù)器緩存隊(duì)列等2.6.17 redis對(duì)象保存方式?Json字符串:需要把對(duì)象轉(zhuǎn)換為json字符串,當(dāng)做字符串處理。直接使用set get來(lái)設(shè)置或者或。優(yōu)點(diǎn):設(shè)置和獲取比較簡(jiǎn)單缺點(diǎn):沒(méi)有提供專門的方法,需要把把對(duì)象轉(zhuǎn)換為json。(jsonlib)字節(jié): 需要做序列號(hào),就是把對(duì)象序列化為字節(jié)保存。如果是擔(dān)心JSON轉(zhuǎn)對(duì)象會(huì)消耗資源的情況,這個(gè)問(wèn)題需要考量幾個(gè)地方,第一點(diǎn):就是使用的JSON轉(zhuǎn)換lib是否就會(huì)存在性能問(wèn)題。第二點(diǎn):就是數(shù)據(jù)的數(shù)據(jù)量級(jí)別,如果是存儲(chǔ)百萬(wàn)級(jí)的大數(shù)據(jù)對(duì)象,建議采用存儲(chǔ)序列化對(duì)象方式。如果是少量的數(shù)據(jù)級(jí)對(duì)象,或者是數(shù)據(jù)對(duì)象字段不多,還是建議采用JSON轉(zhuǎn)換成String方式。畢竟redis對(duì)存儲(chǔ)字符類型這部分優(yōu)化的非常好。具體采用的方式與方法,還要看你所使用的場(chǎng)景。2.6.18 Redis數(shù)據(jù)淘汰機(jī)制在 redis 中,允許用戶設(shè)置最大使用內(nèi)存大小 server.maxmemory,在內(nèi)存限定的情況下是很有用的。譬如,在一臺(tái) 8G 機(jī)子上部署了 4 個(gè) redis 服務(wù)點(diǎn),每一個(gè)服務(wù)點(diǎn)分配 1.5G 的內(nèi)存大小,減少內(nèi)存緊張的情況,由此獲取更為穩(wěn)健的服務(wù)。內(nèi)存大小有限,需要保存有效的數(shù)據(jù)?redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時(shí)候,就會(huì)施行數(shù)據(jù)淘汰策略。redis 提供 6種數(shù)據(jù)淘汰策略:volatile-lru:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰volatile-ttl:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過(guò)期的數(shù)據(jù)淘汰volatile-random:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)2.6.19 Java訪問(wèn)Redis1、使用jedis java客戶端來(lái)訪問(wèn)redis服務(wù)器,有點(diǎn)類似通過(guò)jdbc訪問(wèn)mysql一樣。2、當(dāng)然如果是spring進(jìn)行集成時(shí),可以使用spring data來(lái)訪問(wèn)redis,spring data只是對(duì)jedis的二次封裝。jdbcTemplate jdbc關(guān)系一樣2.6.20 Redis集群當(dāng)一臺(tái)數(shù)據(jù)無(wú)法滿足要求,可以使用reids集群來(lái)處理,類似于mysql的讀寫分離。2.6.21簡(jiǎn)單介紹一下微信公共號(hào)的分類? 公眾號(hào):個(gè)人和企業(yè)都能申請(qǐng) 服務(wù)號(hào):企業(yè)才能申請(qǐng) 企業(yè)號(hào):企業(yè)才能申請(qǐng)2.6.22 微信開(kāi)發(fā)原理微信公眾平臺(tái)開(kāi)發(fā)者,通過(guò)接入認(rèn)證的方式,讓我們的服務(wù)器能處理來(lái)自微信服務(wù)器轉(zhuǎn)發(fā)的微信用戶的請(qǐng)求,處理完成后返回給微信服務(wù)器,有微信服務(wù)器對(duì)用戶響應(yīng)。2.6.23怎么把微信和業(yè)務(wù)平臺(tái)綁定?微信用戶和注冊(cè)用戶綁定?讓微信用戶也能完成注冊(cè)用戶的功能。用戶注冊(cè)實(shí)體中包含一個(gè)微信號(hào)的字段,當(dāng)我進(jìn)行綁定時(shí)就是修改用戶的微信號(hào)字段。當(dāng)然我們?cè)谶M(jìn)行菜單跳轉(zhuǎn)到頁(yè)面后,我們是無(wú)法直接獲取微信號(hào)的。要通過(guò)微信網(wǎng)頁(yè)授權(quán)來(lái)獲取微信號(hào)。第一步:用戶同意授權(quán),獲取codehttps://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示"該鏈接無(wú)法訪問(wèn)",請(qǐng)檢查參數(shù)是否填寫錯(cuò)誤,是否擁有scope參數(shù)對(duì)應(yīng)的授權(quán)作用域權(quán)限。 第二步:通過(guò)code換取網(wǎng)頁(yè)授權(quán)openId也就是我們微信號(hào)獲取code后,請(qǐng)求以下鏈接獲取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code { "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" } 2.7 項(xiàng)目和業(yè)務(wù)部分 2.7.1項(xiàng)目分類在公司中做的項(xiàng)目可以分為兩種產(chǎn)品、項(xiàng)目.項(xiàng)目:就是給一些公司接的項(xiàng)目,項(xiàng)目開(kāi)發(fā)完成后。就交互,后面這個(gè)項(xiàng)目代碼就不在維護(hù)了產(chǎn)品:充分考慮擴(kuò)展性和基本業(yè)務(wù),來(lái)做一個(gè)產(chǎn)品。在這個(gè)產(chǎn)品上可以進(jìn)行定制開(kāi)發(fā)。 2.7.2 項(xiàng)目參與者 產(chǎn)品經(jīng)理?PM?架構(gòu)師(SE)?(開(kāi)發(fā)PL? MDE?可能會(huì)有多個(gè)) (測(cè)試PL ? TSE可能會(huì)有多個(gè)) UI 資料開(kāi)發(fā)團(tuán)隊(duì):開(kāi)始代碼能完成需求測(cè)試團(tuán)隊(duì):測(cè)試功能UI:負(fù)責(zé)界面設(shè)計(jì)、靜態(tài)代碼的編寫資料:負(fù)責(zé)界面的文字描述。QA :通過(guò)項(xiàng)目質(zhì)量監(jiān)控,和PM,SE同級(jí)開(kāi)發(fā)和UI和資料,協(xié)同設(shè)計(jì)和開(kāi)發(fā),開(kāi)發(fā)完成后轉(zhuǎn)測(cè)試(測(cè)試策略)交給測(cè)試團(tuán)隊(duì)進(jìn)行測(cè)試,測(cè)試完成后會(huì)出一個(gè)測(cè)試報(bào)告。2.7.3 項(xiàng)目流程 可行性分析和立項(xiàng)和開(kāi)工會(huì) 需求分析 需求設(shè)計(jì) 項(xiàng)目開(kāi)發(fā)(多個(gè)迭代) 迭代開(kāi)工會(huì) 迭代設(shè)計(jì) 迭代開(kāi)發(fā) 迭代測(cè)試 集成測(cè)試 迭代發(fā)布 迭代總結(jié) ....不斷迭代 項(xiàng)目驗(yàn)收 項(xiàng)目總結(jié) 2.7.4 業(yè)務(wù)注意事項(xiàng)1、 不要多個(gè)項(xiàng)目都說(shuō)你同一個(gè)模塊。如果要說(shuō),就說(shuō)后面是進(jìn)行改進(jìn)。 在pss,crm,shopping都寫權(quán)限模塊2、多寫點(diǎn)業(yè)務(wù)

          先、感謝關(guān)注淼哥的小伙伴!

          有的小伙伴就說(shuō)了,淼哥!你說(shuō)php這么好!那么怎么才能學(xué)好Php呢?有的小伙伴想學(xué)又不知道該往哪個(gè)方向努力!

          學(xué)習(xí)php是一個(gè)長(zhǎng)期堅(jiān)持的過(guò)程。學(xué)習(xí)php要有自己的知識(shí)架構(gòu)體系。

          小編根據(jù)自己的經(jīng)驗(yàn),給新人指一條學(xué)習(xí)路徑。小編曾經(jīng)是某培訓(xùn)學(xué)校的職業(yè)技能講師。請(qǐng)相信我。我還是比較專業(yè)的嘛。。o(* ̄︶ ̄*)o

          如果想要學(xué)好php,個(gè)人認(rèn)為以下幾個(gè)部分,缺一不可。

          第一部分:前端相關(guān)內(nèi)容

          第二部分:后端相關(guān)內(nèi)容

          第三部分:必備常用開(kāi)發(fā)技術(shù)

          第四部分:企業(yè)應(yīng)用

          第五部分:知識(shí)擴(kuò)展部分

          我們一點(diǎn)一點(diǎn)來(lái)介紹,為什么需要這幾個(gè)部分才能找到滿意的工作。

          第一部分:前端相關(guān)內(nèi)容

          前端課程也分為web開(kāi)發(fā)基礎(chǔ)部分、web開(kāi)發(fā)進(jìn)階部分、web開(kāi)發(fā)高級(jí)部分。

          web開(kāi)發(fā)基礎(chǔ)部分的課程包括:計(jì)算機(jī)原理、計(jì)算機(jī)網(wǎng)絡(luò)原理、html、css、javascript、ps基礎(chǔ)(會(huì)切圖即可)

          學(xué)習(xí)目標(biāo):掌握構(gòu)建符合W3C 標(biāo)準(zhǔn)的 WEB頁(yè)面技術(shù),讓自己可以根據(jù)設(shè)計(jì)的效果圖,來(lái)制作精美網(wǎng)頁(yè)。

          web開(kāi)發(fā)進(jìn)階部分的課程包括:html5、css3、jquery、ajax(學(xué)習(xí)http協(xié)議非常重要)

          學(xué)習(xí)目標(biāo):了解行業(yè)最新技術(shù),制作各種網(wǎng)頁(yè)常用特效,講解特效原理,達(dá)到制作網(wǎng)頁(yè)得心應(yīng)手。

          web開(kāi)發(fā)高級(jí)部分:flax布局、css兼容性處理、自適應(yīng)布局、less、前端框架的講解。

          學(xué)習(xí)目標(biāo):處理不同瀏覽器之間的兼容性問(wèn)題、對(duì)于PC端、手機(jī)端、平板端的前端顯示解決方案,掌握前端流行框架的應(yīng)用,和動(dòng)態(tài)編寫css的能力。

          第二部分:后端相關(guān)內(nèi)容


          后端課程也分為php基礎(chǔ)、php高級(jí)、mvc框架、thinkphp框架、laravel框架。

          • Php基礎(chǔ)
          • 學(xué)習(xí)目標(biāo):PHP基礎(chǔ)入門,通過(guò)此部分的學(xué)習(xí), 讓學(xué)員逐步建立完善的編程思想,為后續(xù)課程打下堅(jiān)實(shí)基礎(chǔ)。
          • Php高級(jí)
          • 學(xué)習(xí)目標(biāo):php高級(jí)的部分包括很多,其中包括php文件處理、GD庫(kù)、面向?qū)ο蟆⒄齽t表達(dá)、session、cookie、異常處理、phpxml處理、php數(shù)據(jù)庫(kù)處理方案(mysqli和PDO)及PHP設(shè)計(jì)模式。通過(guò)php高級(jí)部分的課程,讓學(xué)員更好的掌握php這門編程語(yǔ)言。
          • MVC框架
          • 學(xué)習(xí)目標(biāo):MVC框架是當(dāng)前非常流行的框架,通過(guò)對(duì)mvc框架底層原理的理解,學(xué)員可以很快適應(yīng)當(dāng)前市面上絕大多數(shù)基于mvc開(kāi)發(fā)的框架。這部分課程要求學(xué)員掌握mvc框架原理,可以自己搭建簡(jiǎn)單的mvc框架。
          • thinkphp框架
          • 學(xué)習(xí)目標(biāo):通過(guò)之前學(xué)習(xí)的內(nèi)容,了解mvc框架的原理后,學(xué)習(xí)一款當(dāng)前市場(chǎng)流行的框架。
          • laravel框架框架
          • 學(xué)習(xí)目標(biāo):laravel框架是當(dāng)前非常流行的框架,為以后就業(yè)打下堅(jiān)實(shí)的基礎(chǔ)。


          第三部分:必備常用開(kāi)發(fā)技術(shù)


          必備常用開(kāi)發(fā)技術(shù)包括:linux、mysql、smarty、curl、二維碼制作等。

          • Linux
          • 學(xué)習(xí)目標(biāo):linux是服務(wù)器操作系統(tǒng),要求學(xué)員安裝linux操作系統(tǒng)、掌握l(shuí)inux基本命令、熟悉linux服務(wù)器文件系統(tǒng)、使用vim編輯器、linux定時(shí)執(zhí)行任務(wù)(定時(shí)備份數(shù)據(jù)庫(kù)等)、php+mysql+apache環(huán)境搭建。
          • Mysql
          • 學(xué)習(xí)目標(biāo):Mysql是php最佳數(shù)據(jù)庫(kù)搭檔,要求學(xué)員對(duì)數(shù)據(jù)庫(kù)熟練使用操作mysql數(shù)據(jù)庫(kù)并掌握對(duì)庫(kù)級(jí),表級(jí)操作。熟練使用mysql語(yǔ)言。Mysql導(dǎo)出,mysql權(quán)限設(shè)定、子查詢、mysql事物處理等。
          • Smarty
          • 學(xué)習(xí)目標(biāo):Smarty 是一個(gè)使用 PHP 寫出來(lái)的模板引擎,是目前業(yè)界最著名的 PHP 模板引擎之一。它分離了邏輯代碼和外在的內(nèi)容,提供了一種易于管理和使用的方法,用來(lái)將原本與 HTML代碼混雜在一起PHP代碼邏輯分離。要求學(xué)員熟練使用smarty.
          • Curl
          • 學(xué)習(xí)目標(biāo):讓學(xué)員了解什么是webservice,什么是接口,如何編寫接口和如何遠(yuǎn)程調(diào)用各種webservice,完成利用webservice來(lái)得到各種天氣、短信、股票身份證實(shí)名信息等操作。
          • composer
          • 學(xué)習(xí)目標(biāo):composer是PHP 的一個(gè)依賴管理工具,它并不是一個(gè)包管理器,它允許開(kāi)發(fā)人員聲明項(xiàng)目所依賴的代碼庫(kù),它會(huì)在項(xiàng)目中安裝他們。
          • x-debug
          • 學(xué)習(xí)目標(biāo):可以在ide環(huán)境中來(lái)測(cè)試php代碼
          • memcached、redis
          • 學(xué)習(xí)目標(biāo):了解緩存機(jī)制,內(nèi)存數(shù)據(jù)庫(kù),以及企業(yè)關(guān)于高并發(fā)處理的方案。

          第四部分:企業(yè)應(yīng)用



          企業(yè)應(yīng)用主要是當(dāng)前企業(yè)主要應(yīng)用哪些技術(shù),以及授課老師經(jīng)驗(yàn)的積累。主要內(nèi)容包括:企業(yè)開(kāi)發(fā)規(guī)范、企業(yè)開(kāi)發(fā)流程、svn、CMS系統(tǒng)、微信公眾號(hào)的開(kāi)發(fā)。

          • 企業(yè)開(kāi)發(fā)規(guī)范
          • 學(xué)習(xí)目標(biāo):掌握當(dāng)前企業(yè)開(kāi)發(fā)具體要求,如文檔標(biāo)注、變量命名、函數(shù)命名等。
          • 企業(yè)開(kāi)發(fā)流程
          • 學(xué)習(xí)目標(biāo):詳細(xì)講解,當(dāng)前企業(yè)軟件開(kāi)發(fā)的具體細(xì)節(jié)。
          • svn /git
          • 學(xué)習(xí)目標(biāo):SVN是Subversion的簡(jiǎn)稱,是一個(gè)開(kāi)放源代碼的版本控制系統(tǒng)。要求學(xué)員會(huì)搭建svn使用svn即可。
          • 市場(chǎng)CMS系統(tǒng)
          • 課程目標(biāo):CMS是國(guó)產(chǎn)建站的CMS系統(tǒng),要求學(xué)員掌握如何快速開(kāi)發(fā)網(wǎng)站。


          第五部分:知識(shí)擴(kuò)展部分

          負(fù)載均衡服務(wù)器搭建、常見(jiàn)網(wǎng)站攻防課、服務(wù)器優(yōu)化、mysql優(yōu)化。

          其實(shí)、在整個(gè)學(xué)習(xí)的過(guò)程中,項(xiàng)目是最重要的!

          如果小伙伴們按照上面組成自己的php全棧知識(shí)體系,找一份工作應(yīng)該問(wèn)題不大,還有最重要的一點(diǎn),鍛煉的機(jī)會(huì)。

          如果某一個(gè)公司給你offter,如果在這個(gè)公司能夠得到鍛煉,那么錢少一點(diǎn),也沒(méi)關(guān)系。這個(gè)行業(yè)里經(jīng)驗(yàn)太重要了!

          以上就是我自己的一點(diǎn)看法。希望能夠幫的到各位小伙伴。

          手寫不宜,請(qǐng)點(diǎn)贊、關(guān)注下!謝謝

          (注:本內(nèi)容屬于原創(chuàng),未經(jīng)許可嚴(yán)禁抄襲。內(nèi)容真實(shí)性已考證,圖片來(lái)源于網(wǎng)絡(luò),圖片如有侵權(quán)請(qǐng)聯(lián)系作者刪除)


          主站蜘蛛池模板: 国产伦精品一区三区视频| 国产乱码一区二区三区| 久久久国产精品无码一区二区三区| 亚洲狠狠久久综合一区77777| 亚洲高清毛片一区二区| 夜夜添无码一区二区三区| 日韩aⅴ人妻无码一区二区| 精品无码一区二区三区电影 | 久久一区二区精品综合| 国产精品被窝福利一区 | 国产精品一区电影| 亚洲av无一区二区三区| 国产福利91精品一区二区| 亚洲av鲁丝一区二区三区| 伊人久久大香线蕉av一区| 中文国产成人精品久久一区| 精品一区精品二区| 亚洲AV无码一区二区三区国产| 日韩视频一区二区| 内射少妇一区27P| 国产福利一区二区| 北岛玲在线一区二区| 一区在线观看视频| 精品视频在线观看你懂的一区| 亚洲国产激情一区二区三区 | 国产精品视频一区国模私拍| 亚洲AⅤ无码一区二区三区在线| 色偷偷一区二区无码视频| 精品视频一区二区| 精品国产乱码一区二区三区| 国产伦精品一区二区免费| 国产精品亚洲一区二区在线观看| 久久久久久综合一区中文字幕| 国产一区二区三区乱码在线观看| 亚洲国产综合无码一区| 日韩伦理一区二区| 日韩精品一区二区三区老鸭窝| 国产亚洲情侣一区二区无| 狠狠综合久久av一区二区| 3d动漫精品啪啪一区二区免费| 精品免费久久久久国产一区|