Java 使用Spring匿名/回调类进行数据持久化很困难
我试图适应SpringJDBC,但让我感到困扰的是使用这些匿名类,在这些匿名类中,我们不能传递任何局部变量,除非它们是最终的,这可能很容易安排,但是如果我需要循环数组或集合呢? 我不能将“FedModel fm”声明为final,因为它在循环中被重新初始化,但我需要调用execute方法100次。这是我遇到问题的具体场景,因为我不知道如何将BLOB插入数据库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
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个周期内,它们初始化了一次,但在第二个周期中重新创建,正确的?