JDBC + Swing:无法获取表格内容

Posted

技术标签:

【中文标题】JDBC + Swing:无法获取表格内容【英文标题】:JDBC + Swing: Not able to get table contents 【发布时间】:2013-03-12 10:50:53 【问题描述】:

我正在学习 JDBC,对它完全陌生。我非常了解 mysql。我的小程序(选项卡 2)中有一个搜索表单,用于搜索食物。当我单击搜索时,我希望它从数据库中搜索确切的食物并单独返回该特定行的表格内容。但我没有得到任何结果。只打开一个空框架。但是当我将查询作为“SELECT * FROM table”时,我得到了完整的表。但我只想要一行,即被搜索的那一行。谁能告诉我哪里出错了?这是我的代码:

    import java.awt.*;
    import java.awt.event.*;
    import java.sql.DriverManager;
    import java.util.Vector;
    import javax.swing.*;
    import com.mysql.jdbc.*;

    public class Tryout extends JFrame  implements ActionListener 

            private static final long serialVersionUID = 1L;

            final Vector columnNames = new Vector();
            final Vector data = new Vector();

            private JTabbedPane tabbedPane = new JTabbedPane();
            private JPanel inputpanel;
            private JPanel searchpanel;
            public String s;

            public Tryout()            
                    inputpanel = createPage1();
                    searchpanel = createPage2();
                    tabbedPane.addTab("Input Form", inputpanel);
                    tabbedPane.addTab("Search Form", searchpanel);
                    this.add(tabbedPane, BorderLayout.CENTER);           
            

            public JPanel createPage1()            
                JPanel panel = new JPanel();
                panel.setLayout(new GridBagLayout());
                GridBagConstraints c = new GridBagConstraints();
                //Some code
                return panel;            
            

            public JPanel createPage2()       

                    JPanel panel = new JPanel();
                    panel.setLayout(new GridBagLayout());
                    GridBagConstraints c = new GridBagConstraints();
                    c.anchor = GridBagConstraints.LINE_START;
                    c.weightx = 0.5;
                    c.weighty = 0.5;
                    JLabel region = new JLabel("Enter Region"); 
                    c.anchor = GridBagConstraints.FIRST_LINE_START;
                    c.gridx = 0;
                    c.gridy = 0;
                    panel.add(region, c);
                    JTextField field = new JTextField(20);
                    c.anchor = GridBagConstraints.FIRST_LINE_START;
                    c.gridx = 1;
                    c.gridy = 0;
                    panel.add(field, c);
                    JButton search = new JButton("SEARCH");               
                    c.anchor = GridBagConstraints.FIRST_LINE_START;
                    c.gridx = 2;
                    c.gridy = 0;
                    panel.add(search, c);
                    s = field.getText();
                    search.addActionListener(new ActionListener() 

                        public void actionPerformed(ActionEvent ae)

                        try
                        Connection con = null;
                        Class.forName("com.mysql.jdbc.Driver");
                        con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/delikat", "root", "");
                        PreparedStatement statement = (PreparedStatement) con.prepareStatement("SELECT * FROM delicious WHERE name = ?");
statement.setString(1,s);
ResultSet rs= (ResultSet) statement.executeQuery();
                        ResultSetMetaData md = (ResultSetMetaData) rs.getMetaData();
                        int columns = md.getColumnCount();
                        for (int i = 1; i <= columns; i++) 
                        columnNames.addElement( md.getColumnName(i) );
                        
                        while (rs.next()) 
                        Vector row = new Vector(columns);
                        for (int i = 1; i <= columns; i++) 
                        row.addElement( rs.getObject(i) );
                        
                        data.addElement( row );
                        
                        rs.close();
                        statement.close();
                        
                        catch(Exception e) 
                        JFrame tab=new JFrame();
                        JTable table = new JTable(data, columnNames);
                        JScrollPane scrollPane = new JScrollPane( table );
                        tab.add( scrollPane );
                        tab.setVisible(true);
                        tab.setSize(300,100);
                        
                        );
                    return panel;
            

            public static void main(String args[]) 
                    SwingUtilities.invokeLater(new Runnable() 
                            @Override
                            public void run() 
                                    Tryout ex = new Tryout();
                                    ex.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                    ex.setSize(500,500);
                                    ex.setVisible(true);
                            
                    );
                   
    

这是我的桌子:

另外,我正在尝试在搜索表单下方的面板中显示表格,但是当我添加时它会出错

panel.add(scrollpane);

我该如何解决这个问题?

谢谢

【问题讨论】:

问题出在 SQL 还是您的 GUI 代码?只需在查询中添加一个 println() 语句来验证是否正在创建模型。此外,您应该使用 JDialog(而不是 JFrame)作为弹出窗口。一个应用程序应该只有一个主 JFrame。 这里的问题主要是SQL。 因此,摆脱所有 Swing 代码并发布您的 SSCCE,以显示您如何构建和执行 SQL。除非您隔离问题,否则您无法解决问题。人们已经就使用 PrepearedStatement 给了你建议。您所做的只是说它不起作用,但您甚至还没有发布您正在使用的代码。我们猜不出你在做什么。 我已经更新了我的代码,使用 PreparedStatement 的代码。我也用谷歌搜索了 PreparedStatements。好的,我的查询是对的。它在 mysql 编译器中运行良好。所以,我仍然无法弄清楚我的代码哪里出错了。你说的我都做了。 【参考方案1】:

Sudhanshu 的意思是:

PreparedStatement statement = con.preparedStatement("SELECT * FROM delicious WHERE name = ?");
statement.setString(1,s);
ResultSet rs= (ResultSet) statement.executeQuery();

【讨论】:

我这样做了,结果集行出现错误。它说 st 不存在。所以我将语句更改为 st,然后它仍然给出错误,要求我从 executeQuery 中删除该争论。还是没有得到我想要的。 :( @trollster 你能快速查看一些使用 PreparedStatement 的教程吗,它很简单? 是的,我刚才检查了 PreparedStatement。将我的代码更新为: PreparedStatement statement = (PreparedStatement) con.prepareStatement("SELECT * FROM sweet WHERE name = s"); statement.setString(1,s); ResultSet rs= (ResultSet) statement.executeQuery();还是没有。 等等,让我自己做更多的研究。 不!不是“选择 * FROM 美味 WHERE 名称 = s” 请写“选择 * FROM 美味 WHERE 名称 = ?”问号是绝对必要的……【参考方案2】:

如果它的类型是字符串(varchar),则括起来的名称是引号。在这种情况下最好使用 PreparedStatement。

【讨论】:

你能把那行贴出来吗?我找不到你。 它是带有 WHERE 子句的 SELECT。使用 PreparedStatement 而不是 Statement。 s 的值必须用引号引起来。 当我这样做时:ResultSet rs= (ResultSet) st.executeQuery("SELECT * FROM sweet WHERE name = 's'");我得到一个带有字段名称但没有值的框架 不,应该是"select * from delicious where name = '" + s + "'" 我这样做了,但没有用: PreparedStatement st = (PreparedStatement) con.createStatement(); ResultSet rs= (ResultSet) st.executeQuery("select * from nice where name = '" + s + "'");【参考方案3】:

基本调试。您是否显示了 PreparedStatement 中使用的“s”的值?

s = field.getText();

据我所知,这个语句是在你构建 GUI 时执行的,这没有任何意义,因为用户甚至没有在这个文本字段中输入任何文本。

实际调用 SQL 时需要执行该语句。

【讨论】:

等等,我有一个文本字段。我正在输入一些东西,我将该值存储在“s”变量中。然后我在查询中使用它。但根据preparedstatement的事情,Stefan让我用“?”单独标记。尽管如此,我都尝试了。同样的事情,具有字段名称但没有值的表。 好的,当我将查询直接输入为“SELECT * FROM sweet where name = 'Tandoori Roti'”时,它给了我正确的输出。所以问题出在 s=field.getText();我应该如何放置它以及放在哪里? 好的,我把它放在 try 语句中,我得到了我的输出。非常感谢:)

以上是关于JDBC + Swing:无法获取表格内容的主要内容,如果未能解决你的问题,请参考以下文章

Swing JDBC SQL 异常处理

java swing如何把获取的文本框值添加到Table表格中,能否给个简单的例子,急用!急用!谢谢

SpringBoot:GenericJDBCException:无法获取 JDBC 连接

swing 怎样实现表格内容刷新

Java swing项目-图书管理系统(swing+mysql+jdbc)

无法获取表 - 加载架构内容时出错