Java + SQL: INSERT INTO не работает

Я новичок в Java, и у меня возникают проблемы при вставке в таблицу HSQLDB.

Я хочу, чтобы этот код добавил запись в таблицу VEHICLE.

Но после запуска этого кода новая строка в таблице не появляется VEHICULEи у меня нет сообщений об ошибках в консоли.

В консоли я могу прочитать результат println(): ГИБДД 85: запрос транспортного средства: INSERT INTO VEHICULE (MARQUE, MOTEUR, PRIX, NOM, ID) VALUES ('2','2','14322.429728209721','tbsyfewdfj','52')

Вот мой код

package fr.ocr.dao.implement;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import fr.ocr.dao.DAO;
import fr.ocr.sql.HsqldbConnection;
import test.database.Main;
import voiture.Marque;
import voiture.Vehicule;
import voiture.moteur.Moteur;
import voiture.option.Option;

public class VehiculeDAO extends DAO<Vehicule>{

  Connection connect;
  String query = "";

  public VehiculeDAO(Connection conn) {
    super(conn);
    connect = conn;
  }

  public boolean create(Vehicule obj) {
    boolean action = false;
    try {

      // Table vehicule
      Statement state = connect.createStatement(
          ResultSet.TYPE_SCROLL_INSENSITIVE,
          ResultSet.CONCUR_UPDATABLE);
      String queryVeh = "INSERT INTO VEHICULE (MARQUE, MOTEUR, PRIX, NOM, ID)" +
                " VALUES ("
                + "'" + obj.getMarque().getId() +"',"
                + "'" + obj.getMoteur().getId() +"',"
                + "'" + obj.getPrix() +"',"
                + "'" + obj.getNom() +"',"
                + "'" + obj.getId()
                + "')";

      System.out.println("VehiculeDAO 85 : vehicule query : \n" + queryVeh);
      ResultSet resVeh = state.executeQuery(queryVeh);

      resVeh.close();
      state.close();
      }

    } catch (SQLException e) {
      e.printStackTrace();
    }

    return action;

  }
}

Однако база данных является функциональной и возвращает свои таблицы и содержимое во время этого примера запроса SELECT в другом файле.java:

  Connection conn = DriverManager.getConnection("jdbc:hsqldb:file:"
      + path + "VEHICULE", "SA", "");
  String[] tablesnames = { "marque", "type_moteur", "moteur",
      "option", "vehicule_option", "vehicule" };

  for (String table : tablesnames) {
    Statement state = conn.createStatement();
    System.out.println(("\nContenu de la table : " + table)
        .toUpperCase());
    ResultSet result = state.executeQuery("SELECT * FROM " + table);
    ResultSetMetaData resultMeta = result.getMetaData();

    String columnSeparator = "", rowSeparator = "";
    for (int i = 1; i <= resultMeta.getColumnCount(); i++) {
      columnSeparator += "********************";
      rowSeparator += "--------------------";
    }

Проблема такая же, если я использую PreparedStatement,

У меня нет никаких ошибок в консоли и ничего не добавлено в таблицу VEHICULE:

public boolean create(Vehicule obj) {
  boolean action = false;
  try {

    Statement state = connect.createStatement(
        ResultSet.TYPE_SCROLL_SENSITIVE,
        ResultSet.CONCUR_UPDATABLE);
    PreparedStatement prepare = connect
        .prepareStatement("INSERT INTO VEHICULE (MARQUE, MOTEUR, PRIX, NOM, ID) VALUES(?, ?, ?, ?, ?)");
    prepare.setInt(1, obj.getMarque().getId());
    prepare.setInt(2, obj.getMoteur().getId());
    prepare.setDouble(3, obj.getPrix());
    prepare.setString(4, obj.getNom());
    prepare.setInt(5, obj.getId());
    System.out.println("VehiculeDAO 85 : prepare : " + prepare);
    Integer resVeh = prepare.executeUpdate();
    System.out.println("VehiculeDAO 85 : prepare.executeUpdate() : " + resVeh);

В консоли я получаю:

АВТОМОБИЛЬ 82: prepare: org.hsqldb.jdbc.JDBCPreparedStatement@55e71685[sql=[ВСТАВИТЬ В АВТОМОБИЛЬ (MARQUE, MOTEUR, PRIX, NOM, ID) ЗНАЧЕНИЯ (???,?,?,?)], Параметры =[[2], [2], [15016], [qtrqphfrur], [52]]]

ГИБДЛДАО 84: prepare.executeUpdate(): 1

Я пробовал это: нет ошибки консоли и ничего не добавлено:

state.executeUpdate(queryVeh);

А также это: нет ошибки консоли и ничего не добавлено:

try ( final PreparedStatement ps = connect.prepareStatement(
    "INSERT INTO VEHICULE ( MARQUE, MOTEUR, PRIX, NOM, ID ) VALUES ( ?,?,?,?,? )" ) )
{
ps.setInt(1, obj.getMarque().getId() );
ps.setInt(2, obj.getMoteur().getId() );
ps.setDouble(3, obj.getPrix() );
ps.setString(4, obj.getNom() );
ps.setInt(5, obj.getId() );
System.out.println("VehiculeDAO 53 : vehicule query : \n" + ps);
//      return ps.executeUpdate();
ps.executeUpdate();

} catch (SQLException e) {
e.printStackTrace();
}

В консоли println возвращает: "АВТОМОБИЛЬ 53": запрос транспортного средства: org.hsqldb.jdbc.JDBCPreparedStatement@680836d5[sql=[ВСТАВИТЬ В АВТОМОБИЛЬ (MARQUE, MOTEUR, PRIX, NOM, ID) ЗНАЧЕНИЯ (?,?,?,?)], параметры =[[2], [2], [19519], [pzqazmngln], [52]]]

Спасибо всем за помощь, я действительно не понимаю, это, конечно, откуда-то еще....?!

РЕДАКТИРОВАТЬ 2 ------------------------------------------------------------------

Я нашел решение, добавив

this.connect.setAutoCommit(false);

перед подготовленной строкой и в конце выполнить:

this.connect.commit();

Спасибо за помощь!

2 ответа

Вы должны использовать statement.executeUpdate() вместо statement.executeQuery(),

Документация java.sql.Statement#executeUpdate(String) говорит:

"[...] Выполняет заданный оператор SQL, который может быть оператором INSERT, UPDATE или DELETE или оператором SQL, который ничего не возвращает, например оператор SQL DDL [...]"

Попробуйте что-то вроде этого:

public int create( final Vehicule obj )
{
  try ( final PreparedStatement ps = connect.prepareStatement(
        "INSERT INTO VEHICULE ( MARQUE, MOTEUR, PRIX, NOM, ID ) VALUES ( ?,?,?,?,? )" ) )
  {
    ps.setInt(1, obj.getMarque().getId() );
    ps.setInt(2, obj.getMoteur().getId() );
    ps.setDouble(3, obj.getPrix() );
    ps.setString(4, obj.getNom() );
    ps.setInt(5, obj.getId() );
    System.out.println("VehiculeDAO 85 : vehicule query : \n" + ps);
    return ps.executeUpdate();
  }
  catch (SQLException e)
  {
    e.printStackTrace();
    return 0;
  }
}

Оно использует PreparedStatement, возвращает количество затронутых строк (0 при ошибке).
На некоторых драйверах JDBC он выводит окончательный SQL-запрос, но некоторые драйверы не реализуют Statement.toString() и выводит только ? вместо фактических значений...
Я просто угадывал типы, основываясь на результатах вашего запроса...

Другие вопросы по тегам