jQuery - AJAX、mysql的优化

一)jQuery常用AJAX-API

目的:简化客户端与服务端进行局部刷新的异步通讯

1)取得服务端当前时间

  • 简单形式:jQuery对象.load(url)
    • 返回结果自动添加到jQuery对象代表的标签中间; 如果是Servlet的话, 采用的是GET方式
  • 复杂形式:
    • jQuery对象.load(url,sendData,function(backData,textStatus,ajax){... ...}); sendData = {"user.name":"jack","user.pass":"123"}; ( 以JSON格式文本方式发送,使用POST方式发送,服务端能收到数据 )
    • load()方法参数解释:
      • 参数一:url发送到哪里去
      • 参数二:sendData发送请求体中的数据,符合JSON格式,例如:{key:value,key:value}
      • 参数三:function处理函数,类似于传统方式ajax.onreadystatechange = 处理函数
      • 其中参数三为function处理函数最多可以接收三个参数,含义如下
        • 第一个参数:服务端返回的数据,例如:backData
        • 第二个参数:服务端状态码的文本描述,例如:success、error、
        • 第三个参数:ajax异步对象,即XMLHttpRequest对象
        • 以上所有参数的名字可以任意,但必须按顺序书写,尽量做到见名知意
    • 注意:对于load方法而言,如果请求体无参数发送的话,load方法采用GET方式提交; 如果请求体有参数发送的话,load方法采用POST方式提交; 使用load方法时,自动进行编码,无需手工编码
    <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)检查注册用户名和密码是否存在

  • $.get(url,sendData,function(backData,textStatus,ajax){... ...})
  • $.post(url,sendData,function(backData,textStatus,ajax){... ...})-> 提倡
  • 注意 : 使用get或post方法时,自动进行编码,无需手工编码

3)jQuery对象.serialize()

  • 作用:自动生成JSON格式的文本
  • 注意:为每个jQuery对象设置一个name属性,因为name属性会被认为请求参数名
  • 注意:必须用<form>标签元素
  • 适用:如果属性过多,强烈推荐采用这个API
    <script type="text/javascript">
        //定位按钮,同时添加单击事件
        $(":button").click(function(){
            //获取用户名和密码
            var username = $(":text:first").val();
            var password = $(":text:last").val();
            //去空格
            username = $.trim(username);
            password = $.trim(password);
            //异步发送到服务端
            var url = "${pageContext.request.contextPath}/checkRequest?time="+new Date().getTime();
            /*手工书写JSON文本
            var sendData = {
                "user.username":username,
                "user.password":password
            };
            */
            /*工具生成JSON文本*/
            var sendData = $("form").serialize();
            $.post(url,sendData,function(backData,textStatus,ajax){
                //backData是一个JSON文本/对象,你得通过.号访问其属性值
                var tip = backData.tip;
                //创建img节点
                var $img = $("![](" + tip + ")")
                //清空span节点中的内容
                $("span").text("");
                //将img节点添加到span节点中
                $("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;
    }
    /**
     * 检查注册用户名和密码是否存在
     */
    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文件转成jquery对象,目的是用jquery api解析xml文件
                var $xml = $(backData);
                var $city = $xml.find("city");
                $city.each(function(){
                    //获取每一个city节点
                    var city = $(this).text();
                    alert(city);
                });
                */
                var xml = ajax.responseXML;
                var $xml = $(xml);
                var $city = $xml.find("city");
                $city.each(function(){
                    //获取每一个city节点
                    var city = $(this).text();
                    alert(city);
                });
            });
        });
    </script>

5)省份-城市,基于jQuery的AJAX二级联动,用Struts2整合AJAX【非数据库版】

  • js :
    <select id="province">
        <option>选择省份</option>
        <option>广东</option>
        <option>湖南</option>
    </select>
    <select id="city">
        <option>选择城市</option>
    </select>
<script type="text/javascript">
        $("#province").change(function(){
            //删除原城市下拉框中的内容,除第一项外
            $("#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对象
                        var city = backData.cityList;
                        //jquery对象
                        var $city = $(city);
                        //each()
                        $city.each(function(){
                            //this表示每个城市
                            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("邵阳");
            cityList.add("浏阳");
        }
        return "ok";
    }
    private List<String> cityList;
    public List<String> getCityList() {
        return cityList;
    }
    /**
     * var backData = {
     *                   "cityList":["邵阳","浏阳"]
     *                }
     */
}
  • struts :
<struts>
   <package name="timePackage" extends="json-default" namespace="/">
        <global-results>
            <result name="ok" type="json"/>
        </global-results>

        <!-- 获取服务端时间 -->
        <action 
            name="loadTimeRequest" 
            class="cn.itcast.javaee.js.time.TimeAction" 
            method="loadTimeMethod"/>

        <!-- 检查用户名和密码是否存在 -->
        <action 
            name="checkRequest" 
            class="cn.itcast.javaee.js.register.RegisterAction" 
            method="checkMethod"/>
            
        <!-- 根据省份查询城市 -->   
        <action 
            name="findCityByProvince" 
            class="cn.itcast.javaee.js.provincecity.ProvinceCityAction" 
            method="findCityByProvince"/>
   </package>
</struts>

二)掌握Java调用Oracle过程与函数

  • 写一个计算个人所得税的应用
    • sql :
--定义过程
create or replace procedure get_rax(salary in number,rax out number)
as
    --需要交税的钱
    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;
/
--调用过程
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号员工的的姓名,职位,月薪
    • sql语句 :
--定义函数
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;
/
--调用函数
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的优化

  • 为什么要优化:随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们就需要做一个优化调整

  • 数据库优化这个课题较大,可分为四大类:

    1. 主机性能
    2. 内存使用性能
    3. 网络传输性能
    4. SQL语句执行性能【软件工程师】
  • 下面列出一些数据库SQL优化方案:
    -1)选择最有效率的表名顺序(笔试常考)

    • 数据库的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表放在最后,如果有3个以上的表连接查询,那就需要选择那个被其他表所引用的表放在最后。
    • 例如:查询员工的编号,姓名,工资,工资等级,部门名
      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)如果三个表是完全无关系的话,将记录和列名最少的表,写在最后,然后依次类推
- 2)如果三个表是有关系的话,将引用最多的表,放在最后,然后依次类推

-2)WHERE子句中的连接顺序(笔试常考)
- 数据库采用自右而左的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之左, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的之右。
- 例如:查询员工的编号,姓名,工资,部门名

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

-3)SELECT子句中避免使用*
- 数据库在解析的过程中,会将*依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间 : select empno,ename from emp;

-4)用TRUNCATE替代DELETE

-5)尽量多使用COMMIT : 因为COMMIT会释放回滚点

-6)用WHERE子句替换HAVING子句, WHERE先执行,HAVING后执行

-7)多使用内部函数提高SQL效率

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,694评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,531评论 18 399
  • 查询基础 算术运算符 (+)(-)(*)(/) 值得注意的是:/ 在oracle中就相当于显示中的除法 5/2 =...
    Autism_37a1阅读 470评论 0 0
  • 旅程、左右万里。 时差、却最多一天。 护照、印着美利坚。 回首、只不过昨天。 行装、现在黑色。 内心、却仍是此间少...
    寥天皓月阅读 224评论 2 1
  • .例1. 南非一个大学Marks Chabel教授的博士论文,其内容大多数剽窃自佛罗里达大学Kimberly La...
    黄虎阅读 160评论 0 2