2013-08-16 3 views
8

habe ich eine Datenbank mit einer Tabelle in MySQL:Einfügen von Datensätzen in eine MySQL-Tabelle mit Hilfe von 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) 
); 

Ich habe versucht, einen Datensatz mit Hilfe von Java einzufügen:

// 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!"); 
    } 
} 

Die Ausgabe erscheint erfolgreich zurückkehren : insert_success

Aber wenn ich von MySQL auswählen, ist die eingefügte Datensatz leer: mysql_blank_record

Warum wird ein leerer Datensatz eingefügt?

+0

Sie sind nicht natürlich mit _ *** Variablen in Abfrage. –

+1

Sie setzen keine Werte für die INSERT-Anweisung. Verwenden Sie eine preparedStatement-Anweisung mit Bind-Variablen, anstatt eine "string" -Einfügeanweisung zu erstellen. Dadurch werden die Daten eingefügt und Sie erhalten keine SQL-Injection-Probleme mehr. – Dave

Antwort

17

keine, die nicht funktionieren kann (nicht mit realen Daten):

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

Änderung es zu:

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

erstellen PreparedStatment mit dem SQL und legen Sie die Werte mit dem Index:

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

Hallo, ich habe versucht, den Teil des Codes in [diese] (http://pastebin.com/ZCrxG6F3) zu ändern. Aber es gibt "Symbol nicht finden" für Variable "prepareStatement" zurück. –

+0

natürlich müssen Sie es vor der Verwendung erstellen. –

+0

PreparedStatement preparedStatement = conn.prepareStatement (sql); –

1

Dies kann auch so gemacht werden, wenn Sie keine vorbereiteten Anweisungen verwenden möchten.

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

Warum es Wert legen knapp ist, weil Sie nicht Werte bereitstellt wurden, aber Sie Namen von Variablen wurden bereitgestellt, die Sie verwendet haben.

+2

Sie sollten immer preparedStatements verwenden. Diese Art von Code ist schlecht und führt zu SQL-Injection-Problemen. – Dave

+0

stimme Dave zu, aber für Anfänger sollte er auch so lernen –

+0

nein er sollte es nicht so lernen ... :) –

0

Es ist ein Fehler in der Insert-Anweisung es chage zu und versuchen: String sql = "insert into table_name values ('" + Col1 +"','" + Col2 + "','" + Col3 + "')";

+0

Während dies auch das Problem löst, habe ich mich für den PreparedStatement-Ansatz entschieden. Danke für Ihre Hilfe. –

Verwandte Themen