1

这似乎是一个非常基本的问题,但我找不到任何解决方案。我有以下代码:

package com.test.db.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCConnect
{
private Connection conn = null;
private final String uname = "root";
private final String passwd = "test@123";
private String url = "jdbc:mysql://127.0.0.1:3306/TrainDB";
private final String className = "com.mysql.jdbc.Driver";

public void initConnection()
{
    try
    {
        if(this.conn == null || this.conn.isClosed())
        {
            try
            {
                Class.forName (className).newInstance ();
                this.conn = DriverManager.getConnection(url, uname, passwd);
                System.out.println("database connection established.");
            }
            catch(SQLException sqe)
            {
                sqe.printStackTrace();
            }
            catch (InstantiationException e) 
            {
                e.printStackTrace();
            } 
            catch (IllegalAccessException e) 
            {
                e.printStackTrace();
            } 
            catch (ClassNotFoundException e) 
            {
                e.printStackTrace();
            }

        }
    }
    catch(SQLException sqle)
    {
        sqle.printStackTrace();
    }
    //return this.conn;
}

public void disconnect()
{
    if (conn != null)
        {
            try
            {
                conn.close ();
                System.out.println ("Database connection terminated");
            }
            catch (Exception e) { /* ignore close errors */ }
        }

}

public void insertData(String sql)
{
    PreparedStatement s;
    try
    {

        if(conn == null || conn.isClosed())
        {
            initConnection();
        }
        s = conn.prepareStatement(sql);
        int count = s.executeUpdate ();
        s.close ();
        System.out.println (count + " rows were inserted");
    } 
    catch (SQLException e) 
    {
        e.printStackTrace();
        if (conn != null)
        {
            try
            {
                conn.close ();
                System.out.println ("Database connection terminated");
            }
            catch (Exception se) { /* ignore close errors */ }
        }
    }

}

public ResultSet query(String sql)
{
    Statement s = null;
    try
    {
        if(this.conn == null || this.conn.isClosed())
        {
            initConnection();
        }

                    s = conn.createStatement();
        s.executeQuery(sql);
        ResultSet rs = s.getResultSet();
        System.out.println("lets see " + rs.getFetchSize());
        return rs;
    }
    catch(SQLException sq)
    {
        System.out.println("Error in query");
        return null;
    }
    finally
    {
        try {
            s.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
}

我在不同的类中使用 JDBCConnect:

import java.sql.ResultSet;
import java.sql.SQLException;

public class traininfo
{

public static void main(String[] args)
{
    JDBCConnect jdbcConn = new JDBCConnect();

    String sql = "SELECT id FROM testtable";
    ResultSet rs = jdbcConn.query(sql);
    try {
        System.out.println(rs.getFetchSize());
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    if(rs != null)
    {
        try
        {
            while(rs.next())
            {
                System.out.println(rs.getString("id"));
            }
            rs.close();
        }
        catch(SQLException sqe)
        {

        }
    }
    jdbcConn.disconnect();
}
}

我没有使用并发调用进行插入和读取。如果我在 mysql-workbench(客户端)中使用相同的查询,我会得到正确的结果,但使用提到的代码,我会得到

database connection established.
lets see 0
0
Database connection terminated

请告诉我我错过了什么?

4

3 回答 3

2

很可能是因为你在Statement使用它之前就关闭了ResultSet。奇怪的是它没有抛出异常,但这无论如何都是不正确的。

根据Statement.close 方法 JavaDoc

当 Statement 对象关闭时,其当前的 ResultSet 对象(如果存在)也将关闭。

ResultSet我建议在关闭之前使用某种回调来检索结果,例如:

public <T> T query(String sql, IResultSetHandler<T> resultSetHandler ) throws SQLException {
    Statement statement = null;
    try {
        statement = connection.createStatement();
        final ResultSet rs = connection.executeQuery(sql);
        final T result = resultSetHandler.handle(rs);
        return result;
    } finally {
        if(statement != null) {
            statement.close();
        }
    }
}

public interface IResultSetHandler<T> {
    T handle(ResultSet rs);
}

public static void main(String[] args) {
    JDBCConnect jdbcConn = new JDBCConnect();
    List<String> ids = jdbcConn.query(sql, new IResultSetHandler<List<String>>() {
        public List<String> handle(ResultSet rs) {
            List<String> ids = new ArrayList<String>();
            while(rs.next()) {
                ids.add(rs.getString("id"));
            }
            return ids;
        }
    });
}

或者使用完全相同的 commons apache dbutils 库。

于 2012-06-14T12:32:50.423 回答
2

ResultSet.getFetchSize()让您知道连接将一次获取的最大行数。您可以使用 进行设置ResultSet.setFetchSize(int)。另见官方文档。它不会告诉您总共将获得多少行。如果提取大小保持为零,则 JDBC 自行决定。

除此之外,请参阅 Yura 的回答,它解决了您问题的核心。

于 2012-06-14T12:41:57.387 回答
0

可能是因为您从未调用 InsertRows,因为它从未显示“插入了 X 行”

于 2012-06-14T12:41:26.570 回答