Типове данни

Нека да разгледаме tableта:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
document за самоличност java.lang.Integer ИНТР 4
име java.lang.string VARCHAR 12
ниво java.lang.Integer ИНТР 4
създадена_дата java.sql.date ДАТА 91
Процесът завърши с изходен code 0

В третата колона виждаме типове: INT , VARCHAR , DATE . Това са типове SQL сървъри. Сървърът предоставя данните с тези типове, за които знае. Как тези типове се преобразуват в Java типове?

Това е точно едно от нещата, които са стандартизирани с JDBC. Създателите на JDBC започнаха с коригиране на списък от типове SQL. Има специален клас с константи:

class java.sql.Types {
   public static final int CHAR         =   1;
   public static final int NUMERIC    	=   2;
   public static final int DECIMAL     	=   3;
   public static final int INTEGER      =   4;
   public static final int FLOAT        =   6;
   public static final int REAL         =   7;}

Номерът не е сериен номер в класа, а тип ID в списъка с типове SQL в спецификацията на SQL. Това са числата, които видяхте в примера в началото на лекцията.

Също така в класа ResultSet има методи, които могат да конвертират един тип данни в друг. Не всички типове могат да се конвертират един в друг, но логиката е достатъчно ясна. Ето една добра електронна table за вас:

Метод SQL тип данни
int getInt() ЧИСЛОВО, ЦЯЛО ЧИСЛО, ДЕСЕТИЧНО
float getFloat() NUMERIC, INTEGER, DECIMAL, FLOAT, REAL
двойно getDoublel() NUMERIC, INTEGER, DECIMAL, FLOAT, REAL
Дата getDate() ДАТА, ЧАС, ЧАСОВ ПЕЧАТ
Време getTime() ДАТА, ЧАС, ЧАСОВ ПЕЧАТ
Времево клеймо getTimestamp() ДАТА, ЧАС, ЧАСОВ ПЕЧАТ
Низ getString() CHAR, VARCHAR

Сред всички типове SQL могат ясно да се разграничат някои групи:

  • числа
  • време
  • линии
  • byteови обекти

Между другото, забелязали ли сте метода getInt() ?

JDBC и NULL

Забелязали ли сте Howво не е наред с метода getInt() на класа ResultSet ? Нека погледнем подписа му отново:

int getInt(column)

Този метод връща int , а не Integer. Тъй като по времето, когато беше създаден типът JDBC Integer, той все още не съществуваше. Добре, да кажем. Тогава имам въпрос:

Имам table в база данни, която има колона INT NULL, която може да бъде INT, но може да бъде и NULL. Как мога да получа нулевата стойност от тази колона?

Не се притеснявайте, всичко е помислено за вас.

Решение едно . Ако SQL типът в Java е представен от референтен тип като Date or String, тогава няма проблем . Променливите от този тип могат да приемат нулеви стойности.

Решение две . Примитивните типове не могат да бъдат null, така че методи като getInt() просто ще върнат стойност по подразбиране . За int е 0, за float = 0.0f, за double = 0.0d и други подобни.

И How тогава да разберем Howво е в колоната: 0 or NULL? И партията има отговор на този въпрос.

Решение три . Класът ResultSet има специален метод wasNull() , който връща true, ако методът току-що е върнал различна стойност instead of NULL .

Всичко работи точно Howто написах тук. Пример:

ResultSet results = staatement.executeQuery("SELECT * FROM user");
    int level = results.getInt("level");

if (results.wasNull()) {
    System.out.println("Level is null");
} else {
   System.out.println("Level is " + level);
    }

Ако е трябвало да върне null при извикване на метода getInt() , тогава методът wasNull() ще върне true, в противен случай методът wasNull() ще върне false.

Това работи не само за примитивни типове:

ResultSet results = staatement.executeQuery("SELECT * FROM user");
    String name = results.getString("name");

 	if (results.wasNull()) {
 	    System.out.println("Name is null");
 	} else {
 	   System.out.println("User name is " + name);
    }

Това разбира се е патерица. Но няма проблем с NullPointerException . Виж положителното във всичко :)

Какво не е наред с типовете данни в JDBC?

Да продължим с теста. Погледнете внимателно метода getDate(column) ? Какво му става? Този метод има следния тип резултат:

java.sql.Date

Може да съхранява null, което е достатъчно добро. Но все пак нещо не е наред с него. улика! Ето How изглежда правилният тип дата:

java.util.Date

Имат различни пакети! Това обикновено са различни видове данни. И ето причината...

Базите данни от 70-те години на 20 век поддържат 3 вида данни за съхранение на време:

  • ДАТА - съхранява датата: година, месец, ден.
  • ВРЕМЕ - съхранява време: часове, minutesи, секунди.
  • TIMESTAMP - съхранява конкретна точка от времето: дата, час и мorсекунди.

Езикът Java през първите 10 години от съществуването си имаше само един тип данни, java.util.Date , който съхраняваше момент във формат UNIX TIME: броят мorсекунди от началото на 1970 г.

Затова създателите на стандарта JDBC добавиха още три типа данни към Java - специално за JDBC:

  • java.sql.date
  • java.sql.Time
  • java.sqlTimestamp

И така методите на интерфейса ResultSet съдържат фиксирани типове данни:

SQL ТИП Тип Java Метод
ДАТА java.sql.date java.sql.date getDate()
ВРЕМЕ java.sql.Time java.sql.Time getTime()
КЛАПОТО ЗА ЧАС java.sql.timestamp java.sql.Timestamp getTimestamp()

И това е типът, който виждате тук:

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
document за самоличност java.lang.Integer ИНТР 4
име java.lang.string VARCHAR 12
ниво java.lang.Integer ИНТР 4
създадена_дата java.sql.date ДАТА 91
Процесът завърши с изходен code 0

Познайте Howво липсва тук? Типове данни, които са се появor в Java DateTime API:

  • Местна дата
  • Местно време
  • LocalDateTime