Java + SQL :INSERT INTO 不起作用
Java + SQL : INSERT INTO doesn't works
我是 Java 的初学者,我在插入 HSQLDB 时遇到问题 table。
我希望此代码在 VEHICLE table 中添加一个条目。
但是在启动 thic 代码后,table 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;
}
}
但是数据库是正常运行的,并且 returns 在另一个 .java 文件中的这个 SELECT 查询示例中它的 tables 和内容:
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 添加任何内容 table :
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:准备:org.hsqldb.jdbc.JDBCPreparedStatement@55e71685[sql=[插入车辆(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 returns:
VehiculeDAO 53:车辆查询:
org.hsqldb.jdbc.JDBCPreparedStatement@680836d5[sql=[插入车辆(MARQUE、MOTEUR、PRIX、NOM、ID)值(?、?、?、?、?)]、参数=[[2]、 [2], [19519], [pzqazmngln], [52]]]
谢谢大家的帮助,我真的不明白,它肯定来自其他地方......?!
编辑 2 ------------------------------------------ ----------------------
我找到了解决方案,添加
this.connect.setAutoCommit(false);
在 preparedStatments 之前,最后执行 :
this.connect.commit();
感谢您的帮助!
您应该使用 statement.executeUpdate()
而不是 statement.executeQuery()
。
java.sql.Statement#executeUpdate(String)
的文档说:
"[...] Executes the given SQL statement, which may be an INSERT,
UPDATE, or DELETE statement or an SQL statement that returns nothing,
such as an SQL DDL statement [...]"
尝试这样的事情:
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
,受影响的行数 returns,(错误为 0)。
在某些 JDBC 驱动程序上,它打印出最终的 SQL 查询,但某些驱动程序未实现 Statement.toString()
并且它仅输出 ?
而不是实际值...
我只是根据您的查询输出猜测类型...
我是 Java 的初学者,我在插入 HSQLDB 时遇到问题 table。
我希望此代码在 VEHICLE table 中添加一个条目。
但是在启动 thic 代码后,table 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;
}
}
但是数据库是正常运行的,并且 returns 在另一个 .java 文件中的这个 SELECT 查询示例中它的 tables 和内容:
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 添加任何内容 table :
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:准备:org.hsqldb.jdbc.JDBCPreparedStatement@55e71685[sql=[插入车辆(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 returns: VehiculeDAO 53:车辆查询: org.hsqldb.jdbc.JDBCPreparedStatement@680836d5[sql=[插入车辆(MARQUE、MOTEUR、PRIX、NOM、ID)值(?、?、?、?、?)]、参数=[[2]、 [2], [19519], [pzqazmngln], [52]]]
谢谢大家的帮助,我真的不明白,它肯定来自其他地方......?!
编辑 2 ------------------------------------------ ----------------------
我找到了解决方案,添加
this.connect.setAutoCommit(false);
在 preparedStatments 之前,最后执行 :
this.connect.commit();
感谢您的帮助!
您应该使用 statement.executeUpdate()
而不是 statement.executeQuery()
。
java.sql.Statement#executeUpdate(String)
的文档说:
"[...] Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement [...]"
尝试这样的事情:
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
,受影响的行数 returns,(错误为 0)。
在某些 JDBC 驱动程序上,它打印出最终的 SQL 查询,但某些驱动程序未实现 Statement.toString()
并且它仅输出 ?
而不是实际值...
我只是根据您的查询输出猜测类型...