【问题标题】:having trouble with inserting data to a database将数据插入数据库时​​遇到问题
【发布时间】:2017-11-19 00:29:31
【问题描述】:

当我使用下面的示例代码向数据库输入数据时,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();

            }
        });

    }


}

【问题讨论】:

  • statement.executeUpdate(sqlquery); 返回什么?
  • 您很可能无法获取连接实例。添加 Class.forName("the-driver-name") 加载驱动。
  • 您应该考虑将您的 SQL 逻辑从 EDT 中移除。如果您的连接/查询挂起,您不希望冻结 GUI。
  • @FreddyMorrison +1,对于 OP - Worker Threads and SwingWorker
  • 您当前的代码容易受到 SQL 注入的影响,请学习如何使用带参数的预处理语句来避免该安全漏洞。

标签: java swing jdbc


【解决方案1】:

您需要在ActionListener 中初始化您的FIRSTNAME、USERNAME 等以获得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)

【讨论】:

  • @BradleyJuma 没问题。实际上,您无需致电.getText().toString()。 getText() 已经完成了您需要的工作..您的代码将更易于阅读。
猜你喜欢
  • 2014-08-04
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多