java - 我正在尝试通过 JFrame 将数据插入 MySQL

标签 java mysql sql swing jframe

过去一天我一直在尝试使用 MySQL 数据库将数据插入到 JFrame 注册表单中。但我得到的只是我不知道的错误。这是我的 SQL 代码和正在显示的错误。

有人可以帮我解决这个错误吗?

 JButton btnNewButton = new JButton("Sign Up");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String url = "jdbc:mysql://localhost:3306/login";
            String user ="root";
            String password ="toor";

            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
                Connection conn = DriverManager.getConnection(url, user, password);
                Statement state = conn.createStatement();
                  String username = textField.getText();
                  String email=textField_1.getText();
                  String password1 = new String(passwordField.getPassword());
                  String password2 = new String(passwordField_1.getPassword());


                String insertTableSQL = "INSERT INTO signup"+"(username,email,password,confirm) VALUES"+"(?,?,?,?)";
                PreparedStatement create = conn.prepareStatement(insertTableSQL);

                create.setString(1, username);
                create.setString(2, email);
                create.setString(3, password);
                create.setString(4, password);
                create.executeUpdate(insertTableSQL);

                state.executeQuery(insertTableSQL);


            }catch(Exception arg0) {arg0.printStackTrace();
            System.out.println("Success");
        ;}
    }});

堆栈跟踪

 Success
java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?,?,?,?)' at line 1
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1355)
    at com.mysql.cj.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2128)
    at com.mysql.cj.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1264)
    at SignUp$5.actionPerformed(SignUp.java:144)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

最佳答案

insertTableSQL = "INSERT INTO signup"+"(username,email,password,confirm) VALUES"+"(?,?,?,?)";

使用PreparedStatement的要点在于,您可以在SQL中使用简单的字符串,然后用实际参数替换标记。

在上面的 SQL 中,您使用了不必要的字符串连接。只需使用:

insertTableSQL = "INSERT INTO signup(username,email,password,confirm) VALUES(?,?,?,?)";

添加所有分隔符后,这使得阅读更容易,并且不太可能出现输入错误。

但是,我怀疑这就是问题所在。

相反,我看到:

String password1 = new String(passwordField.getPassword());
String password2 = new String(passwordField_1.getPassword());

但是你然后使用:

create.setString(3, password);
create.setString(4, password);

替换 token 。我猜“密码”为空?

也许您应该使用“password1”和“password2”?

编辑:

您有几个问题。看看你的代码:

Statement state = conn.createStatement();
String insertTableSQL = "INSERT INTO signup(username,email,password,confirm) VALUES(?,?,?,?)";
PreparedStatement create = conn.prepareStatement(insertTableSQL);

...

create.executeUpdate(insertTableSQL);
state.executeQuery(insertTableSQL);
  1. 您创建了两个语句
  2. 您尝试将“插入”SQL 命令作为查询执行。

解决办法是:

  1. 删除该声明。
  2. 摆脱executeQuery。

如果您想在插入后执行查询,则需要使用“Select”语句创建一个单独的 SQL 查询。

关于java - 我正在尝试通过 JFrame 将数据插入 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55110336/

相关文章:

java - Selenium Webdriver - 无法从列表框中选择选项

java - 在 Java 中读取 HTML 时遇到问题

php - 一个很好的教程,书籍或练习,供新手学习SQL命令以在php中创建论坛(或其他方法)?

c# - 请帮助/指导打破 1 小时间隔的查询拆分

java - 如何在每个月的每个工作日运行 quartz 作业

java - 正则表达式匹配 url 目录路径而不匹配文件名

mysql - 如何在连接表上查询 COUNT 并返回 count=0 和 count>0 的记录

php - 如何编写 MySQL 查询 where Date1 TO Date2?

MYSQL 选择其中时间间隔返回早于查询的行

sql - 本地计算机上的 Hadoop/Hive : Loading data from . csv