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

ResultSet.getFetchSize()接続が一度にフェッチする行の最大数がわかります。で設定できますResultSet.setFetchSize(int)公式ドキュメントも参照してください。合計で何行になるかはわかりません。フェッチ サイズがゼロのままの場合、JDBC が独自に決定します。

それ以外は、問題の核心に対処するユラの回答を参照してください。

于 2012-06-14T12:41:57.387 に答える
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 に答える
0

「X行が挿入された」ことを決して示さないため、InsertRowsを呼び出さないことが原因である可能性があります

于 2012-06-14T12:41:26.570 に答える