Java 无法从SQL执行中正确获取结果集
我为学校创建了一些任务数据库。每个任务记录都有用户名、说明、taskday和taskhour列 我想通过两个值来提取记录:taskhour和taskday,或者分别提取 因此,我有一个函数,用于获取任务对象,检查taskday或taskhour是否为空,并相应地准备查询。但由于某些原因,ResultSet出现了问题…这是我的函数:Java 无法从SQL执行中正确获取结果集,java,mysql,sql,prepared-statement,resultset,Java,Mysql,Sql,Prepared Statement,Resultset,我为学校创建了一些任务数据库。每个任务记录都有用户名、说明、taskday和taskhour列 我想通过两个值来提取记录:taskhour和taskday,或者分别提取 因此,我有一个函数,用于获取任务对象,检查taskday或taskhour是否为空,并相应地准备查询。但由于某些原因,ResultSet出现了问题…这是我的函数: public List<Task> getUserTasks(Task task) throws SQLException { List<
public List<Task> getUserTasks(Task task) throws SQLException {
List<Task> listOfTasks = new ArrayList<>();
try {
String query = "";
PreparedStatement pStatement;
if (task.getDay() != 0 && task.getHour() != 0) {
query = "select * from TASKS where USERNAME=? and TASKDAY=? and TASKHOUR=?";
pStatement = connection.prepareStatement(query);
pStatement.setString(1, task.getUsername());
pStatement.setInt(2, task.getDay());
pStatement.setInt(3, task.getHour());
} else if (task.getDay() == 0) {
query = "select * from TASKS where USERNAME=? and TASKHOUR=?";
pStatement = connection.prepareStatement(query);
pStatement.setString(1, task.getUsername());
pStatement.setInt(2, task.getHour());
} else {
query = "select * from TASKS where USERNAME=? and TASKDAY=?";
pStatement = connection.prepareStatement(query);
pStatement.setString(1, task.getUsername());
pStatement.setInt(2, task.getDay());
}
ResultSet rs;
rs = pStatement.executeQuery();
if (rs.next()) {
Task taskToAdd = new Task();
taskToAdd.setUsername(rs.getString("USERNAME"));
taskToAdd.setDescription(rs.getString("DESCRIPTION"));
taskToAdd.setDay(rs.getInt("TASKDAY"));
taskToAdd.setHour(rs.getInt("TASKHOUR"));
listOfTasks.add(taskToAdd);
}
} catch (SQLException ex) {
ex.printStackTrace();
}
return listOfTasks;
}
公共列表getUserTasks(任务任务)引发SQLException{
List listOfTasks=new ArrayList();
试一试{
字符串查询=”;
准备好的报表;
if(task.getDay()!=0&&task.getHour()!=0){
query=“从任务中选择*,其中USERNAME=?和TASKDAY=?以及TASKHOUR=?”;
pStatement=connection.prepareStatement(查询);
pStatement.setString(1,task.getUsername());
setInt(2,task.getDay());
setInt(3,task.getHour());
}else if(task.getDay()==0){
query=“从任务中选择*,其中用户名=?和任务小时=?”;
pStatement=connection.prepareStatement(查询);
pStatement.setString(1,task.getUsername());
setInt(2,task.getHour());
}否则{
query=“从USERNAME=?和TASKDAY=?”的任务中选择*;
pStatement=connection.prepareStatement(查询);
pStatement.setString(1,task.getUsername());
setInt(2,task.getDay());
}
结果集rs;
rs=pStatement.executeQuery();
如果(rs.next()){
Task taskToAdd=新任务();
taskToAdd.setUsername(rs.getString(“USERNAME”);
taskToAdd.setDescription(rs.getString(“DESCRIPTION”);
taskToAdd.setDay(rs.getInt(“TASKDAY”);
taskToAdd.setHour(rs.getInt(“TASKHOUR”);
任务列表。添加(任务添加);
}
}catch(SQLException-ex){
例如printStackTrace();
}
返回任务列表;
}
我做错什么了吗
谢谢 在设置$query的
if else
块之后,代码接下来再次设置$query。擦除刚刚在if else
块中完成的工作
作为启动器,拆下紧靠此线前面的七条线:
ResultSet rs;
更新 规范中说“检查taskday或taskhour”是否为空 条件测试(
!=0
)正在检查不等式是否为零
我不清楚“不平等到零”是什么意思“空”
我们没有看到的是getDay
和getHour
方法返回的类型。从代码中,看起来它们正在返回int
原语。(假设没有对null进行测试,并且与整数文本进行比较。)但这只是一个假设;我没有办法检查
我通常会在不平等性比较中加入帕伦斯
if ( ( task.getDay() != 0 ) && ( task.getHour() != 0 ) ) {
^ ^ ^ ^
我认为Java中不需要额外的参数。但我相当肯定这不是违法的。但我不是一个真正的Java人。(当我包括像这样的额外参数时,我会考虑操作符的优先级。(我不需要记住哪个操作符的优先级更高。)
另外,SELECT语句正在执行一个SELECT*
。我将明确列出要返回的列,而不是使用*
。例如:
SELECT t.USERNAME, t.DESCRIPTION, t.TASKDAY, t.TASKHOUR FROM TASKS t ...
但我真的不认为这是你问题的原因
我担心没有一个finally
块关闭语句
} finally {
if (pStatement != null) { pStatement.close(); }
}
另外,我会将returngetDay()
和getHour()
分配给局部变量
然后我会在条件测试中引用局部变量,并作为方法中的参数来绑定准备好的语句
} finally {
if (pStatement != null) { pStatement.close(); }
}
不过,我也不认为你的写作方式有什么特别违法的地方
对于调试,我将忽略从getDay()和getHour()返回的值,并将特定的文本赋值给局部变量 除了这些评论,我真的不能为你调试你的程序
是否要从结果集中返回多行 要获取所有行,请使用
,而如果
,则不使用:
while (rs.next())
^^^^^
while
形成一个循环,将重复该循环,直到表达式rs.next()
的计算结果不再为true
if
只执行一次。最多返回一行。“…ResultSet有问题…”您必须更具体一些。ResultSet有什么问题?我怀疑问题是返回的ArrayList最多包含一行。我怀疑您希望while(rs.next())
。使用while
形成一个循环,这样操作就会重复,直到没有更多的行可检索。(我仍然支持前面答案中的所有建议,特别是在finally
块中关闭语句。)很抱歉,假设if/else不在那里,但在后面加了一行,编辑了代码。这不是问题所在。。