2013-08-16 22 views
8

Tôi tạo ra một cơ sở dữ liệu với một bảng trong MySQL:hồ sơ Chèn vào một bảng MySQL sử dụng Java

CREATE DATABASE iac_enrollment_system; 

USE iac_enrollment_system; 

CREATE TABLE course(
    course_code CHAR(7), 
    course_desc VARCHAR(255) NOT NULL, 
    course_chair VARCHAR(255), 
    PRIMARY KEY(course_code) 
); 

Tôi cố gắng để chèn một bản ghi sử dụng Java:

// STEP 1: Import required packages 
import java.sql.*; 
import java.util.*; 

public class SQLInsert { 
// JDBC driver name and database URL 
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; 
static final String DB_URL = "jdbc:mysql://localhost:3306/iac_enrollment_system"; 

// Database credentials 
static final String USER = "root"; 
static final String PASS = "1234"; 

public static void main(String[] args) { 
    Connection conn = null; 
    Statement stmt = null; 
    Scanner scn = new Scanner(System.in); 
    String course_code = null, course_desc = null, course_chair = null; 

    try { 
     // STEP 2: Register JDBC driver 
     Class.forName("com.mysql.jdbc.Driver"); 

     // STEP 3: Open a connection 
     System.out.print("\nConnecting to database..."); 
     conn = DriverManager.getConnection(DB_URL, USER, PASS); 
     System.out.println(" SUCCESS!\n"); 

     // STEP 4: Ask for user input 
     System.out.print("Enter course code: "); 
     course_code = scn.nextLine(); 

     System.out.print("Enter course description: "); 
     course_desc = scn.nextLine(); 

     System.out.print("Enter course chair: "); 
     course_chair = scn.nextLine(); 

     // STEP 5: Excute query 
     System.out.print("\nInserting records into table..."); 
     stmt = conn.createStatement(); 

     String sql = "INSERT INTO course " + 
      "VALUES (course_code, course_desc, course_chair)"; 
     stmt.executeUpdate(sql); 

     System.out.println(" SUCCESS!\n"); 

    } catch(SQLException se) { 
     se.printStackTrace(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if(stmt != null) 
       conn.close(); 
     } catch(SQLException se) { 
     } 
     try { 
      if(conn != null) 
       conn.close(); 
     } catch(SQLException se) { 
      se.printStackTrace(); 
     } 
    } 
    System.out.println("Thank you for your patronage!"); 
    } 
} 

Sản lượng dường như trở thành công : insert_success

Nhưng khi tôi chọn từ MySQL, bản ghi được chèn trống: mysql_blank_record

Tại sao nó chèn một bản ghi trống?

+0

Bạn không sử dụng nhiên _ *** biến trong truy vấn. –

+1

Bạn không đặt bất kỳ giá trị nào trên câu lệnh chèn. Kiểm tra bằng cách sử dụng một readyStatement với các biến liên kết chứ không phải là tạo ra một câu lệnh chèn "chuỗi". Điều này sẽ chèn dữ liệu và sẽ ngăn bạn nhận các vấn đề về SQL injection. – Dave

Trả lời

17

không mà không thể làm việc (không phải với dữ liệu thực):

String sql = "INSERT INTO course " + 
     "VALUES (course_code, course_desc, course_chair)"; 
    stmt.executeUpdate(sql); 

thay đổi nó để:

String sql = "INSERT INTO course (course_code, course_desc, course_chair)" + 
     "VALUES (?, ?, ?)"; 

Tạo một PreparedStatment với sql đó và chèn các giá trị với chỉ số:

PreparedStatement preparedStatement = conn.prepareStatement(sql); 
preparedStatement.setString(1, "Test"); 
preparedStatement.setString(2, "Test2"); 
preparedStatement.setString(3, "Test3"); 
preparedStatement.executeUpdate(); 
+0

Xin chào, tôi đã thử thay đổi một phần của mã thành [this] (http://pastebin.com/ZCrxG6F3). Nhưng nó đang trả về 'không thể tìm thấy biểu tượng' cho biến' preparStatement'. –

+0

của couse bạn phải tạo ra nó trước khi sử dụng. –

+0

PreparedStatement preparedStatement = conn.prepareStatement (sql); –

1

điều này cũng có thể được thực hiện như thế này nếu bạn không muốn sử dụng báo cáo đã chuẩn bị.

String sql = "INSERT INTO course(course_code,course_desc,course_chair)"+"VALUES('"+course_code+"','"+course_desc+"','"+course_chair+"');" 

Tại sao giá trị chèn không phải do bạn không cung cấp giá trị, nhưng bạn đã cung cấp tên biến mà bạn đã sử dụng.

+2

Bạn nên luôn sử dụng các câu lệnh chuẩn bị. Loại mã này là thực hành không tốt và sẽ dẫn đến các vấn đề về SQL injection. – Dave

+0

đồng ý Dave nhưng đối với người mới bắt đầu, anh ta nên học theo cách này quá –

+0

không anh ta không nên học theo cách này ... :) –

0

Có một sai lầm trong bản Tuyên Bố chèn của bạn chage nó xuống dưới và thử: String sql = "insert into table_name values ('" + Col1 +"','" + Col2 + "','" + Col3 + "')";

+0

Trong khi điều này cũng giải quyết được vấn đề, tôi đã chọn sử dụng phương pháp PreparedStatement. Cảm ơn sự giúp đỡ của bạn. –