2016-05-02 3 views
0

Я хочу использовать вход пользователя для идентификатора драйвера, изменить onJob на true, если пользователь вводит идентификатор.Использование переменных с JDBC

Так, например, если пользователь вводит 1 в качестве идентификатора драйвера, драйвер с идентификационным номером 1 будет иметь onJob переменных изменений 1.

Вот мой код в настоящее время;

public class TaxiDriver { 

    //String driverLocation = DRIVERFIRSTLOCATION; 
    //String destinationintoAPI; 

    //JDBC driver name and database URL 
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; 
    static final String DB_URL = "jdbc:mysql://localhost/DRIVER"; 

    //Database credentials 

    static final String USER = "user"; 
    static final String PASS = "password"; 
    String driverId; 
    static Scanner reader = new Scanner(System.in); 

    public static void main(String[] args) { 
     Connection conn = null; 
     Statement stmt = null; 
     try { 
      //STEP 2: Register JDBC driver 
      Class.forName("com.mysql.jdbc.Driver"); 

      //STEP 3: Open a connection 
      System.out.println("Connecting to a selected database..."); 
      conn = DriverManager.getConnection(DB_URL, USER, PASS); 
      System.out.println("Connected database successfully..."); 

      System.out.println("Assign a driver to a jo..."); 
      reader.nextInt(); 

      //STEP 4: Execute a query 
      System.out.println("Creating statement..."); 
      stmt = conn.createStatement(); 
      String sql = "UPDATE Drivers " + 
       "SET OnJob = 1 WHERE id = (driverId)"; 
      stmt.executeUpdate(sql); 

      // Now you can extract all the records 
      // to see the updated records 
      sql = "SELECT id, license, first, last, OnJob, Email, Telephone, Address, Postcode, Veichle FROM Drivers"; 
      ResultSet rs = stmt.executeQuery(sql); 

      while (rs.next()) { 
       //retrieve by column name 

       int id = rs.getInt("id"); 
       int license = rs.getInt("license"); 
       String first = rs.getString("first"); 
       String last = rs.getString("last"); 
       int OnJob = rs.getInt("OnJob"); 
       String Email = rs.getString("Email"); 
       String Telephone = rs.getString("Telephone"); 
       String Address = rs.getString("Address"); 
       String Postcode = rs.getString("Postcode"); 
       String Veichle = rs.getString("Veichle"); 
       //Display 
       System.out.print("ID: " + id); 
       System.out.print(", license: " + license); 
       System.out.print(", First: " + first); 
       System.out.print(", Last: " + last); 
       System.out.print(", Email; " + Email); 
       System.out.print(", Telephone; " + Telephone); 
       System.out.print(", Address; " + Address); 
       System.out.print(", Postcode; " + Postcode); 
       System.out.print(", Veichle;" + Veichle); 
       if (OnJob == 0) { 
        System.out.println(": Driver is aviliable for pickup"); 
       } else { 
        System.out.println(": Driver is not aviliable for pickup"); 
       } 
      } 
      rs.close(); 
     } catch (SQLException se) { 
      //Handle errors for JDBC 
      se.printStackTrace(); 
     } catch (Exception e) { 
      //Handle errors for Class.forName 
      e.printStackTrace(); 
     } finally { 
      //finally block used to close resources 
      try { 
       if (stmt != null) 
        conn.close(); 
      } catch (SQLException se) { 
      }// do nothing 
      try { 
       if (conn != null) 
        conn.close(); 
      } catch (SQLException se) { 
       se.printStackTrace(); 
      }//end finally try 
     }//end try 
     System.out.println("Goodbye!"); 
    }//end main 
}//end JDBCExample 

Сейчас я получаю эти ошибки.

Connecting to a selected database... 
Tue May 03 00:18:28 BST 2016 WARN: Establishing SSL connection without server's identity verification is not recommended. 
According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. 
For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. 
You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. 
Connected database successfully... 
Assign a driver to a jo... 
2 
Creating statement... 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'driverId' in 'where clause' 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) 
    at com.mysql.jdbc.Util.getInstance(Util.java:387) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:939) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2547) 
    at com.mysql.jdbc.StatementImpl.executeUpdateInternal(StatementImpl.java:1541) 
    at com.mysql.jdbc.StatementImpl.executeLargeUpdate(StatementImpl.java:2605) 
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1469) 
    at TaxiDriver.main(TaxiDriver.java:71) 
Goodbye! 

Большое спасибо заранее.

ответ

4

Во-первых, вам действительно нужно прочитать значение в driverId где-то.

Это в стороне, проблема связана с вашим оператором SQL. У вас есть:

String sql = "UPDATE Drivers " + 
      "SET OnJob = 1 WHERE id = (driverId)"; 

Вы рассказываете базу данных для поиска записей, где значение столбца id записей равно значение их driverId столбца.

Вам нужно получить значение вашей переменной driverId в SQL вместо того, чтобы помещать фактические символы «driverId» в SQL, где (как видите) оно интерпретируется как имя столбца.

Использование подхода вам нужно сделать:

String sql = "UPDATE drivers SET OnJob=1 WHERE id=" + driverId; 

Но динамический SQL опасно, и вы лучше использовать PreparedStatement. Это будет дезинфицировать пользовательские входы и предотвратить атаки SQL-инъекций.

String sql = "UPDATE drivers SET OnJob=1 WHERE id=?"; 
PreparedStatement ps = connection.createPreparedStatement(sql); 
ps.setInt(1, Integer.parseInt(driverId)); 
ResultSet rs = ps.executeQuery(); 
+0

Большое спасибо, я не могу поверить, что забыл прочитать в ценности. –

0

Вы, кажется, не устанавливаете driverId из пользовательского ввода. Перед выполнением скрипта обновите свой оператор sql с допустимым значением id.

т.е.

int driverId = 123;// This is user input, am assuming its type int. 
String sql = "UPDATE Drivers SET OnJob = 1 WHERE id =" + driverId; 
//now execute your sql 

String driverId = "123";//This is user input, am assuming its type String. 
String sql = "UPDATE Drivers SET OnJob = 1 WHERE id =" + "'" + driverId + "'"; 
//now execute your sql 

Edit: Я очень рекомендую решение QuantumMechanic в использования PreparedStatement в качестве более безопасной и скрывает все обработки различных типов.

+0

Это тоже не сработает. – QuantumMechanic

+0

@QuantumMechanic, спасибо за указание. Как вы сказали, лучше использовать PreparedStatement, что определенно более безопасно. – MSameer

Смежные вопросы