当前位置: 代码迷 >> Java Web开发 >> 再利用JavaBean连接查询数据库时的一些疑义
  详细解决方案

再利用JavaBean连接查询数据库时的一些疑义

热度:91   发布时间:2016-04-16 22:01:56.0
再利用JavaBean连接查询数据库时的一些疑问
以下是Bean的代码:
package ch08;
import java.sql.*;


public class DBConnectionManager {
private String driverName="com.mysql.jdbc.Driver";
private String url="jdbc:mysql://localhost:3306/eims";
private String userName="root";
private String password="sias";
Connection con;
Statement st;
ResultSet rs;
public void setDriverName(String newDriverName){
driverName=newDriverName;
}
public String getDriverName(){
return driverName;
}
public void setUrl(String newUrl){
url=newUrl;
}
public String getUrl(){
return url;
}
public void setUserName(String newUserName){
userName=newUserName;
}
public String getUserName(){
return userName;
}
public void setPassword(String newPassword){
password=newPassword;
}
public String getPassword(){
return password;
}
//获得数据库连接
public Connection getConnection(){  //创建数据库连接
try{
Class.forName(driverName);
return DriverManager.getConnection(url,userName,password);
}catch(Exception e){
System.out.print("连接数据库失败"+e.getMessage());
return null;
}
}
public ResultSet getResult(String sql){  //查询数据库
try{
con=DriverManager.getConnection(url,userName,password);  //这一行不可少
st=con.createStatement();
rs=st.executeQuery(sql);

}catch(Exception e1){
System.out.print("无法把查询发送至数据库并获得结果"+e1.getMessage());
}
return rs;
}
}

下面是JSP的代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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数据库</title>
</head>
<body align="center">
<h1>员工查询</h1>
<table border="2">
<tr>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>学历</th>
<th>部门</th>
<th>职务</th>
</tr>
<jsp:useBean id="connection" class="ch08.DBConnectionManager" scope="page"/>

<%
connection.getConnection();
String sql="select staffName,staffSex,staffAge,staffEducation,staffDepartment,staffDuty from staff";
ResultSet rs=connection.getResult(sql);
while(rs.next()){
%>
<tr>
<td><%=rs.getString("staffName") %></td>
<td><%=rs.getString("staffSex") %></td>
<td><%=rs.getString("staffAge") %></td>
<td><%=rs.getString("staffEducation") %></td>
<td><%=rs.getString("staffDepartment") %></td>
<td><%=rs.getString("staffDuty") %></td>
</tr>
<%
}
rs.close();
%>
</table>
</body>
</html>

疑问是:
1.Bean里的con、st、rs什么时候在哪里调用close()方法;
2.在JSP页面里,rs为什么还得重新ResultSet一下,在Bean里已经声明了;
3.代码有没有纰漏、冗余或不规范的地方?
------解决方案--------------------
1.在操作完数据库关闭,比如执行了executeUpdate或者遍历完结果集,就是说用完之后,就完毕,从外到内一次关闭。
2.你不声明一个ResultSet对象去接收结果集的话,拿什么遍历?
3.还有很多地方可以优化,比如加载驱动放在静态块,通过PreparedStatement做动态参数赋值,还少一个update的方法。想封装一个比较好的DAO需要大量的工作经验和编码功底,说实话这个DAO差的挺远,连事务的代码都没封装根本不能用。
------解决方案--------------------
bean里面只是声明这些方法或者属性,并没有调用
就比如,我会抽烟,但是目前我没有抽烟,等我点烟然后开始吸烟,才要处理
------解决方案--------------------
1、使用完不用了就关闭了,一般放在finally方法中
2、你的Bean中声明了ResultSet但并没有遍历ResultSet,你是把它交给了其他地方遍历
3、Class.forName(driverName);放在静态代码块中,只需加载一次就可以了,你的getConnection()方法会返回null,但你使用时并没有判断返回的connection是否为null,另外你的资源关闭方法也没有放在finally方法中,这种连接模版网上有很多示例,你可以参考参考
------解决方案--------------------

static{  Class.forName(driverName);
}
 public Connection getConnection(){  //创建数据库连接
        try{
          
           con=DriverManager.getConnection(url,userName,password);
          return con;
        }catch(Exception e){
            System.out.print("连接数据库失败"+e.getMessage());
            throw new RuntimeException(e);
        }
    }
    public ResultSet getResult(String sql){  //查询数据库
        try{
           // con=DriverManager.getConnection(url,userName,password);  //这一行不可少
       if(conn==null){
  相关解决方案