Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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 使用Spring匿名/回调类进行数据持久化很困难_Java_Spring_Anonymous Class_Jdbctemplate - Fatal编程技术网

Java 使用Spring匿名/回调类进行数据持久化很困难

Java 使用Spring匿名/回调类进行数据持久化很困难,java,spring,anonymous-class,jdbctemplate,Java,Spring,Anonymous Class,Jdbctemplate,我试图适应SpringJDBC,但让我感到困扰的是使用这些匿名类,在这些匿名类中,我们不能传递任何局部变量,除非它们是最终的,这可能很容易安排,但是如果我需要循环数组或集合呢? 我不能将“FedModel fm”声明为final,因为它在循环中被重新初始化,但我需要调用execute方法100次。这是我遇到问题的具体场景,因为我不知道如何将BLOB插入数据库 for (int i = 0; i < fedModels.size(); i++) { FedModel fm

我试图适应SpringJDBC,但让我感到困扰的是使用这些匿名类,在这些匿名类中,我们不能传递任何局部变量,除非它们是最终的,这可能很容易安排,但是如果我需要循环数组或集合呢? 我不能将“FedModel fm”声明为final,因为它在循环中被重新初始化,但我需要调用execute方法100次。这是我遇到问题的具体场景,因为我不知道如何将BLOB插入数据库

 for (int i = 0; i < fedModels.size(); i++) {
        FedModel fm = fedModels.get(i);

        jdbcTemplate.execute("INSERT INTO items (name, video_blob) VALUES (?, ?)",
                  new AbstractLobCreatingPreparedStatementCallback(lobHandler) {
                  protected void setValues(PreparedStatement ps, LobCreator lobCreator) 
                        throws SQLException {
                            ps.setString(1, fm.getName());
                            ps.setString(2, fm.getDifficultyLevel());
                            ps.setString(3, fm.getEquipment());
                            lobCreator.setBlobAsBinaryStream(ps, paramIndex, contentStream, contentLength);                                                     
                          }
                });

} 
for(int i=0;i
我能想到的唯一一件事是创建一个静态嵌套类,该类扩展AbstractLobCreatingPreparedStatementCallback,并为fedModels添加构造函数,以便在内部执行循环。但是只使用JDBC会更容易

。。。但让我头疼的是使用这些匿名类,我们不能传递任何局部变量,除非它们是最终的

这不是斯普林的错。这是Java编程语言的特性

基本上,Java语言(至少Java 6和更早版本)不支持闭包,闭包允许匿名类实例访问和更新实例封闭作用域中的局部变量。作为一种变通方法,该语言允许您访问属于
final
的封闭局部变量。这是通过将各个变量的值复制到匿名类实例中,并将它们存储在隐藏变量中来实现的(没有闭包)

在您的特定情况下,简单的解决方案是将
fm
声明为
final
。如果需要访问匿名类中的循环变量,可以声明最终副本;e、 g

for (int i = 0; i < 10; i++) {
    final int ii = i;
    new Thread(new Runnable(){
        public void run() {
            System.err.println(ii);
        }
    }).start();
}
for(int i=0;i<10;i++){
最终int ii=i;
新线程(newrunnable()){
公开募捐{
系统错误println(ii);
}
}).start();
}

如果最后一个变量指定了一个对象的引用,它将始终引用同一个对象。如果为其指定了一个基本值,则只能执行一次,并且不能更改该值。如果“FedModel fm”变量和“I”变量都被赋值100次,你认为我如何才能声明它们为final?对不起,我认为在for循环中声明的变量会被重新赋值100次,但我只是尝试了一下,结果成功了,因为在for循环的1个周期内,它们初始化了一次,但在第二个周期中重新创建,正确的?