Типове данни
Нека да разгледаме 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
GO TO FULL VERSION