使用 Spring 匿名/回调类进行数据持久性的困难时期

使用 Spring 匿名/回调类进行数据持久性的困难时期

IT小君   2022-09-15T08:37:11

我正在尝试适应 Spring JDBC,但是我的错误是使用这些匿名类,我们不能传递任何局部变量,除非它们是最终的,这可能很容易安排,但是如果我需要循环数组或集合呢? ? 我不能将“FedModel fm”声明为最终的,因为它在循环中重新初始化,但我需要调用执行方法 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);                                                     
                          }
                });

} 

我唯一能想到的就是创建一个静态嵌套类,它扩展 AbstractLobCreatingPreparedStatementCallback 并为 fedModels 添加构造函数,以便我可以在里面进行循环。但是只使用 JDBC 会更容易。

服务器费用不足...
评论(1)
IT小君

...但是让我烦恼的是使用这些匿名类,除非它们是最终的,否则我们不能传递任何局部变量...

这不是春天的错。它是 Java 编程语言的属性。

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

在您的特定情况下,简单的解决方案是声明fmfinal. 如果你需要访问匿名类中的循环变量,你可以声明一个最终副本;例如

for (int i = 0; i < 10; i++) {
    final int ii = i;
    new Thread(new Runnable(){
        public void run() {
            System.err.println(ii);
        }
    }).start();
}
2022-09-15T08:37:11   回复