Statement stmt=null的作用是什么?

碳酸盐 2014-07-28 09:55:14
<%@ 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三个对象赋空值?
...全文
1980 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
碳酸盐 2014-07-30
  • 打赏
  • 举报
回复
受益匪浅,谢谢各位大神的解答。
文哥xxx 2014-07-29
  • 打赏
  • 举报
回复
Connection con=null; Statement stmt=null; ResultSet rs=null; 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){ //处理逻辑 }finally{ conn.close(); //这里如果conn没有 赋值为空 则会编译报错 rs.close() ; //这里如果conn没有 赋值为空 则会编译报错 }
S117 2014-07-29
  • 打赏
  • 举报
回复
那不是成员变量吧,你在方法中声明变量必须显示初始化吧,所以是不能省略的
姜小白- 2014-07-28
  • 打赏
  • 举报
回复
Connection con=null; 声明对象变量,后面指向一个DriverManager.getConnection(url,"root",""); 的对象引用 先定义null ,再指向对象的引用,是因为3楼的代码方式,因为try catch 的原因。 如果 直接将异常抛出的话,那可以直接 Connection con = DriverManager.getConnection(url,"root","");
高坚果兄弟 2014-07-28
  • 打赏
  • 举报
回复
在你这段代码里 前三条声明没有起到什么作用,完全可以用你后三条注释的的方法写。 最能解释这种写法的估计就是3楼这段代码了,如果查询操作失败,catch块里面可能要用到con这些变量,而且要有finally块来清理资源,关闭con,或者用try with resource这种写法,不知道现在jsp里面支不支持。
Stone Lio 2014-07-28
  • 打赏
  • 举报
回复
声明一个变量而已
LOVE-漂泊 2014-07-28
  • 打赏
  • 举报
回复
作用时 及时清空缓存内容 释放资源 同时也起到全局变量 可以省略 但是介于效率问题 最好还是养成这样编码的好习惯
read_you2011 2014-07-28
  • 打赏
  • 举报
回复
你这么写当然可以省略了,这么写代码不健壮。 应该这么写

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){
  //处理逻辑
}
这时就不能省略了。
MiceRice 2014-07-28
  • 打赏
  • 举报
回复
引用 楼主 u014297219 的回复:
为什么首先对Connection、Statement和Resultset三个对象赋空值?
如果我说在本例中可以不用这么写,会不会有点失望?也就是说按照你后面注释的改法在本例中没啥差异。 不过你给的例子中倒是真有严重问题,就是没有保证资源的绝对释放,也就是说应该类似于:
Connection con=null;
....
try {
     con=DriverManager.getConnection(url,"root","");
     .....
}  finally {
     if (con != null) {
          con.close();
     }
}
至于异常要不要在此捕获并处理,这个看程序设计了。我也看过专门写异常处理页面来统一处理的。 因为俺的例子里面也有 =null,所以在关于 = null的一些补充说明: Java代码中,定义局部变量且没有赋予初始值的情况下,编译是通不过的,比如:
public void something() {
    String str;
    if (1==1) {
         str = "Hello";
    }
    System.out.println(str);
}
编译器会认为,有可能因为分支不成立而导致后面访问了“未初始化变量”,注意未初始化变量跟null还是有区别滴。 不过类成员变量没这个问题,会被自动初始化。
tony4geek 2014-07-28
  • 打赏
  • 举报
回复
先声明然后初始化创建
皮皮 2014-07-28
  • 打赏
  • 举报
回复
主要用意是:申明变量。 上面可以 rs=stmt.executeQuery(sql); //上面省略后,该语句前加上Resultset 也可以

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧