Есть ли какой-либо недостаток использования long вместо int при подготовке оператора в java? - PullRequest
0 голосов
/ 26 июня 2018

Если я использую PreparedStatement.setLong для параметра, соответствующий столбец которого в действительности равен MySql integer, то при передаче int он, очевидно, автоматически расширится в Java. Но на «более низких» уровнях jdbc это имеет какое-либо значение? Можно ли использовать long, чтобы избежать дополнительной работы, если я ожидаю, что тип данных столбца db изменится на biginteger в относительно ближайшем будущем?

РЕДАКТИРОВАТЬ: Я имею в виду, что метод установки long всегда получает int, поэтому я не буду случайно передавать значение, которое слишком велико для столбца db.

1 Ответ

0 голосов
/ 26 июня 2018

Если смотреть со 100% формальной точки зрения, возможно, небезопасно использовать setLong для столбца INTEGER. Спецификация JDBC 4.3 гласит, что setXXX -методы (за исключением setObject) соответствуют отображениям приложения B.2, в котором говорится, что Java long отображается на SQL BIGINT. Это зависит от того, может ли драйвер или база данных использовать значение BIGINT со столбцом INTEGER.

Спецификация JDBC 1.20 по этому вопросу гласит:

7.2.1 Соответствие типа данных параметрам IN

Методы PreparedStatement.setXXX не выполняют никаких общих данных. преобразования типов. Вместо этого значение Java просто отображается на соответствующий тип SQL (в соответствии с отображением, указанным в таблице 3 на стр. 28) и это значение отправляется в базу данных.

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

Если программистам требуются преобразования типов данных для параметров IN, они может использовать метод PreparedStatement.setObject, который преобразует Java Объект для указанного типа SQL перед отправкой значения в базы данных.

Эта формулировка больше не присутствует в последних спецификациях JDBC, но ее намерение все еще применяется и определено в приложении B.2 в JDBC 4.3.

Однако на практике многие драйверы JDBC, включая MySQL Connector / J, поддерживают более широкий диапазон преобразований, аналогичный тому, который определен для setObject в приложении B.5, хотя каждый драйвер имеет свои предостережения и причуды. Вот. Для Long это означает, что getObject может предназначаться TINYINT, SMALLINT, INTEGER, BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT , BOOLEAN, CHAR, VARCHAR, LONGVARCHAR, и это - обычно - означает, что вы можете сделать то же самое с setLong.

Это также обеспечивает единообразие с преобразованиями для getLong, определенными в приложении B.6.

Есть ли у него какие-либо недостатки, зависит от реализации. Драйвер MySQL Connector / J имеет открытый исходный код, поэтому, если вы хотите узнать мельчайшие подробности: посмотрите на источник.

Однако если ваше приложение на самом деле использует long, почему тип базы данных INTEGER? Либо используйте BIGINT в вашей базе данных, чтобы соответствовать вашему приложению, либо используйте int в вашем приложении, чтобы соответствовать базе данных.

...