如何仅为结果集的一个字段查询数据库? (JAVA ODBC)

时间:2011-04-07 02:42:53

标签: java jdbc

我正在进行一项任务(并尝试调试)。我有一个JComboBox,我只需填写ISBN号。数据库返回ISBN,BookTitle,QuantityOnHand和Price。我要创建一个方法(loadCombo),用于加载comboBox(如我所说)只有ISBN号。我写了这个小片段:

    public static void loadCombo(JComboBox box)
{
   String query = "SELECT * FROM Books";

   try
   {
       result = statement.executeQuery(query);
       result.getString(1);            
       addISBN(result,box);
   }
   catch(SQLException sqlex)  {sqlex.printStackTrace();}
    public static void addISBN(ResultSet result,JComboBox box)
{
    try
    {
         while(result.next()) {box.addItem(result);}
    }
    catch(SQLException e)   {e.printStackTrace();}
}

然而,这会引发大量错误。我在这做错了什么?我以为我正在创建一个resultSet(结果),然后获取第一个字段(result.getString(1)),然后将结果集和组合框抛出到我的addISBN方法,该方法将结果集添加到我的comboBox中?

所以我做了第一个回答所说的内容(感谢您的建议,我想我应该更仔细地阅读我的作业!)。但是,我现在崩溃了addISBN方法。我的ISBN文本框有14行,都说

'sun.jdbc.odbc.JdbcOdbcReseltSet@13f9460'

4 个答案:

答案 0 :(得分:3)

您的UI和组合框不应位于一百码的持久性代码中。它被称为分层或关注点分离。告诉你的教授,它被认为是现实世界中的最佳实践。

这段代码令人发指。我会写得更像这样。请注意我如何在创建它们的方法范围内关闭这些资源。这很重要。任何JDBC类都不应该从持久性包中泄漏出来。将结果加载到数据结构中(在本例中为ISBN的字符串列表)。

Java是一种面向对象的语言。 Book模型类在哪里?

package persistence;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * BookDao
 * @author Michael
 * @since 4/6/11
 */
public class BookDao
{
    public static final String SELECT_ALL_BOOKS = "SELECT * FROM Books";

    private Connection connection;

    public BookDao(Connection connection)
    {
        this.connection = connection;
    }

    public List<String> find() throws SQLException
    {
        List<String> isbn= new ArrayList<String>();

        Statement statement = null;
        ResultSet result = null;

        try
        {
            statement = this.connection.createStatement();
            result = statement.executeQuery(SELECT_ALL_BOOKS);
            while (result.next())
            {
                isbn.add(result.getString(1));
            }
        }
        finally
        {
            close(result);
            close(statement);
        }

        return isbn;
    }

    private static void close(ResultSet result)
    {
        try
        {
            if (result != null)
            {
                result.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    private static void close(Statement statement)
    {
        try
        {
            if (statement != null)
            {
                statement.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
}

答案 1 :(得分:1)

可能想构建一个合适的SQL语句。而不是SELECT * FROM Books,使用SELECT [db中的列名] FROM Books

编辑:他的评论中写了什么单位。

答案 2 :(得分:1)

删除result.getString(1);线。使用ResultSet,您需要先执行next()才能访问结果集元素,因为next()之前没有当前行;

此外,对于未来,如果您发布异常详细信息,则更有可能获得良好的回复。

答案 3 :(得分:0)

String myStr = result.getString(1);

然后使用myStr代替result。仅使用result导航到下一行。

参考 - ResultSet