0

我正在编写一个使用 ORMLite 连接到后端数据库的应用程序。由于该应用程序将通过 VPN 运行,因此我试图最大限度地减少数据库调用。

为了最小化数据库调用,我创建了一组类来包装每个字段的值。每个包装类都存储从数据库返回的原始值以及当前值。这允许诸如恢复到原始值或检查值是否脏(即,仅在一个或多个字段脏时更新数据库)之类的事情。

这对 ORMLite 的含义是 ORMLitenull在查询数据库时从不返回值(即使数据库返回null)。如果null数据库中有一个值,它将返回一个完全初始化的“包装器”,其中currentValueandoriginalValue变量设置为 null。

似乎执行此操作的正确位置是在自定义持久化器中,例如(StatefulIntegerProperty的包装器在哪里Integer):

public class StatefulIntegerPersister extends BaseDataType {

    ... misc. other code

    @Override
    public Object resultToSqlArg(FieldType fieldType, DatabaseResults results, int columnPos) throws SQLException {
        Integer result = results.getInt(columnPos);
        return new StatefulIntegerProperty((results.wasNull(columnPos)) ? null : result);
    }

    @Override
    public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException {
        return sqlArg;
    }

    @Override
    public Object javaToSqlArg(FieldType fieldType, Object obj) throws SQLException {
        return ((StatefulIntegerProperty)obj).getCurrentValue();
    }

    @Override
    public boolean isStreamType() {
        return true; // this is a hack to work around ORMLite setting the value to null in the FieldType.resultToJava function
    }
}

我有三个问题:

  1. 这是正确的方法吗?
  2. 在 ORMLiteFieldType.resultToJava函数中,它似乎进行了一次空值检查,null如果数据库返回空值,它将替换我的包装器。现在我通过覆盖isStreamType持久化器中的方法返回true来解决这个问题。这是最好的方法吗,我以后会发现意想不到的负面影响吗?
  3. resultToSqlArg自定义持久化器中的和方法有什么区别sqlArgToJava,具体来说,我应该使用其中哪一个来包装从数据库返回的值,然后我应该在另一个中做什么?
4

1 回答 1

1

这是正确的方法吗?

我不明白为什么你在这里做的任何事情都会最小化数据库调用。你能开始讨论用户的邮件列表吗?

现在,resultToSqlArg(...)当我认为您想要sqlArgToJava(...). 见下文。

现在,我通过覆盖持久化器中的 isStreamType 方法以返回 true 来解决这个问题。这是最好的方法吗...

人力资源管理系统。如果它可以正常工作,但以这种方式使用此设置似乎很危险。如果我更改了该isStreamType()方法的行为,那么这可能会破坏您的代码。至少你应该有单元测试来确认如果你升级 ORMLite 会破坏这种行为。

也就是说,如果为真,则代码中有很好的处理,特别是围绕null值。isStreamType()

resultToSqlArg 和 sqlArgToJava 有什么区别...

我已经充实了这些的 javadocs。

  • resultToSqlArg从 SQL 结果中获取对象并将其转换为适合作为 SQL 命令参数的 java 对象。例如,如果您有一个 date-long 类型,这将从Long数据库结果中提取一个值。
  • sqlArgToJava获取 sql-arg 值并将其转换为我们的 Java 字段。例如,如果您有一个 date-long 类型,这将采用一个Long值并将其转换为Date与实体字段匹配的 a。

我认为你应该覆盖sqlArgToJava不是.resultToSqlArg

于 2013-03-28T17:17:25.007 回答