2012-06-14 5 views
1

Это очень простой вопрос, но я не мог найти для него никакого разрешения. я следующий код со мной:MySQL JDBC возвращает 0 результатов

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 = "[email protected]"; 
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-верстаке (клиент), я получаю правильные результаты, но используя упомянутый код, я получаю

database connection established. 
lets see 0 
0 
Database connection terminated 

Пожалуйста, предложите мне, что мне не хватает?

+0

Хм .. всего лишь минута .. – Sridhar

+0

Может быть, id не является строкой? Попробуйте rs.getInt («id») или некоторые такие. – Sridhar

+0

не повезло .. :-( infact, System.out.println («позволяет видеть» + rs.getFetchSize()); returnign 0 – piyush

ответ

2

Скорее всего, это потому, что вы закрываете Statement, прежде чем используете его ResultSet. Странно, что это не исключение, но это не так.

По Statement.close method JavaDoc:

Когда заявление объект закрыт, его текущий объект 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; 
     } 
    }); 
} 

Или использовать достояние апачского dbutils библиотеку, которая делает то же самой.

+0

Я использую s.close(), наконец, даже если я удалю этот результат – piyush

+0

Отредактированный мой ответ, пожалуйста, проверьте – Yura

+0

Согласовано - когда вы закрываете инструкцию перед возвратом набора результатов, вы никогда ничего не получите в результирующем наборе, и, как в соответствии с другим ответом, это совершенно разумно для getFetchSize чтобы вернуть 0, даже если вы сопоставили сотни строк. – Woody

0

Может быть, потому что вы никогда не называют InsertRows, так как он никогда не показывает, что «X строки были вставлены»

+0

таблицы не были созданы через jdbc. – piyush

1

ResultSet.getFetchSize() позволяет узнать количество строк, что соединение будет получать сразу максимум. Вы можете установить его с помощью ResultSet.setFetchSize(int). См. Также the official documentation. Это не говорит вам, сколько строк вы получите. Если размер выборки остается равным нулю, JDBC принимает решение самостоятельно.

Кроме этого, обратитесь к ответу Юры, в котором рассматривается ядро ​​вашей проблемы.

Смежные вопросы