Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中循环sql语句_Java_Mysql_Sql - Fatal编程技术网

如何在java中循环sql语句

如何在java中循环sql语句,java,mysql,sql,Java,Mysql,Sql,我正在尝试使用动态sql语句创建for循环: for(int i = 0; i < size; i++) { ps2 = db.prepareStatement("select * from student where id=?"); ps2.setInt(1,studList[i]); rs2=ps2.executeQuery(); while(rs2.next()){

我正在尝试使用动态sql语句创建for循环:

for(int i = 0; i < size; i++) {         
            ps2 = db.prepareStatement("select * from student where id=?");
            ps2.setInt(1,studList[i]);
            rs2=ps2.executeQuery();
            while(rs2.next()){
                list1.add(new Student(rs2.getInt("id"), rs2.getString("name"), rs2.getString("city"));
            }
            rs2.close();
            ps2.close();
        }
for(inti=0;i
studList[i]是一个包含所有学生ID的数组,变量“size”是该数组的长度。此代码的问题是,列表中只添加了一个元素(对应于第一个学生ID)。
我注意到,只要studList[I]的值不变,代码就会进入“while(rs2.next())”中。为什么呢?

看起来逻辑不错

首先,有了它,代码会更好

  • 第一次使用时的本地声明,否则ps2、rs2、ps3、rs3等一个风险未被发现
  • 尝试使用即使在异常/返回时也关闭的资源
因此:

String sql=“从学生id=?”中选择姓名、城市”;
try(PreparedStatement ps2=db.prepareStatement(sql)){
对于(int i=0;i
因此,之前可能会发生错误:数组填充错误,数据库学生表损坏

一个初学者的错误是使用新的字段值重用对象(Student)。将同一对象添加到列表中会多次复制最后一个Student的数据


这可能是因为在最初的代码中,代码被称为重用ps2之类的东西。

看起来逻辑不错

首先,有了它,代码会更好

  • 第一次使用时的本地声明,否则ps2、rs2、ps3、rs3等一个风险未被发现
  • 尝试使用即使在异常/返回时也关闭的资源
因此:

String sql=“从学生id=?”中选择姓名、城市”;
try(PreparedStatement ps2=db.prepareStatement(sql)){
对于(int i=0;i
因此,之前可能会发生错误:数组填充错误,数据库学生表损坏

一个初学者的错误是使用新的字段值重用对象(Student)。将同一对象添加到列表中会多次复制最后一个Student的数据


在这里,可能是在原始代码中,代码被称为重用ps2或类似的东西。

rs2.close();ps2.close();
放在for循环之外并进行检查。@dkb相同的结果更改
while(rs2.next()){
while(rs2.hasNext()){
,在while循环结束时
rs2=rs2.next();
,这就是我的意思:@dkb hasNext()return'not find symbol'错误尝试以下方法:将
rs2.close();ps2.close();
置于for循环之外并检查。@dkb same resultchange
while(rs2.next()){
while(rs2.hasNext()){
,并在while循环结束时
rs2=rs2.next();
,这就是我的意思:@dkb hasNext()return'not find symbol'error尝试以下方法:相同的错误,只在'while(rs2.next())'中出现一次,
中的while
没有问题(如果
,可能是
),因为
id
是主键。但这不是我期望的结果,列表应该有2个条目,但只有1个,第二个id在数据库中?(而且
newstudent
不会像
静态
字段那样出现初学者错误。)printfs确实显示[0]…/-…/[1]…/无。那么它必须是数据库或显示的代码不是使用的代码。原则上,您的代码是正确的。相同的错误,只在'while(rs2.next())'中出现一次,在
中出现一次,而
就可以了(如果
,则可能是
),因为
id
是主键。但这不是我期望的结果,列表应该有2个条目,但只有1个,第二个id在数据库中?(而且
newstudent
不会像
静态
字段那样出现初学者错误。)printfs确实显示[0]…/-…/[1]…/无。那么它必须是数据库,或者显示的代码不是使用的代码。原则上,您的代码是正确的。
String sql = "select name, city from student where id=?";
try (PreparedStatement ps2 = db.prepareStatement(sql)) {
    for (int i = 0; i < size; i++) {  
        int id = studList[i];
        ps2.setInt(1, id);
        try (ResultSet rs2 = ps2.executeQuery()) {
            System.out.printf("[%d] %d%n", i, id);
            while (rs2.next()) {
                System.out.printf("- %s%n", rs2.getString("name"));
                list1.add(new Student(id, rs2.getString("name"), rs2.getString("city"));
            }
        }
    }
}