Db查询未在按钮单击上执行

时间:2015-06-30 08:37:47

标签: java database swing

我遇到了GUI问题。当我点击JButton b1时,JTextField text中的文字为空时,它不会捕获异常。

查询仅在单击按钮时执行一次,如果再次单击则抛出异常并且查询未执行

代码:

public class A extends JFrame{


    private JTextField text;
    private JButton b1;
    private JLabel l1;
    private Connection conn;
    private Statement state;
    private ResultSet set;

    String server = "jdbc:mysql://localhost";
    String user="tim";
    String pass="u";
    //query enter in textfield | select * from universty.student where rollno=2

    public A() throws ClassNotFoundException, SQLException{

        super("Frame");
           Class.forName("com.mysql.jdbc.Driver");
                    conn = DriverManager.getConnection(server,user,pass);

                    state = conn.createStatement();

                    getContentPane().setLayout(null);




        text = new JTextField();
        text.setBounds(35, 132, 346, 35);
        getContentPane().add(text);

        l1= new JLabel();
        l1.setFont(new Font("Tahoma", Font.PLAIN, 22));
        l1.setBounds(35, 305, 384, 27);
        getContentPane().add(l1);


        b1 = new JButton("Submit");
        b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                try{

            String  query = text.getText();

                set = state.executeQuery(query);


            set.next();
            String  answer = set.getString(2);


               l1.setText(answer);          





                }
                catch (Exception e){
                    JOptionPane.showMessageDialog( null, 
                            e.getMessage(), "Database error", 
                            JOptionPane.ERROR_MESSAGE );            
                    return;
                }
                finally{
                    try{
                        set.close();
                        state.close();
                        conn.close();

                    }
                        catch(Exception e){
                            e.printStackTrace();
                        }

                }

            }});
        b1.setBounds(132, 178, 129, 35);
        getContentPane().add(b1);






        setSize(450,450);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        setVisible(true);

    }   

}

主要方法:

public class Main {

    public static void main(String args[]) throws ClassNotFoundException, SQLException{

    A obj = new A();

    }

}

3 个答案:

答案 0 :(得分:2)

您应该在:

中打开和关闭数据库连接
actionPerformed()

因为当你调用构造函数时,它会打开数据库连接并再次关闭它。当您单击数据库连接已再次关闭时

public void actionPerformed(ActionEvent arg0) {
      conn = DriverManager.getConnection(server,user,pass);
      state = conn.createStatement();
      //do query here
      set.close();
      state.close()
      conn.close();
}

答案 1 :(得分:0)

在第一次点击结束时,您将使用以下语句关闭所有内容。

            finally{
                try{
                    set.close();
                    state.close();
                    conn.close();

这就是原因。

<强> __ UPDATE __

我被要求提供解决方案。实际上我通过指出问题给出了一半的解决方案。但是,让我详细说明,因为有人问我。

简单的解决方案不是关闭连接或声明或其他任何东西。但这将是一个糟糕的解决方案,因为不必要的资源可以保持活跃。没必要。

我不知道你的申请。所以我不能给你一个确切的答案,而是,我可以给你一些指导,并帮助你自己找到正确的答案。

只要您需要,就可以保留资源。一旦你完成它们就立即摆脱它们。对于这种情况,如果需要用户单击该按钮并在数据库中进行更改,则不要关闭连接等,而是重用它们。如果它是一个多页面应用程序,您可以在用户移动到另一个页面时关闭这些资源。 (或活动,如果它是一个移动应用程序)。

我希望它有意义=]

答案 2 :(得分:0)

我不确定您的代码的用途,但您应该尝试将您的视图逻辑与业务逻辑分开。同时允许用户从文本框中运行SQL并提交按钮听起来很危险,但如果这真的是你想要做的,这里有一个你可以使用的实现。请注意,由于您希望执行查询的方式,DAO不是真正的DAO

    public class A extends JFrame {

        private final JTextField text;
        private final JButton b1;
        private final JLabel l1;

        private AService service;

        public A() {
            super("Frame");
            service = new AServiceImpl(new ADAOJDBCImpl());
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }

        private static void createAndShowGUI() {
            text = new JTextField();
            text.setBounds(35, 132, 346, 35);
            getContentPane().add(text);

            l1= new JLabel();
            l1.setFont(new Font("Tahoma", Font.PLAIN, 22));
            l1.setBounds(35, 305, 384, 27);
            getContentPane().add(l1);

            b1 = new JButton("Submit");
            b1.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                       String  query = text.getText();
                       try {
                           String answer = service.executeQuery(query);
                           l1.setText(answer);
                       } catch (SQLException e){
                        JOptionPane.showMessageDialog( null, 
                                e.getMessage(), "Database error", 
                                JOptionPane.ERROR_MESSAGE );            
                        return;
                    }

                }});
            b1.setBounds(132, 178, 129, 35);
            getContentPane().add(b1);
            setSize(450,450);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setResizable(false);
            pack();
            setVisible(true);
        }
    }

    public interface AService {
        public String executeQuery(String query) throws SQLException;
    }

    public class AServiceImpl implements AService {

        private ADAO dao;

        public AServiceImpl(ADAO dao) {
            this.dao = doa;
        }

        @Override
        public String executeQuery(String query) throws SQLException {
            return dao.executeQuery();
        }

    }

    /**
    * Note usually a DAO is specfically for accessing data, NOT
    * for executing User defined queries from a GUI text box
    * so it would usually have methods such as add, find, delete, update etc.
    */
    public interface ADAO {
        public String executeQuery(String query) throws SQLException;
    }

    public class ADAOJDBCImpl implements ADAO {

        @Override
        public String executeQuery(String query) throws SQLException {
            String server = "jdbc:mysql://localhost";
            String user="tim";
            String pass="u";            

            String answer = "":
            try (Connection conn = DriverManager.getConnection(server,user,pass);
                 Statement state = conn.createStatement();
                 ResultSet set = state.executeQuery(query);) {

                if(set.next()) {
                    answer = set.getString(2);
                }
            }
            return answer;
        }

    }