Java进阶学习第二十八天(jQuery常用AJAX的API、Java调用MySQL过程与函数、数据库SQL优化方案)

版权声明:使用本品须Jack Gao同意,违者必究 https://blog.csdn.net/Mr_GaoYang/article/details/84101739

一、jQuery常用AJAX的API

目的:简化客户端与服务端进行局部刷新的异步通讯
1、取得服务端当前时间
① 简单形式:jQuery对象.load(url)
如果是Servlet的话,采用的是GET方式
② 复杂形式:jQuery对象.load(url,sendData,function(backData,textStatus,ajax){... ...})
注意:对于load方法而言,如果请求体无参数发送的话,采用GET方式提交;如果请求体有参数发送的话,采用POST方式提交【使用load方法时,自动进行编码,无需手工编码】

public class TimeServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		System.out.println("GET");
		String name = request.getParameter("name");
		String sal = request.getParameter("sal");
		System.out.println(name+":"+sal);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String str = sdf.format(new Date());
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter pw = response.getWriter();
		pw.write(str);
		pw.flush();
		pw.close();
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		System.out.println("POST");
		String name = request.getParameter("name");
		String sal = request.getParameter("sal");
		System.out.println(name+":"+sal);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String str = sdf.format(new Date());
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter pw = response.getWriter();
		pw.write(str);
		pw.flush();
		pw.close();
	}
}
<script type="text/javascript">
		$(":button").click(function(){
			//load()方法参数一:发送的路径
			var url = "${pageContext.request.contextPath}/servlet/TimeServlet?time="+new Date().getTime();
			//load()方法参数二:以JSON文本书写的发送的参数,例如:{key:value,key:value}
			var sendDate = {
				"name" : "哈哈",
				"sal"  :  6000
			};
			//load()方法参数三:回调函数
			$("#time").load(url,sendDate,function(backData,textStatus,xmlHttpRequest){
				//回调函数参数一:backData表示服务端返回的数据,它是js对象
				//回调函数参数二:textStatus表示返回服务端状态码的文本描述,例如:success,error
				//回调函数参数三:xmlHttpRequest表示ajax中的核心对象
				//alert("backData=" + backData);//它是一个js对象
				//alert("textStatus=" + textStatus);
				//alert("xmlHttpRequest=" + xmlHttpRequest.readyState);
				//alert("xmlHttpRequest=" + xmlHttpRequest.status);
				//alert("xmlHttpRequest=" + xmlHttpRequest.responseText);//它是一个字符串
				//项目中只需要使用backDate即可				
			});			
			//$("#time").load(url,sendDate);
			//$("#time").load(url);
		});
	</script>

2、检查注册用户名和密码是否存在
$.get(url,sendData,function(backData,textStatus,ajax){... ...})
$.post(url,sendData,function(backData,textStatus,ajax){... ...})【提倡】
注意:使用get或post方法时,自动进行编码,无需手工编码

public class UserServlet extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String username = request.getParameter("username");//哈哈
		String password = request.getParameter("password");//123
		String tip = "images/MsgSent.gif";
		if("哈哈".equals(username) && "123".equals(password)){
			tip = "images/MsgError.gif";
		}
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter pw = response.getWriter();
		pw.write(tip);
		pw.flush();
		pw.close();
	}
}
<!-- 在异步提交的方式下,form标签的action和method属性没有意义-->
	<form action="01_time.jsp" method="GET">
		<table border="2" align="center">
			<tr>
				<th>用户名</th>
				<td><input type="text" name="username"/></td>
			</tr>
			<tr>
				<th>密码</th>
				<td><input type="password" name="password"/></td>
			</tr>
			<tr>
				<td colspan="2" align="center">
					<input type="button" value="检查" style="width:111px"/>
				</td>
			</tr>
		</table>
	</form>
	
	<span></span>
	
	<script type="text/javascript">
		$(":button").click(function(){
			var username = $(":text").val();//哈哈
			var password = $(":password").val();//123
			var url = "${pageContext.request.contextPath}/servlet/UserServlet?time="+new Date().getTime();
			/*手工写JSON文本
			var sendData = {
				"username" : username,
				"password" : password
			};
			*/
			var sendData = $("form").serialize();
			$.post(url,sendData,function(backDate){
				//backDate:
				//如果服务器返回html,即backDate就是string,不要解析
				//如果服务器返回json,即backDate就是object,要解析	
				//如果服务器返回xml,即backDate就是object,要解析	
				var $img = $("<img src='"+backDate+"' width='14px' height='14px'>");
				$("span").text("");
				$("span").append($img);
			});
		});
	</script>

3、jQuery对象.serialize()
① 作用:自动生成JSON格式的文本
② 注意(两个条件):为每个jQuery对象设置一个name属性,因为name属性会被认为请求参数名;必须用<form>标签元素
③ 适用:如果属性过多,强烈推荐采用这个API

4、jQuery解析XML

<?xml version="1.0" encoding="UTF-8"?>
<root>
	<city>广州</city>
	<city>深圳</city>
	<city>香港</city>
	<city>澳门</city>
	<city>台湾</city>
</root>
<script type="text/javascript">
		$(":button").click(function(){
			var url = "${pageContext.request.contextPath}/03_city.xml?time="+new Date().getTime();
			var sendData = null;
			$.get(url,sendData,function(xml){
				//用jquery中的api解析xml文件,这时的xml是js对象
				var $xml = $(xml).find("city");
				//迭代
				$xml.each(function(){
					var city = $(this).text();
					alert(city);
				});
			});
		});
	</script>

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

	<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}/struts2/findCityByProvinceRequest?time="+new Date().getTime(),
					data    : {"province":province},
					success : function(backDate,textStatus,ajax){
								//alert(backDate!=null?"收到":"为收到");	
								//alert(ajax.responseText);
								//解析json文本
								var array = backDate.setCity;
							  	var size = array.length;
							  	for(var i=0;i<size;i++){
							  		var city = array[i];
							  		var $option = $("<option>"+city+"</option>");
							  		$("#city").append($option);
							  	}
							  }
				} );
			}
		} );
	</script>
public class ProvinceCityAction extends ActionSupport{
	private String province;
	public void setProvince(String province) {
		this.province = province;
		//System.out.println("注入" + province);
	}
	//根据省份查询城市
	public String findCityByProvince() throws Exception {
		setCity = new LinkedHashSet<String>();
		if("江苏".equals(province)){
			setCity.add("镇江");
			setCity.add("苏州");
		}else if("上海".equals(province)){
			setCity.add("长宁区");
			setCity.add("黄浦区");
			setCity.add("徐汇区");
		}
		return SUCCESS;
	}
	private Set<String> setCity;
	public Set<String> getSetCity() {
		return setCity;
	}
}

二、Java调用MySQL过程与函数

1、存储过程
① # 修改mysql语句的结果符为//
mysql > delimiter //
② # 定义一个过程,获取users表总记录数,将10设置到变量count中

create procedure simpleproc(out count int)
begin
        select count(id) into count from users;
end
//

③ # 修改mysql语句的结果符为;
mysql > delimiter ;
④ # 调用过程,将结果覆给变量a,@是定义变量的符号
call simpleproc(@a);
⑤ # 显示变量a的值
select @a;
⑥ # 以下是Java调用Mysql的过程

public class TestJavaCallMysqlProc {
	public static void main(String[] args) throws Exception{
		//Java调用过程的语法,这里只有一个?号,它是输出值
		String  sql = "{call simpleproc(?)}";
		Connection conn = JdbcUtil.getConnection();
		CallableStatement cstmt = conn.prepareCall(sql);
		//这个输出的?设置类型,?号下标从1开始
		cstmt.registerOutParameter(1,Types.INTEGER);
		//执行过程的调用
		cstmt.execute();
		//接收过程的返回值
		Integer count = cstmt.getInt(1);
		//显示
		System.out.println("共有" + count + "个用户");
		JdbcUtil.close(cstmt);
		JdbcUtil.close(conn);
	}
}

2、存储函数
① # 修改mysql语句的结果符为//
mysql > delimiter //
② # 定义一个函数,完成字符串拼接

create function hello( s char(20) ) returns char(50) 
return concat('hello,',s,'!');
//

③ # 修改mysql语句的结果符为;
mysql > delimiter ;
④ # 调用函数
select hello('world');
⑤ # 以下是Java调用Mysql的函数

public class TestJavaCallMysqlFunc {
	public static void main(String[] args) throws Exception{
		String  sql = "{? = call hello(?)}";
		Connection conn = JdbcUtil.getConnection();
		CallableStatement cstmt = conn.prepareCall(sql);
		//第一个输出的?设置类型
		cstmt.registerOutParameter(1,Types.VARCHAR);
		//第二个输入的?设置值
		cstmt.setString(2,"赵君");
		//调用函数
		cstmt.execute();
		//接收返回的值
		String value = cstmt.getString(1);		
		//显示
		System.out.println(value);
		JdbcUtil.close(cstmt);
		JdbcUtil.close(conn);
	}
}

三、数据库SQL优化方案

1、选择最有效率的表名顺序(笔试常考)
数据库的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表将被最先处理,在FROM子句中包含多个表的情况下必须选择记录条数最少的表放在最后,如果有3个以上的表连接查询,那就需要选择那个被其他表所引用的表放在最后。
规则:
① 如果三个表是完全无关系的话,将记录和列名最少的表,写在最后,然后依次类推
② 如果三个表是有关系的话,将引用最多的表,放在最后,然后依次类推

2、WHERE子句中的连接顺序(笔试常考)
数据库采用自右而左的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之左,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的之右。

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

4、用TRUNCATE替代DELETE删除表中所有记录

5、尽量多使用COMMIT,因为COMMIT会释放回滚点

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

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

8、使用表的别名

9、使用列的别名

猜你喜欢

转载自blog.csdn.net/Mr_GaoYang/article/details/84101739