Java 将preparedstatement插入数据库-PSQL
这似乎是一个非常简单的问题,但我不知道我的问题是什么。我有一个addTask方法,它将一些信息添加到我们的数据库中,如以下代码所示:Java 将preparedstatement插入数据库-PSQL,java,postgresql,jdbc,Java,Postgresql,Jdbc,这似乎是一个非常简单的问题,但我不知道我的问题是什么。我有一个addTask方法,它将一些信息添加到我们的数据库中,如以下代码所示: public static boolean addTask(String name, String question, int accuracy, int type){ StringBuilder sql = new StringBuilder(); sql.append("INSERT INTO tasks (name, question,
public static boolean addTask(String name, String question, int accuracy, int type){
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO tasks (name, question, type, accuracy) ");
sql.append("VALUES(?, ?, ?, ?)");
try {
Connection c = DbAdaptor.connect();
PreparedStatement preparedStatement = c.prepareStatement(sql.toString());
preparedStatement.setString(1, name);
preparedStatement.setString(2, question);
preparedStatement.setInt(3, type);
preparedStatement.setInt(4, accuracy);
preparedStatement.execute();
preparedStatement.close();
c.close();
return true;
}
catch (SQLException e) {
e.printStackTrace();
return false;
}
}
我的问题是preparedStatement.execute()总是返回false,表示信息尚未添加到数据库中。我可以运行psql,这可以确认没有向db写入任何内容。连接肯定连接到正确的数据库(我输入了一些其他println等来检查)。我试图插入一个新初始化的表,如下所示:
CREATE TABLE tasks
(
id SERIAL PRIMARY KEY,
submitter INTEGER REFERENCES accounts (id),
name VARCHAR(100) NOT NULL,
question VARCHAR(100) NOT NULL,
accuracy INTEGER NOT NULL,
type INTEGER REFERENCES types (id),
ex_time TIMESTAMP,
date_created TIMESTAMP
);
DbAdaptor.connect()的代码:
其中
USER
和PASSWORD
是类中的静态字段您误解了的返回值
请仔细阅读:
返回:
true
如果第一个结果是ResultSet
对象false
如果第一个结果是更新计数或没有结果
因此,在INSERT
查询中,它将返回完全预期的false
。在SELECT
查询中,它只返回true
(但是您通常希望使用它,它直接返回ResultSet
)
如果您对受影响的行感兴趣,请改用。它返回一个int
,如下所示:
返回:
(1)SQL数据操作语言(DML)语句的行数,或(2)不返回任何内容的SQL语句的行数为0
返回值为1或更大表示插入成功
与具体问题无关:您的代码正在泄漏数据库资源。请仔细阅读您误解了的返回值 请仔细阅读: 返回:
true
如果第一个结果是ResultSet
对象false
如果第一个结果是更新计数或没有结果
因此,在INSERT
查询中,它将返回完全预期的false
。在SELECT
查询中,它只返回true
(但是您通常希望使用它,它直接返回ResultSet
)
如果您对受影响的行感兴趣,请改用。它返回一个int
,如下所示:
返回:
(1)SQL数据操作语言(DML)语句的行数,或(2)不返回任何内容的SQL语句的行数为0
返回值为1或更大表示插入成功
与具体问题无关:您的代码正在泄漏数据库资源。请仔细阅读旁注:您没有关闭已打开的资源(语句和连接)。能否共享
DbAdaptor.connect()
方法?因为您是说数据库中没有写入任何内容,所以请检查代码是否在事务下运行?检查连接对象@ArunPJohny的setAutoCommit()
值我已经设置了DbAdaptor.connect()
code,应该启用自动提交,我没有做任何更改。我已经更新了上面的代码,包括关闭资源,感谢您在postgres数据库中指出,您是否有多个架构?另一个注意事项:为什么在connect()
方法中消除异常?假设您将异常传播给调用方,以便调用方知道在创建连接时出错。如果在创建连接时发生异常,则您的addTask()
方法是NullPointerException
的最佳候选方法。旁注:您没有关闭打开的资源(语句和连接)。您可以共享DbAdaptor.connect()
方法吗?因为您是说数据库中没有写入任何内容,所以请检查代码是否在事务下运行?检查连接对象@ArunPJohny的setAutoCommit()
值我已经设置了DbAdaptor.connect()
code,应该启用自动提交,我没有做任何更改。我已经更新了上面的代码,包括关闭资源,感谢您在postgres数据库中指出,您是否有多个架构?另一个注意事项:为什么在connect()
方法中消除异常?假设您将异常传播给调用方,以便调用方知道在创建连接时出错。如果在创建连接时发生异常,则您的addTask()
方法是NullPointerException
的一个很好的候选方法。感谢有关关闭的建议,我修改了代码以在完成后关闭资源。返回值是我刚刚插入的一个错误,现在我将它改回了justreturntrue;所有这些都可以在我更新的代码中看到。我仍然有一个问题,就是没有实际更新数据库。至于关闭,那应该在最终中发生。现在,当执行SQL查询时抛出异常时,它们仍然有泄漏的风险。至于实际的插入,这可能是由于连接没有提交(close隐式地做了这一点),或者只是查看了错误的DB或表或过时的视图;s、 执行(“从任务中选择id、名称”)代码>s的结果集包含我初始化任务时使用的伪值(表中也绝对没有命名冲突)。感谢关于关闭的建议,我修改了代码,以便在完成后关闭资源。返回值是我刚刚插入的一个错误,现在我将它改回了justreturntrue;所有这些都可以在我更新的代码中看到。我仍然有一个问题,就是没有实际更新数据库。至于关闭,那应该在最终中发生。
public static Connection connect(){
try {
Class.forName("org.postgresql.Driver");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Properties properties = new Properties();
properties.setProperty("user", USER);
properties.setProperty("password", PASSWORD);
try {
return DriverManager.getConnection(URL, properties);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}