我正在编写一个使用 ORMLite 连接到后端数据库的应用程序。由于该应用程序将通过 VPN 运行,因此我试图最大限度地减少数据库调用。
为了最小化数据库调用,我创建了一组类来包装每个字段的值。每个包装类都存储从数据库返回的原始值以及当前值。这允许诸如恢复到原始值或检查值是否脏(即,仅在一个或多个字段脏时更新数据库)之类的事情。
这对 ORMLite 的含义是 ORMLitenull
在查询数据库时从不返回值(即使数据库返回null
)。如果null
数据库中有一个值,它将返回一个完全初始化的“包装器”,其中currentValue
andoriginalValue
变量设置为 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
}
}
我有三个问题:
- 这是正确的方法吗?
- 在 ORMLite
FieldType.resultToJava
函数中,它似乎进行了一次空值检查,null
如果数据库返回空值,它将替换我的包装器。现在我通过覆盖isStreamType
持久化器中的方法返回true来解决这个问题。这是最好的方法吗,我以后会发现意想不到的负面影响吗? resultToSqlArg
自定义持久化器中的和方法有什么区别sqlArgToJava
,具体来说,我应该使用其中哪一个来包装从数据库返回的值,然后我应该在另一个中做什么?