При доступе к ResultSets в JDBC, существует ли элегантный способ отличить нулевые значения от фактических нулевых значений? - PullRequest
5 голосов
/ 06 мая 2010

При использовании JDBC и доступе к типам примитивов через набор результатов существует более элегантный способ работы с нулем / 0, чем следующий:

int myInt = rs.getInt(columnNumber)
if(rs.wasNull())?
{
 // Treat as null
} else
{
 // Treat as 0
}

Я лично съеживаюсь всякий раз, когда вижу такой код. Я не понимаю, почему ResultSet не был определен для возврата целочисленных типов в штучной упаковке (кроме, возможно, производительности) или, по крайней мере, для обеспечения обоих. Бонусные баллы, если кто-нибудь сможет убедить меня в том, что текущий дизайн API великолепен :)

Моим личным решением было написать обертку, которая возвращает Integer (меня больше интересует элегантность клиентского кода, чем производительность), но мне интересно, не хватает ли мне лучшего способа сделать это.

Просто чтобы уточнить, что меня беспокоит в этом коде, это не длина, а тот факт, что он создает зависимость состояния между последующими вызовами, и то, что выглядит как простой метод получения, на самом деле имеет побочный эффект в той же строке.

1 Ответ

8 голосов
/ 06 мая 2010

JDBC API был разработан для повышения производительности. Помните, что это восходит к Java 1.1, когда большой оборот объектов был убийцей JVM (только в JVM Hotspot в Java 1.2+ вы могли ослабить такого рода ограничения). Использование типов в штучной упаковке разрушило бы производительность приложений большого объема в то время.

Теперь его нельзя изменить из-за обратной совместимости. Так что нет, это больше не идеально, но это довольно незначительная вещь для обхода.

Если вы хотите избежать того типа кода, который вы упомянули, вы всегда можете использовать getObject() вместо getInt(), что будет возвращать объект одного из подтипов java.lang.Number, возможно Integer или BigInteger, в зависимости от конкретного типа SQL.

...