Java + SQL:INSERT INTO 不起作用[关闭]

Posted

技术标签:

【中文标题】Java + SQL:INSERT INTO 不起作用[关闭]【英文标题】:Java + SQL : INSERT INTO doesn't works [closed] 【发布时间】:2018-07-26 09:24:51 【问题描述】:

我是 Java 初学者,在插入 HSQLDB 表时遇到问题。

我希望这段代码在 VEHICLE 表中添加一个条目。

但是在启动thic代码后,表VEHICULE中没有出现新行,并且我在控制台中没有任何错误消息。

在控制台中,我可以读取 println() 的结果: VehiculeDAO 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);

在控制台中我得到:

VehiculeDAO 82 : prepare : org.hsqldb.jdbc.JDBCPreparedStatement@55e71685[sql=[INSERT INTO VEHICULE (MARQUE, MOTEUR, PRIX, NOM, ID) VALUES(?, ?, ?, ?, ?)], 参数=[[2], [2], [15016], [qtrqphfrur], [52]]]

VehiculeDAO 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 返回: VehiculeDAO 53:车辆查询: org.hsqldb.jdbc.JDBCPreparedStatement@680836d5[sql=[INSERT INTO VEHICULE (MARQUE, MOTEUR, PRIX, NOM, ID) VALUES (?,?,?,?,?)], 参数=[[2], [2 ], [19519], [pzqazmngln], [52]]]

谢谢大家帮忙,我真的不明白,肯定是从别的地方传来的......?!

编辑 2 --------------------------------------------- ---------------------

我找到了解决办法,添加

this.connect.setAutoCommit(false);

在preparedStatments之前,并在最后执行:

this.connect.commit();

感谢您的帮助!

【问题讨论】:

改用PreparedStatement,然后重试。 如果我使用preparedstatement似乎是一样的你可以试试吗?并在此处发布尝试过的代码,而不是猜测? 使用executeUpdate 而不是executeQuery 并且不要将结果集用于插入、更新。 不要将值连接到查询字符串中,这会使您的代码容易受到 SQL 注入的影响,这是不安全的。请学习如何使用带参数的预处理语句。 【参考方案1】:

您应该使用statement.executeUpdate() 而不是statement.executeQuery()

java.sql.Statement#executeUpdate(String) 的文档说:

"[...] 执行给定的 SQL 语句,可能是 INSERT, UPDATE,或 DELETE 语句或不返回任何内容的 SQL 语句, 例如 SQL DDL 语句 [...]"

【讨论】:

我喜欢这既正确又简洁。 感谢您提供此信息,但正如您在我编辑的帖子中看到的那样,它不会在表格中创建新行:/【参考方案2】:

试试这样的:

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(),它只输出 ? 而不是实际值... 我只是根据您的查询输出猜测类型...

【讨论】:

感谢您的正确猜测和帮助,但它并没有解决这个问题。如您所见(我编辑了我的帖子)它返回“VehiculeDAO 84:prepare.executeUpdate():1”→但现在表中添加了新行:/ @kobano BTW 在阅读了您的解决方案后,在我看来,问题在于您没有关闭 Connection... 因此原始语句已运行,但未提交...

以上是关于Java + SQL:INSERT INTO 不起作用[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用java和SQL查询INSERT INTO将新记录插入MS访问[关闭]

sql [INSERT INTO] #Syntax #Insert_into

有条件的 INSERT INTO MySQL - 不存在的地方

access SQL语句中 insert into

为啥这个简单的“INSERT INTO”查询不起作用

insert into 语句错误