<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="gbk"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>通过MySql的JDBC驱动访问数据库</title>
</head>
<body>
<h2>使用MySql的JDBC驱动访问数据库</h2>
<hr>
<table border="2" bgcolor="ccceee" align="center">
<tr>
<th width="87" align="center">学生ID</th>
<th width="87" align="center">学生姓名</th>
<th width="87" align="center">成绩</th>
<th width="87" align="center">班级</th>
</tr>
<%
Connection con=null; //作用是什么,能否省略,后面用Connection直接创建con对象?
Statement stmt=null; //作用是什么,能否省略,后面用Statement直接创建stmt对象?
ResultSet rs=null; //作用是什么,能否省略,后面用Resultset直接创建rs对象?
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/student?useUnicode=true&charaterEncoding=gbk";
con=DriverManager.getConnection(url,"root",""); //上面省略后,该语句前加上Connection
stmt=con.createStatement(); //上面省略后,该语句前加上Statement
String sql="select * from 成绩表 where 成绩>90";
rs=stmt.executeQuery(sql); //上面省略后,该语句前加上Resultset
while(rs.next()){
%>
<tr>
<td><%=rs.getString("学生ID") %></td>
<td><%=rs.getString("学生姓名") %></td>
<td><%=rs.getString("成绩") %></td>
<td><%=rs.getString("班级") %></td>
</tr>
<%
}
rs.close();
con.close();
stmt.close();%>
</table>
</body>
</html>
为什么首先对Connection、Statement和Resultset三个对象赋空值?
------解决方案--------------------
主要用意是:申明变量。
上面可以
rs=stmt.executeQuery(sql);
//上面省略后,该语句前加上Resultset 也可以
------解决方案--------------------
你这么写当然可以省略了,这么写代码不健壮。
应该这么写
Connection con=null; //作用是什么,能否省略,后面用Connection直接创建con对象?
Statement stmt=null; //作用是什么,能否省略,后面用Statement直接创建stmt对象?
ResultSet rs=null; //作用是什么,能否省略,后面用Resultset直接创建rs对象?
try{
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/student?useUnicode=true&charaterEncoding=gbk";
con=DriverManager.getConnection(url,"root",""); //上面省略后,该语句前加上Connection
stmt=con.createStatement(); //上面省略后,该语句前加上Statement
String sql="select * from 成绩表 where 成绩>90";
rs=stmt.executeQuery(sql);
}catch(Exception e){
//处理逻辑
}
这时就不能省略了。
------解决方案--------------------
作用时 及时清空缓存内容 释放资源
同时也起到全局变量
可以省略 但是介于效率问题 最好还是养成这样编码的好习惯
------解决方案--------------------
在你这段代码里 前三条声明没有起到什么作用,完全可以用你后三条注释的的方法写。
最能解释这种写法的估计就是3楼这段代码了,如果查询操作失败,catch块里面可能要用到con这些变量,而且要有finally块来清理资源,关闭con,或者用try with resource这种写法,不知道现在jsp里面支不支持。
------解决方案--------------------
Connection con=null; 声明对象变量,后面指向一个DriverManager.getConnection(url,"root",""); 的对象引用
先定义null ,再指向对象的引用,是因为3楼的代码方式,因为try catch 的原因。
如果 直接将异常抛出的话,那可以直接
Connection con = DriverManager.getConnection(url,"root","");
------解决方案--------------------
如果我说在本例中可以不用这么写,会不会有点失望?也就是说按照你后面注释的改法在本例中没啥差异。
不过你给的例子中倒是真有严重问题,就是没有保证资源的绝对释放,也就是说应该类似于:
Connection con=null;
....
try {
con=DriverManager.getConnection(url,"root","");
.....
} finally {
if (con != null) {
con.close();