Правильный ответ от Desai обнаружил вашу синтаксическую ошибку в сгенерированном операторе SQL: неправильная запятая.
Вот лучший способ написать свой SQL, чтобы вы могли обнаружить этот тип ошибки самостоятельно.
Вы всегда должны строить свой SQL отдельно как фрагмент текста, чтобы облегчить отладку такого рода проблем.
Создайте свой текст SQL и проверьте
Используйте StringBuilder
для создания текста.
Вот пример кода. Вы заполняете xxx
вашими методами получения объекта (я слишком ленив).
StringBuilder sql = new StringBuilder() ;
String eol = "\n" ; // linefeed
String comma = " , " ; // SPACE + COMMA + SPACE
sql.append( "INSERT INTO ADC.STUDENT ( " ).append( eol ) ;
sql.append( " EMAILADDRESS, FORENAME, SURNAME, ADDRESSLINE1, ADDRESSLINE2, POSTCODE, TELEPHONENO, GENDER, PASSWORD, ISREGISTERED, ISVERIFIED, PASSEDTHEORY, PASSEDPRACTICAL, DRIVINGLICENSENO, DOB " ).append( eol) ;
sql.append( ") VALUES (" ).append(eol) ;
sql.append( student.getEmailAddress() ).append( comma ) ; // EMAILADDRESS
sql.append( student.getForename() ).append( comma ) ; // FORENAME
sql.append( xxx ).append( comma ) ; // SURNAME
sql.append( xxx ).append( comma ) ; // ADDRESSLINE1
sql.append( xxx ).append( comma ) ; // ADDRESSLINE2
sql.append( xxx ).append( comma ) ; // POSTCODE
sql.append( xxx ).append( comma ) ; // TELEPHONENO
sql.append( xxx ).append( comma ) ; // GENDER
sql.append( xxx ).append( comma ) ; // PASSWORD
sql.append( xxx ).append( comma ) ; // ISREGISTERED
sql.append( xxx ).append( comma ) ; // ISVERIFIED
sql.append( xxx ).append( comma ) ; // PASSEDTHEORY
sql.append( xxx ).append( comma ) ; // PASSEDPRACTICAL
sql.append( xxx ).append( comma ) ; // DRIVINGLICENSENO
sql.append( xxx ) ; // DOB — IMPORTANT no comma on the last item.
sql.append( ") ;" ) ;
Затем распечатайте это значение, чтобы убедиться, что ваш SQL выглядит прямо. Сравните с другими примерами SQL , чтобы определить свою бу-бу.
Мы будем вежливо игнорировать сохранение пароля без солей и хэширования, номера лицензии и даты рождения, поскольку это представляет серьезную угрозу безопасности.
Кстати, вы должны представлять значение только для даты, например дату рождения, в вашем объекте Java как LocalDate
объект. Ужасные классы Date
& SimpleDateFormat
были вытеснены несколько лет назад классами java.time . Метод LocalDate.toString()
генерирует текст в стандартном формате ISO 8601, который для даты только совпадает с тем, который обычно используется в SQL.
Подготовленное заявление
Гораздо лучший способ, чем приведенный выше, - использовать подготовленное утверждение с заполнителями. Выполнение сгенерированного текста, как вы делали, сложнее для чтения и, что более важно, подвергает вас риску атаки SQL Injection .
StringBuilder sql = new StringBuilder() ;
String eol = "\n" ; // linefeed
sql.append( "INSERT INTO ADC.STUDENT ( " ).append( eol ) ;
sql.append( " EMAILADDRESS, FORENAME, SURNAME, ADDRESSLINE1, ADDRESSLINE2, POSTCODE, TELEPHONENO, GENDER, PASSWORD, ISREGISTERED, ISVERIFIED, PASSEDTHEORY, PASSEDPRACTICAL, DRIVINGLICENSENO, DOB " ).append( eol) ;
sql.append( ") VALUES (" ).append(eol) ;
sql.append( "? , " ) ; // EMAILADDRESS
sql.append( "? , " ) ; // FORENAME
sql.append( "? , " ) ; // SURNAME
sql.append( "? , " ) ; // ADDRESSLINE1
sql.append( "? , " ) ; // ADDRESSLINE2
sql.append( "? , " ) ; // POSTCODE
sql.append( "? , " ) ; // TELEPHONENO
sql.append( "? , " ) ; // GENDER
sql.append( "? , " ) ; // PASSWORD
sql.append( "? , " ) ; // ISREGISTERED
sql.append( "? , " ) ; // ISVERIFIED
sql.append( "? , " ) ; // PASSEDTHEORY
sql.append( "? , " ) ; // PASSEDPRACTICAL
sql.append( "? , " ) ; // DRIVINGLICENSENO
sql.append( "? " ) ; // DOB — IMPORTANT no comma on the last item.
sql.append( ") ; " ) ;
Опять распечатайте это и изучите.
String sqlOutput = sql.toString() ;
System.out.println( sqlOutput ) ;
Создать PreparedStatement
. Для этого объекта вызовите методы set…
.
ps.setString( 1 , student.getEmailAddress() ) ;
…
ps.setObject( 15 , student.getDateOfBirth() ) ; // Pass `LocalDate` object via `setObject` method using JDBC 4.2 or later.