jQuery - AJAX雹熬、mysql的優(yōu)化

一)jQuery常用AJAX-API

目的:簡(jiǎn)化客戶端與服務(wù)端進(jìn)行局部刷新的異步通訊

1)取得服務(wù)端當(dāng)前時(shí)間

  • 簡(jiǎn)單形式:jQuery對(duì)象.load(url)
    • 返回結(jié)果自動(dòng)添加到j(luò)Query對(duì)象代表的標(biāo)簽中間; 如果是Servlet的話, 采用的是GET方式
  • 復(fù)雜形式:
    • jQuery對(duì)象.load(url,sendData,function(backData,textStatus,ajax){... ...}); sendData = {"user.name":"jack","user.pass":"123"}; ( 以JSON格式文本方式發(fā)送宽菜,使用POST方式發(fā)送,服務(wù)端能收到數(shù)據(jù) )
    • load()方法參數(shù)解釋:
      • 參數(shù)一:url發(fā)送到哪里去
      • 參數(shù)二:sendData發(fā)送請(qǐng)求體中的數(shù)據(jù)竿报,符合JSON格式铅乡,例如:{key:value,key:value}
      • 參數(shù)三:function處理函數(shù),類似于傳統(tǒng)方式ajax.onreadystatechange = 處理函數(shù)
      • 其中參數(shù)三為function處理函數(shù)最多可以接收三個(gè)參數(shù)烈菌,含義如下
        • 第一個(gè)參數(shù):服務(wù)端返回的數(shù)據(jù)阵幸,例如:backData
        • 第二個(gè)參數(shù):服務(wù)端狀態(tài)碼的文本描述,例如:success芽世、error挚赊、
        • 第三個(gè)參數(shù):ajax異步對(duì)象,即XMLHttpRequest對(duì)象
        • 以上所有參數(shù)的名字可以任意济瓢,但必須按順序書(shū)寫(xiě)咬腕,盡量做到見(jiàn)名知意
    • 注意:對(duì)于load方法而言,如果請(qǐng)求體無(wú)參數(shù)發(fā)送的話葬荷,load方法采用GET方式提交; 如果請(qǐng)求體有參數(shù)發(fā)送的話,load方法采用POST方式提交; 使用load方法時(shí)纽帖,自動(dòng)進(jìn)行編碼宠漩,無(wú)需手工編碼
    <script type="text/javascript">
        $(":button").click(function(){
            var url = "${pageContext.request.contextPath}/loadTimeRequest?time"+new Date().getTime();
            var sendData = null;
            $.load(url,sendData,function(a,b,ajax){
                var jsonJAVA = ajax.responseText;
                var jsonJS = eval("("+jsonJAVA+")");
                var strTime = jsonJS.strTime;
                $("span:first").html(strTime).css("color","red");
                $("span:last").html(strTime).css("color","blue");
            });
            //$("span").load(url);
        });
    </script>

2)檢查注冊(cè)用戶名和密碼是否存在

  • $.get(url,sendData,function(backData,textStatus,ajax){... ...})
  • $.post(url,sendData,function(backData,textStatus,ajax){... ...})-> 提倡
  • 注意 : 使用get或post方法時(shí),自動(dòng)進(jìn)行編碼懊直,無(wú)需手工編碼

3)jQuery對(duì)象.serialize()

  • 作用:自動(dòng)生成JSON格式的文本
  • 注意:為每個(gè)jQuery對(duì)象設(shè)置一個(gè)name屬性扒吁,因?yàn)閚ame屬性會(huì)被認(rèn)為請(qǐng)求參數(shù)名
  • 注意:必須用<form>標(biāo)簽元素
  • 適用:如果屬性過(guò)多,強(qiáng)烈推薦采用這個(gè)API
    <script type="text/javascript">
        //定位按鈕室囊,同時(shí)添加單擊事件
        $(":button").click(function(){
            //獲取用戶名和密碼
            var username = $(":text:first").val();
            var password = $(":text:last").val();
            //去空格
            username = $.trim(username);
            password = $.trim(password);
            //異步發(fā)送到服務(wù)端
            var url = "${pageContext.request.contextPath}/checkRequest?time="+new Date().getTime();
            /*手工書(shū)寫(xiě)JSON文本
            var sendData = {
                "user.username":username,
                "user.password":password
            };
            */
            /*工具生成JSON文本*/
            var sendData = $("form").serialize();
            $.post(url,sendData,function(backData,textStatus,ajax){
                //backData是一個(gè)JSON文本/對(duì)象雕崩,你得通過(guò).號(hào)訪問(wèn)其屬性值
                var tip = backData.tip;
                //創(chuàng)建img節(jié)點(diǎn)
                var $img = $("![](" + tip + ")")
                //清空span節(jié)點(diǎn)中的內(nèi)容
                $("span").text("");
                //將img節(jié)點(diǎn)添加到span節(jié)點(diǎn)中
                $("span").append( $img );
            });
        });
    </script>
public class RegisterAction extends ActionSupport{
    private User user;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    /**
     * 檢查注冊(cè)用戶名和密碼是否存在
     */
    public String checkMethod() throws Exception {
        tip = "images/MsgSent.gif";
        if("帥帥".equals(user.getUsername()) && "123".equals(user.getPassword())){
            tip = "images/MsgError.gif";
        }
        return "ok";
    }
    private String tip;
    public String getTip() {
        return tip;
    }
    /**
     * var backData = {
     *                  "tip":"images/MsgError.gif"
     *                }
     */
}

4)jQuery解析XML

  • xml :
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <city>廣州</city>
    <city>中山</city>
    <city>深圳</city>
    <city>佛山</city>
    <city>珠海</city>
</root>
  • jQuery :
<script type="text/javascript">
        $(":button").click(function(){
            var url = "${pageContext.request.contextPath}/03_city.xml";
            var sendData = null;
            $.get(url,sendData,function(backData,textStatus,ajax){
                /*
                //將xml文件轉(zhuǎn)成jquery對(duì)象魁索,目的是用jquery api解析xml文件
                var $xml = $(backData);
                var $city = $xml.find("city");
                $city.each(function(){
                    //獲取每一個(gè)city節(jié)點(diǎn)
                    var city = $(this).text();
                    alert(city);
                });
                */
                var xml = ajax.responseXML;
                var $xml = $(xml);
                var $city = $xml.find("city");
                $city.each(function(){
                    //獲取每一個(gè)city節(jié)點(diǎn)
                    var city = $(this).text();
                    alert(city);
                });
            });
        });
    </script>

5)省份-城市,基于jQuery的AJAX二級(jí)聯(lián)動(dòng)盼铁,用Struts2整合AJAX【非數(shù)據(jù)庫(kù)版】

  • js :
    <select id="province">
        <option>選擇省份</option>
        <option>廣東</option>
        <option>湖南</option>
    </select>
    <select id="city">
        <option>選擇城市</option>
    </select>
<script type="text/javascript">
        $("#province").change(function(){
            //刪除原城市下拉框中的內(nèi)容粗蔚,除第一項(xiàng)外
            $("#city option:gt(0)").remove();
            var province = $("#province option:selected").text();
            if("選擇省份" != province){
                $.ajax({
                    "type":"POST",
                    "url":"${pageContext.request.contextPath}/findCityByProvince?time="+new Date().getTime(),
                    "sendData":{"province":province},
                    "success":function(backData,textStatus,ajax){
                        //js對(duì)象
                        var city = backData.cityList;
                        //jquery對(duì)象
                        var $city = $(city);
                        //each()
                        $city.each(function(){
                            //this表示每個(gè)城市
                            var $option = $("<option>" + this + "</option>");
                            $("#city").append( $option );
                        });
                    }
                });
            }
        });
    </script>
  • java :
public class ProvinceCityAction extends ActionSupport{
    private String province;//廣東
    public void setProvince(String province) {
        this.province = province;
    }
    public String findCityByProvince() throws Exception {
        cityList = new ArrayList<String>();
        if("廣東".equals(province)){
            cityList.add("湛江");
            cityList.add("汕頭");
        }else if("湖南".equals(province)){
            cityList.add("邵陽(yáng)");
            cityList.add("瀏陽(yáng)");
        }
        return "ok";
    }
    private List<String> cityList;
    public List<String> getCityList() {
        return cityList;
    }
    /**
     * var backData = {
     *                   "cityList":["邵陽(yáng)","瀏陽(yáng)"]
     *                }
     */
}
  • struts :
<struts>
   <package name="timePackage" extends="json-default" namespace="/">
        <global-results>
            <result name="ok" type="json"/>
        </global-results>

        <!-- 獲取服務(wù)端時(shí)間 -->
        <action 
            name="loadTimeRequest" 
            class="cn.itcast.javaee.js.time.TimeAction" 
            method="loadTimeMethod"/>

        <!-- 檢查用戶名和密碼是否存在 -->
        <action 
            name="checkRequest" 
            class="cn.itcast.javaee.js.register.RegisterAction" 
            method="checkMethod"/>
            
        <!-- 根據(jù)省份查詢城市 -->   
        <action 
            name="findCityByProvince" 
            class="cn.itcast.javaee.js.provincecity.ProvinceCityAction" 
            method="findCityByProvince"/>
   </package>
</struts>

二)掌握J(rèn)ava調(diào)用Oracle過(guò)程與函數(shù)

  • 寫(xiě)一個(gè)計(jì)算個(gè)人所得稅的應(yīng)用
    • sql :
--定義過(guò)程
create or replace procedure get_rax(salary in number,rax out number)
as
    --需要交稅的錢(qián)
    bal number;
begin
    bal := salary - 3500;
    if bal<=1500 then
       rax := bal * 0.03 - 0;
    elsif bal<=4500 then
       rax := bal * 0.1 - 105;
    elsif bal<=9000 then
       rax := bal * 0.2 - 555;
    elsif bal<=35000 then
       rax := bal * 0.25 - 1005;
    elsif bal<=55000 then
       rax := bal * 0.3 - 2755;
    elsif bal<=80000 then
       rax := bal * 0.35 - 5505;
    else
       rax := bal * 0.45 - 13505;
    end if;
end;
/
--調(diào)用過(guò)程
declare
   --交稅
   rax number; 
   salary number := &salary;
begin
   get_rax(salary,rax); 
   dbms_output.put_line(salary||'元工資需要交'||rax||'元稅');
end;
/
  • java :
public class TestCallOracleProc {
    public static void main(String[] args) throws Exception{
        String sql = "{call get_rax(?,?)}";
        Connection conn = JdbcUtil.getConnection();
        CallableStatement cstmt = conn.prepareCall(sql);
        cstmt.setInt(1,10000);
        cstmt.registerOutParameter(2,Types.INTEGER);
        cstmt.execute();
        Integer rax = cstmt.getInt(2);
        System.out.println("10000元需要交" + rax + "元稅");
        JdbcUtil.close(cstmt);
        JdbcUtil.close(conn);
    }
}
  • 查詢7788號(hào)員工的的姓名,職位饶火,月薪
    • sql語(yǔ)句 :
--定義函數(shù)
create or replace function findEmpNameAndJobAndSal(pempno in number,pjob out varchar2,psal out number) 
return varchar2
as
    pename emp.ename%type;
begin
    select ename,job,sal into pename,pjob,psal from emp where empno = pempno;
    return pename;
end;
/
--調(diào)用函數(shù)
declare
    pename emp.ename%type;
    pjob   emp.job%type;
    psal   emp.sal%type;
begin
    pename := findEmpNameAndJobAndSal(7788,pjob,psal);
    dbms_output.put_line('7788'||'--'||pename||'--'||pjob||'--'||psal);
end;
/
  • java :
public class TestCallOracleFunc {
    public static void main(String[] args) throws Exception{
        String sql = "{?=call findEmpNameAndJobAndSal(?,?,?)}";
        Connection conn = JdbcUtil.getConnection();
        CallableStatement cstmt = conn.prepareCall(sql);
        cstmt.registerOutParameter(1,Types.VARCHAR);
        cstmt.setInt(2,7788);
        cstmt.registerOutParameter(3,Types.VARCHAR);
        cstmt.registerOutParameter(4,Types.INTEGER);
        cstmt.execute();
        String ename = cstmt.getString(1);
        String job = cstmt.getString(3);
        Integer sal = cstmt.getInt(4);
        System.out.println(ename+":"+job+":"+sal);
        JdbcUtil.close(cstmt);
        JdbcUtil.close(conn);
    }
}

三)mysql的優(yōu)化

  • 為什么要優(yōu)化:隨著實(shí)際項(xiàng)目的啟動(dòng)鹏控,數(shù)據(jù)庫(kù)經(jīng)過(guò)一段時(shí)間的運(yùn)行,最初的數(shù)據(jù)庫(kù)設(shè)置肤寝,會(huì)與實(shí)際數(shù)據(jù)庫(kù)運(yùn)行性能會(huì)有一些差異当辐,這時(shí)我們就需要做一個(gè)優(yōu)化調(diào)整

  • 數(shù)據(jù)庫(kù)優(yōu)化這個(gè)課題較大,可分為四大類:

    1. 主機(jī)性能
    2. 內(nèi)存使用性能
    3. 網(wǎng)絡(luò)傳輸性能
    4. SQL語(yǔ)句執(zhí)行性能【軟件工程師】
  • 下面列出一些數(shù)據(jù)庫(kù)SQL優(yōu)化方案:
    -1)選擇最有效率的表名順序(筆試忱鹂矗考)

    • 數(shù)據(jù)庫(kù)的解析器按照從右到左的順序處理FROM子句中的表名缘揪,F(xiàn)ROM子句中寫(xiě)在最后的表將被最先處理,在FROM子句中包含多個(gè)表的情況下,你必須選擇記錄條數(shù)最少的表放在最后义桂,如果有3個(gè)以上的表連接查詢,那就需要選擇那個(gè)被其他表所引用的表放在最后找筝。
    • 例如:查詢員工的編號(hào),姓名澡刹,工資呻征,工資等級(jí),部門(mén)名
      select emp.empno,emp.ename,emp.sal,salgrade.grade,dept.dname
      from salgrade,dept,emp
      where (emp.deptno = dept.deptno) and (emp.sal between salgrade.losal and salgrade.hisal)          
- 1)如果三個(gè)表是完全無(wú)關(guān)系的話罢浇,將記錄和列名最少的表陆赋,寫(xiě)在最后,然后依次類推
- 2)如果三個(gè)表是有關(guān)系的話嚷闭,將引用最多的表攒岛,放在最后,然后依次類推

-2)WHERE子句中的連接順序(筆試嘲蹋考)
- 數(shù)據(jù)庫(kù)采用自右而左的順序解析WHERE子句,根據(jù)這個(gè)原理,表之間的連接必須寫(xiě)在其他WHERE條件之左, 那些可以過(guò)濾掉最大數(shù)量記錄的條件必須寫(xiě)在WHERE子句的之右灾锯。
- 例如:查詢員工的編號(hào),姓名嗅榕,工資顺饮,部門(mén)名

      select emp.empno,emp.ename,emp.sal,dept.dname
      from emp,dept
      where (emp.deptno = dept.deptno) and (emp.sal > 1500)   

-3)SELECT子句中避免使用*號(hào)
- 數(shù)據(jù)庫(kù)在解析的過(guò)程中,會(huì)將*依次轉(zhuǎn)換成所有的列名,這個(gè)工作是通過(guò)查詢數(shù)據(jù)字典完成的凌那,這意味著將耗費(fèi)更多的時(shí)間 : select empno,ename from emp;

-4)用TRUNCATE替代DELETE

-5)盡量多使用COMMIT : 因?yàn)镃OMMIT會(huì)釋放回滾點(diǎn)

-6)用WHERE子句替換HAVING子句, WHERE先執(zhí)行兼雄,HAVING后執(zhí)行

-7)多使用內(nèi)部函數(shù)提高SQL效率

-8)使用表的別名 : salgrade s

-9)使用列的別名 : ename e

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市帽蝶,隨后出現(xiàn)的幾起案子赦肋,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佃乘,死亡現(xiàn)場(chǎng)離奇詭異囱井,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)趣避,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)庞呕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鹅巍,你說(shuō)我怎么就攤上這事千扶。” “怎么了骆捧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵澎羞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我敛苇,道長(zhǎng)妆绞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任枫攀,我火速辦了婚禮括饶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘来涨。我一直安慰自己图焰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布蹦掐。 她就那樣靜靜地躺著技羔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卧抗。 梳的紋絲不亂的頭發(fā)上藤滥,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音社裆,去河邊找鬼拙绊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛泳秀,可吹牛的內(nèi)容都是我干的标沪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嗜傅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谨娜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起磺陡,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后币他,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體坞靶,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年蝴悉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彰阴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拍冠,死狀恐怖尿这,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庆杜,我是刑警寧澤射众,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站晃财,受9級(jí)特大地震影響叨橱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜断盛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一罗洗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钢猛,春花似錦伙菜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至躺翻,卻和暖如春丧叽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背公你。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工踊淳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陕靠。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓迂尝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親剪芥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垄开,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • 1.簡(jiǎn)介 數(shù)據(jù)存儲(chǔ)有哪些方式?電子表格税肪,紙質(zhì)文件溉躲,數(shù)據(jù)庫(kù)榜田。 那么究竟什么是關(guān)系型數(shù)據(jù)庫(kù)? 目前對(duì)數(shù)據(jù)庫(kù)的分類主要是...
    喬震閱讀 1,726評(píng)論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法锻梳,類相關(guān)的語(yǔ)法箭券,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法疑枯,異常的語(yǔ)法辩块,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,664評(píng)論 18 399
  • 查詢基礎(chǔ) 算術(shù)運(yùn)算符 (+)(-)(*)(/) 值得注意的是:/ 在oracle中就相當(dāng)于顯示中的除法 5/2 =...
    Autism_37a1閱讀 479評(píng)論 0 0
  • 旅程废亭、左右萬(wàn)里具钥。 時(shí)差豆村、卻最多一天。 護(hù)照氓拼、印著美利堅(jiān)你画。 回首、只不過(guò)昨天桃漾。 行裝坏匪、現(xiàn)在黑色。 內(nèi)心撬统、卻仍是此間少...
    寥天皓月閱讀 232評(píng)論 2 1
  • .例1. 南非一個(gè)大學(xué)Marks Chabel教授的博士論文适滓,其內(nèi)容大多數(shù)剽竊自佛羅里達(dá)大學(xué)Kimberly La...
    黃虎閱讀 165評(píng)論 0 2