当前位置: 代码迷 >> Java Web开发 >> Statement stmt=null的作用是什么?该如何解决
  详细解决方案

Statement stmt=null的作用是什么?该如何解决

热度:1065   发布时间:2016-04-16 22:05:37.0
Statement stmt=null的作用是什么?
本帖最后由 u014297219 于 2014-07-28 09:57:42 编辑
<%@ 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、Statement和Resultset三个对象赋空值?


如果我说在本例中可以不用这么写,会不会有点失望?也就是说按照你后面注释的改法在本例中没啥差异。

不过你给的例子中倒是真有严重问题,就是没有保证资源的绝对释放,也就是说应该类似于:
Connection con=null;
....
try {
     con=DriverManager.getConnection(url,"root","");
     .....
}  finally {
     if (con != null) {
          con.close();
  相关解决方案