将数据插入数据库时​​遇到问题

问题描述:

当我使用下面的示例代码向数据库输入数据时,控制台上会显示System.out.println("Insertion complete")行。当我进入数据库时​​,我发现存储的数据是空白的。将数据插入数据库时​​遇到问题

我认为这个问题可能是我的sqlquery,但我没有看到任何问题。

这里是我的代码示例:

public class SignUpFrame extends JFrame { 

    public SignUpFrame() { 

     super("SIGN UP"); 
     setLayout(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(400, 400); 
     setVisible(true); 
     setResizable(false); 
     setLocation(500, 250); 
     getContentPane().setBackground(Color.WHITE);  

     ImageIcon FrameIcon = new ImageIcon("images/signup.png"); 
     JLabel frameicon = new JLabel(FrameIcon); 
     frameicon.setBounds(150, 0, 100, 100); 
     add(frameicon); 


     JLabel firstNamelbl,LastNameLbl,EmailAddressLbl,PasswordLbl,ConfirmPasswordLbl; 

     JTextField firstNametxt,LastNametxt,EmailAddresstxt; 
     JPasswordField passwordtxt,ConfirmPasswordtxt; 
     JButton OKbtn; 
     JButton CANCELbtn; 

     firstNamelbl = new JLabel("FIRST NAME:"); 
     firstNametxt = new JTextField(); 
     firstNametxt.setBounds(150, 110, 200, 20); 
     firstNamelbl.setBounds(50, 110, 100, 20); 

     LastNameLbl = new JLabel("USERNAME:"); 
     LastNametxt = new JTextField(); 
     LastNametxt.setBounds(150, 140, 200, 20); 
     LastNameLbl.setBounds(50,140, 100, 20); 

     EmailAddressLbl = new JLabel("EMAIL ADDRESS:"); 
     EmailAddresstxt = new JTextField(); 
     EmailAddresstxt.setBounds(150, 170, 200, 20); 
     EmailAddressLbl.setBounds(50, 170, 150, 20); 

     PasswordLbl = new JLabel("PASSWORD:"); 
     passwordtxt = new JPasswordField(); 
     passwordtxt.setBounds(150, 200, 200, 20); 
     PasswordLbl.setBounds(50, 200, 150, 20); 

     ConfirmPasswordLbl = new JLabel("CONFIRM PASSWORD:"); 
     ConfirmPasswordtxt = new JPasswordField(); 
     ConfirmPasswordtxt.setBounds(200, 230, 150, 20); 
     ConfirmPasswordLbl.setBounds(50, 230, 150, 20); 

     add(firstNamelbl); 
     add(firstNametxt); 

     add(LastNameLbl); 
     add(LastNametxt); 

     add(EmailAddressLbl); 
     add(EmailAddresstxt); 

     add(PasswordLbl); 
     add(passwordtxt); 

     add(ConfirmPasswordLbl); 
     add(ConfirmPasswordtxt); 

     OKbtn = new JButton("OK"); 
     OKbtn.setBounds(100, 270, 50, 20); 
     add(OKbtn); 
     char [] pass = passwordtxt.getPassword(); 
     String passWord = new String(pass); 


     String FIRSTNAME,USERNAME,EMAIL,PASSWORD; 
     FIRSTNAME = firstNametxt.getText().toString(); 
     USERNAME =LastNametxt.getText().toString(); 
     EMAIL = EmailAddresstxt.getText().toString(); 
     PASSWORD = passWord; 




     OKbtn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 


       String url = "jdbc:mysql://localhost:3306/System"; 
       String user = "root"; 
       String password = ""; 

       Connection con; 
       try { 
        con = DriverManager.getConnection(url, user, password); 
        Statement statement = con.createStatement(); 
        String sqlquery = "insert into signUp_tb "+ 
             "(FirstName,UserName,Email,Password) values ('"+FIRSTNAME+"','"+USERNAME+"','"+EMAIL+"','"+PASSWORD+"')"; 

        statement.executeUpdate(sqlquery); 
        System.out.println("Insertion complete"); 
       } catch (SQLException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 

      } 
     }); 




     CANCELbtn = new JButton("CANCEL"); 
     CANCELbtn.setBounds(170, 270, 100, 20); 
     add(CANCELbtn); 

     CANCELbtn.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       setVisible(false); 
       dispose(); 

      } 
     }); 

    } 


} 
+0

这是什么'的Statement.executeUpdate(sqlquery的);'返回? –

+0

你可能无法获得连接实例。添加Class.forName(“the-driver-name”)来加载驱动程序。 –

+1

你应该考虑把你的SQL逻辑关闭到EDT。如果您的连接/查询挂起,您不希望这会冻结GUI。 –

需要初始化你FIRSTNAMEUSERNAME等在ActionListener的OK按钮。当没有输入数据时,您已初始化那些Strings,这就是为什么一切都是空白的。当用户按下按钮时,您想要获得JTextFields。之前没有。

在SQLite上测试。

OKbtn.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     char [] pass = passwordTxt.getPassword(); 
     String PASSWORD = new String(pass); 

     String FIRSTNAME,USERNAME,EMAIL; 
     FIRSTNAME = firstNameTxt.getText(); 
     USERNAME = lastNameTxt.getText(); 
     EMAIL = emailAddressTxt.getText(); 


     String url = "jdbc:mysql://localhost:3306/System"; 
     String user = "root"; 
     String password = ""; 

     Connection con; 
     try { 
      con = DriverManager.getConnection(url, user, password); 
      Statement statement = con.createStatement(); 
      String sqlquery = "insert into signUp_tb "+ 
           "(FirstName,UserName,Email,Password) values ('"+FIRSTNAME+"','"+USERNAME+"','"+EMAIL+"','"+PASSWORD+"')"; 

      statement.executeUpdate(sqlquery); 
      System.out.println("Insertion complete"); 
     } catch (SQLException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

    } 
}); 

setVisible(true)应该是你做的最后一件事。应该看起来像:

SwingUtilities.invokeLater(() -> { 
    this.setVisible(true); 
}); 

所以你会从EDT启动它。

编辑:关于setLayout(null) - 尝试那些A Visual Guide to Layout Managers

虽然可能没有布局管理器做的,你应该使用 布局管理器,如果在所有可能的。版面管理器可以更轻松地将 调整为外观依赖的组件外观,不同的字体大小,容器的不断变化的大小以及不同的 区域设置。布局管理器也可以容易地被其他的容器以及其他程序重复使用。

Doing Without a Layout Manager (Absolute positioning)

+0

非常感谢它为我工作 –

+0

@BradleyJuma没问题。实际上,你不需要调用'.getText()。toString()'。 'getText()'已经可以满足你的需求了,而且你的代码会更容易阅读。 – bigby