【问题标题】:updating mysql db using java program使用java程序更新mysql db
【发布时间】:2025-11-23 01:10:01
【问题描述】:

我正在尝试在 mysql db 中的表中添加一个新行,我尝试使用 executeUpdate();executeQuery(); 但两者都不起作用,我从多个 JTextField 中获取列值并添加每个将它们添加到单个 Librarian 对象,然后我在 main 中调用 setLibrarian() 方法。

但我收到以下错误消息:

java.sql.SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '@gmail.com , 14 , cairo , 4.6565486E7 )' at line 1

这是我的代码:

    public static void setLibrarian(Librarian lib){
             Connection con = null;
            Statement st = null;
            String dbURL = "jdbc:mysql://localhost:3306/universitysystem";
            String username = "root";
            String password = "";
            
            try{
                Class.forName("com.mysql.jdbc.Driver");
                con = DriverManager.getConnection(dbURL , username , password);
                st = (Statement) con.createStatement();
                st.executeUpdate("INSERT INTO librarians(username , password , email , address , city , contactno)"
                        + " VALUES("+lib.getName()+" , "+lib.getPassword()+" , "+lib.getEmail()+" , "+lib.getAddress()+" , "+lib.getCity()+" , "+lib.getContactNo()+" );  ");
                
               
                            con.close();  //closing connection
    
                
            }
            
            catch(ClassNotFoundException e){
                e.printStackTrace();
            }
            catch(SQLException e){
                e.printStackTrace();
            }
            
        }

【问题讨论】:

    标签: java mysql database


    【解决方案1】:

    您有安全漏洞,您绝不能将用户输入放入这样的查询语句中。如果有人输入密码怎么办:

    thisIsMyPassword'; DROP TABLE librarians CASCADE; EXECUTE 'FORMAT C: /force'; --
    

    你会被搞砸的。

    正确的答案是PreparedStatement,它可以让您编写单个常量作为查询(INSERT INTO librarians(...) VALUES (?, ?, ?, ?) - 带有问号),然后分别为每个问号提供值,然后您就可以安全地避免上面的问题(那将只是他们的密码,逐字)。

    顺便说一句,这也解决了您的问题,即双精度不起作用,或者更可能是该 gmail 地址中有 ' 符号。

    当您使用它时,请查看“try with resources java”,因为您关闭连接的方式也不安全,并且会导致内存泄漏。最后,e.printStackTrace() 的异常处理被破坏。修复你的 IDE;正确的“我不在乎”内容是 throw new RuntimeException("Uncaught", e); - 您正在执行的操作会导致许多错误和处于未知状态的代码(也是一个安全问题)。

    【讨论】: