我写了个jdbc连接类,如下:
public class MySqlConn {
public Connection conn = null;
public Statement stmt = null;
public ResultSet rs = null;
public PreparedStatement pstmt=null; public MySqlConn(){
try{
Class.forName("org.gjt.mm.mysql.Driver");
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/invertedindex?autoReconnect=true","root","sa");
stmt=conn.createStatement();
}
catch(Exception e){
e.printStackTrace();
}
}

public ResultSet executeQuery(String sql) throws Exception {
rs = stmt.executeQuery(sql);
        return rs;
    }
public void closeResultSet(){
if(this.rs!=null){
try{
this.rs.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}

public void closePreparedStatement(){
if(pstmt!=null){
try{
pstmt.close();
}
catch(SQLException e){
e.printStackTrace();
}
}
}
public void closeStatement(){
if(stmt!=null){
try{
stmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
public void closeConn(){
                           if(conn!=null){
try{
conn.close();
}
catch(SQLException e){
e.printStackTrace();
}
}
}
在主函数里我作如下操作:
public static void main(String[] args) throws Exception {
MySqlConn mysql=new MySqlConn();
String sql="select DocId from doc";
while(mysql.executeQuery(sql).next()){
System.out.println(mysql.executeQuery(sql).getInt("DocId"));
}
mysql.closeResultSet();
mysql.closeStatement();
mysql.closeConn();
if(mysql.conn!=null){
System.out.print(true);
} }
像上面那样直接while(mysql.executeQuery(sql).next())是不对的,那我应该怎样用连接类里写的那个返回结果集的方法呢?还有在做了关闭ResultSet,关闭Statement,和Conn后为什么Statement,Conn等并没有真正close掉?这个连接类到底应该怎么写?先在这里谢过

解决方案 »

  1.   

    while(mysql.executeQuery(sql).next()) 是肯定不对啦。因为它每次都是去用Statement去执行sql一次。而不是说指针往下走。你这应该是个死循环吧。除非那个sql一行数据也查不出来。
    这个问题解决了,再说关闭ResultSet,关闭Statement,和Conn的那个问题吧。
    还有问题的话,贴错误信息
      

  2.   

    ResultSet rs = mysql.executeQuery(sql);
    while(rs.next())
    {
    System.out.println(rs.getInt("DocId"));
    }rs.close();
    mysql.closeStatement();
    mysql.closeConn();
    ------------------------------------------------------------
    public void closeConn(){
                               if(conn!=null){
    try{
    conn.close();
    conn = null;//关闭加这句
    }
    catch(SQLException e){
    e.printStackTrace();
    }
    }
    }
      

  3.   

    楼上说得没错,但是如何判断一个statement,resultset或者connection是否关闭了
      

  4.   

    理论来讲statement关了以后,那么他的 smt应该==null。其他类似。
      

  5.   

    先谢谢楼上的回答,那如果我在主类再定义一个ResultSet的话,我在连接类里写的那个ResultSet岂不是没有意义了阿?那个连接类里的关闭ResultSet的方法也没有意义了阿,它关的不是我主类里定义的那个ResultSet
      

  6.   

    你要不想在主类里再定义一个ResultSet的话
    那个方法改成
    public void executeQuery(String sql) throws Exception {
    this.rs = stmt.executeQuery(sql);}主类改成:
    public static void main(String[] args) throws Exception {
    MySqlConn mysql=new MySqlConn();
    String sql="select DocId from doc";
    mysql.executeQuery(sql)
    while(mysql.rs.next()){
    System.out.println(mysql.rs.getInt("DocId"));
    }
    mysql.closeResultSet();
    mysql.closeStatement();
    mysql.closeConn();
    if(mysql.conn!=null){
    System.out.print(true);
    }}应该就可以了
      

  7.   

    我的情况是在一个sql过程中嵌套其他多个sql过程,比如:
    mysql.pstmt=mysql.conn.prepareStatement(sql);
    mysql.pstmt.setString(1,***);
    mysql.rs=mysql.pstmt.executeQuery(sql);
    while(mysql.rs.next()){
    //在这里我还有其他的sql过程,问题是这个时候其实mysql.pstmt和mysql.rs已经有值了,我在做其他sql过程的时候必然要对他们重新赋值,这样就不对了,所以不知道到底怎么用这个连接类
    }
      

  8.   

    mysql.pstmt=mysql.conn.prepareStatement(sql);
    mysql.pstmt.setString(1,***);
    mysql.rs=mysql.pstmt.executeQuery(sql);mysql.pstmt2 =mysql.conn.Statement();while(mysql.rs.next()){
    //在这里我还有其他的sql过程,问题是这个时候其实mysql.pstmt和mysql.rs已经有值了,我在做其他sql过程的时候必然要对他们重新赋值,这样就不对了,所以不知道到底怎么用这个连接类
    mysql.rs2=mysql.pstmt2.executeQuery(sql);
    .....
    }
      

  9.   

    mysql这个连接类里面当然不会有定义pstmt2的啦
      

  10.   

    mysql.pstmt=mysql.conn.prepareStatement(sql); 
    mysql.pstmt.setString(1,***); 
    mysql.rs=mysql.pstmt.executeQuery(sql); mysql.pstmt2   =mysql.conn.Statement(); while(mysql.rs.next()){ 
    //在这里我还有其他的sql过程,问题是这个时候其实mysql.pstmt和mysql.rs已经有值了,我在做其他sql过程的时候必然要对他们重新赋值,这样就不对了,所以不知道到底怎么用这个连接类 
    mysql.rs2=mysql.pstmt2.executeQuery(sql); 
    ..... 
    } 这里还有一个问题,一个connection能创建多少个statement?有限制没有?