【问题标题】:can't insert data to mysql无法向mysql插入数据
【发布时间】:2016-09-13 13:02:02
【问题描述】:

我可以使用这个在 Netbeans 中正常连接:

 Connection conn = null;
 try{
     conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/librarymangementsystem","root","root");
     if(conn!= null)
     {
     System.out.println("connected");
     }
 }catch(Exception e)
             {
             System.out.println("not connected");
             }
}

但是在向列添加数据时,我就是不能。

try{
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/librarymangementsystem","root","root");
        Statement stmt=conn.createStatement();
        String Query = "INSERT into librarian_details(username, name, email, password) VALUES("+ uname +", "+ fname +", " + emails + ",  " + psword +")";
        stmt.executeUpdate(Query);
        JOptionPane.showMessageDialog(null, "Success!");
     }

有人知道这个问题吗? 更新问题:

String Query = "insert into book_details(Book_Name, ISBN, Author, Category, >Quantity, BookShelfNo,Row,Column) VALUES('" +bookname + "','" + ISBN + "','" + > AuthorName + "','" + Category + "','" + 数量 + "','" + ?BookShelfNo +"', '" >+ Row + "', '" + Column + "')";

我似乎无法使用以下方法将任何数据插入行和列:

字符串行 = jTextField9.getText(); 字符串列 = jTextField10.getText(); 行和列数据类型是 int。

【问题讨论】:

  • 在您的 catch 语句中,执行 e.printStackTrace() 并粘贴您在问题中得到的内容。
  • mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“flores, asdfgh, admin)”附近使用正确的语法。插入时出现此错误。
  • 您不应该将值连接到这样的查询字符串中。它是不安全(搜索 SQL 注入),您应该对查询进行参数化并使用 PreparedStatement

标签: java mysql netbeans


【解决方案1】:

我猜用户名、姓名、电子邮件和密码字段是字符串类型,而创建librarian_details 的用户名、姓名、电子邮件和密码列时使用的数据类型是Varchar

如果是这样,那么您需要将查询字符串更新为以下代码:

String Query = "INSERT into librarian_details(username, name, email, password) 
VALUES('"+ uname +"','"+ fname +"','" + emails + "','" + psword +"')";

如果您的输入字符串有一个撇号 (') 字符,那么您需要添加一个额外的撇号 (') 字符作为转义序列。

例如:你的密码是 abc'aa

        String uname = "abc";
        String fname = "xyz";
        String emails = "abc@xyz.com";
        String psword = "abc''aa";//extra apostrophe (') character added
        String Query = "INSERT into librarian_details(username, name, email, password) VALUES('"+ uname+ "','"+ fname+ "','"+ emails+ "','"+ psword+ "')";

注意:在现有 (') 字符中添加额外的撇号 (') 与双引号不同。

以下代码用于更新后的查询

        String bookname ="abc";
        String ISBN="qwerty123";
        String AuthorName="user3213";
        String Category="New";
        String Quantity="1";
        String BookShelfNo="5";
        int Row=1;
        int Column=5;

        String Query = "insert into book_details(Book_Name, ISBN, Author, Category, Quantity, BookShelfNo,`Row`,`Column`) VALUES('" +bookname + "','" + ISBN + "','" + AuthorName + "','" + Category + "','" + Quantity + "','" + BookShelfNo +"', " + Row + ", " + Column + ")";
        stmt.execute(Query);

注意:您使用的是 sql 的保留关键字,例如 Row 和 Column。 我猜你在 DB 中的列名是 Book_Name、ISBN、Author、Category、Quantity、BookShelfNo、Row 和 Column。

建议:

  • 使用 PreparedStatement 将节省您编写查询的时间(无需记住变量和列的数据类型。)
  • PreparedStatement 使用查询缓存功能。
  • 因此,执行比简单语句更快。

下面的代码描述了为您的查询使用准备好的语句。

        //query parameters will be dynamically set 
        String Query = "INSERT INTO book_details VALUES (?,?,?,?,?,?,?,?)";

        //create a Prepared statement using connection object.
        PreparedStatement pstmt = con.prepareStatement(Query);

        //assign the query parameter values
        pstmt.setString(1, bookname);
        pstmt.setString(2, ISBN);
        pstmt.setString(3, AuthorName);
        pstmt.setString(4, Category);
        pstmt.setString(5, Quantity);
        pstmt.setString(6, BookShelfNo);
        pstmt.setInt(7, Row);
        pstmt.setInt(8, Column);
        //display query string generated by PreparedStatement.
        System.out.println("Query: "+pstmt.toString());
        //Display result; result=1 means success.
        int result = pstmt.executeUpdate();
        System.out.println("result: "+result);

【讨论】:

  • 但如果 password 包含撇号 (') 将不起作用。
  • 你能再帮帮我吗?
  • 这是个坏建议,相反,OP 应该使用带有准备好的语句的参数化查询。这样就不需要像这样转义值了。
  • 在更新的查询中使用了哪些 java 和 sql 数据类型。我需要 bookname 、 ISBN 、 AuthorName 、Category 、Quantity 、BookShelfNo 、 Row 和 Column。
  • 看起来 '장나라' 是 JDBC 的初学者。让他先用简单的 java.sql.Statement 试试,以后可以继续准备语句。
【解决方案2】:

转义文本值甚至更好 - 使用准备好的语句。

String Query = "INSERT into librarian_details(username, name, email, password) 
VALUES('"+ uname +"', '"+ fname +"', '" + emails + "', '" + psword +"')";

准备好的陈述:

String Query = "INSERT into librarian_details(username, name, email, password) 
VALUES(?, ?, ?, ?)";

【讨论】:

    【解决方案3】:

    将值连接到查询中是不安全的,它会使您面临 SQL 注入。您需要使用准备好的语句:

    try (PreparedStatement pstmt = connection.prepareStatement(
            "INSERT into librarian_details(username, name, email, password) " 
            + "VALUES(?, ?, ?, ?)")) {
        pstmt.setString(1, uname);
        pstmt.setString(2, fname);
        pstmt.setString(3, emails);
        pstmt.setString(4, psword);
    
        pstmt.executeUpdate();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 2018-10-14
      • 1970-01-01
      • 2020-08-29
      • 2020-01-10
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      相关资源
      最近更新 更多