JavaRush /Kurslar /All lectures for UZ purposes /Primitive Ma'lumot Turlarini Mapping Qilish

Primitive Ma'lumot Turlarini Mapping Qilish

All lectures for UZ purposes
Daraja, Dars
Mavjud

Qo'llab-quvvatlanadigan ma'lumot turlari

Oldingi uchta darajada biz Hibernate bilan biroz tanishdik. Endi esa ikkinchi davra boshlash vaqti keldi. Endi biz o'sha narsalarni o'rganishni boshlaymiz, faqat yanada chuqurroq. Va biz bu ishni Entity sinfidagi maydonlarni ma'lumotlar bazasidagi jadval ustunlariga mapping qilishdan boshlaymiz.

Sen bilganingdek, Entity sinfidagi maydonni ustunga mapping qilish @Column annotatsiyasi yordamida amalga oshiriladi. Endi esa savol: qaysi turlarga ega maydonlarni bunday annotatsiya bilan mapping qilish mumkin?

Javadagi barcha ma'lumot turlari uchta guruhga bo'linadi:

  • Yetarlicha oddiy tur bo'lib, uning ma'lumotlar bazasida saqlanishi oson.
  • Qiyin tur bo'lib, uning uchun maxsus konvertor yozish kerak.
  • Juda qiyin tur bo'lib, uning qiymatlarini saqlash uchun alohida jadval kerak.

Oddiy turlarga Hibernate qanday saqlashni biladi, ma'lumotlar bazasida qanday saqlashni biladi:

Java'dagi turlar package Sinflar misollari
Java'ning primitv turlari boolean, int, double va hokazo.
Primitivlar uchun o'ramalar java.lang Boolean, Integer, Double va hokazo.
Stringlar java.lang String
"Oldindan rivojlangan" raqamlar java.math BigInteger va BigDecimal
Sana va vaqt java.time LocalDate, LocalTime, LocalDateTime, OffsetTime, OffsetDateTime, Instant
Turli sana va vaqt variatsiyalari java.util Date va Calendar
Eski sana va vaqt formatlari java.sql Date, Time, Timestamp
Baitlar yoki belgilar massivi byte[] yoki Byte[], char[] yoki Character[]
Enumlar Har qanday enum
Serializatsiya qilinadigan obyektlar Har qanday java.io.Serializable implementatsiyasi

Bu turlar uchun SQL tilida analoglar mavjud, shu sababli Hibernate ular qanday saqlanishi va ma'lumotlar bazasidan yuklanishini yaxshi biladi.

Misol:


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;
 
   @Column(name="name")
   public String name;
 
   @Column(name="level")
   public Integer level;
 
   @Column(name="created_date")
   public Date createdDate;
}

Turlarni qo'lda berish – @Type annotatsiyasi

Ba'zida sen Hibernate siyosatiga aralashishni xohlaysan va unga ma'lumotlar qanday turda saqlanishi kerakligini aniq ko'rsatishing kerak bo'ladi. Masalan, Entity sinfida maydon Integer turiga ega, lekin ma'lumotlar bazasida u uchun VARCHAR turiga ega ustun mavjud.

Buning uchun maxsus annotatsiya mavjud - @Type. U juda oddiy ko'rinadi:


@Type(type="tur-nomi")

Keling, masalan, Hibernate maydonini so'rab ko'ramiz createdDate User sinfimiz ma'lumotlar bazasida satr kabi saqlansin:


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
    public Integer id;
 
   @Column(name="created_date")
   @Type(type="org.hibernate.type.StringType")
    public Date createdDate;
}

Agar Hibernate Date turini yangi turga qanday konvert qilishni tushunsa, u shunchaki buni qiladi. Agar tushunmasa, unda sen maxsus tur konvertorini ko'rsatishga to'g'ri keladi. Ammo bu haqida keyinroq gaplashamiz.

Ma'lumotlar bazasi uchun Hibernate turlari ro'yxati

Qiziqarli tomoni, sen e'tibor berdingmi, biz org.hibernate.type.StringType turini ko'rsatdik, String emas. Chunki biz birining ichida qo'llab-quvvatlanadigan turini tanladik, ma'lumotlar bazasi emas, balki Java. Ularning har birining o'z tur tizimi bor. Hibernate ishlab chiqaruvchilari esa bu VARCHAR'lar o'rniga Java uslubidagi qulay nomlarni o'ylab topishgan.

Aytganday, bu ro'yxat juda kichik emas. Uning bir qismini keltirib o'taman:

Hibernate turi (org.hibernate.type package) JDBC turi Java turi BasicTypeRegistry tugmachasi(lari)
StringType VARCHAR java.lang.String string, java.lang.String
MaterializedClob CLOB java.lang.String materialized_clob
TextType LONGVARCHAR java.lang.String text
CharacterType CHAR char, java.lang.Character char, java.lang.Character
BooleanType BIT boolean, java.lang.Boolean boolean, java.lang.Boolean
NumericBooleanType INTEGER, 0 is false, 1 is true boolean, java.lang.Boolean numeric_boolean
YesNoType CHAR, 'N'/'n' is false, 'Y'/'y' is true. The uppercase value is written to the database. boolean, java.lang.Boolean yes_no
TrueFalseType CHAR, 'F'/'f' is false, 'T'/'t' is true. The uppercase value is written to the database. boolean, java.lang.Boolean true_false
ByteType TINYINT byte, java.lang.Byte byte, java.lang.Byte
ShortType SMALLINT short, java.lang.Short short, java.lang.Short
IntegerTypes INTEGER int, java.lang.Integer int, java.lang.Integer
LongType BIGINT long, java.lang.Long long, java.lang.Long
FloatType FLOAT float, java.lang.Float float, java.lang.Float
DoubleType DOUBLE double, java.lang.Double double, java.lang.Double
BigIntegerType NUMERIC java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType NUMERIC java.math.BigDecimal big_decimal, java.math.bigDecimal
TimestampType TIMESTAMP java.sql.Timestamp timestamp, java.sql.Timestamp
TimeType TIME java.sql.Time time, java.sql.Time
DateType DATE java.sql.Date date, java.sql.Date
CalendarType TIMESTAMP java.util.Calendar calendar, java.util.Calendar
CalendarDateType DATE java.util.Calendar calendar_date
CurrencyType java.util.Currency VARCHAR currency, java.util.Currency
LocaleType VARCHAR java.util.Locale locale, java.utility.locale
TimeZoneType VARCHAR, using the TimeZone ID java.util.TimeZone timezone, java.util.TimeZone
UrlType VARCHAR java.net.URL url, java.net.URL
ClassType VARCHAR (class FQN) java.lang.Class class, java.lang.Class

Tablitsa, albatta, katta, lekin juda foydali. Masalan, uning ichidan ko'rinib turibdi, Boolean ma'lumot turi ma'lumotlar bazasida kamida oltita turli uslubda saqlanishi mumkin. Sen uchun shuning o'zi yetarmi? Kim aytdi, saqlash uslubi sening tanloving ekanini?

SQL tilida Boolean turi mavjud emas va uni ko'pincha quyidagicha saqlashadi:

  • 1 yoki 0
  • ‘F’ yoki ‘T’
  • ‘Y’ yoki ‘N’

Shuning uchun Hibernate ushbu mayda narsalarni yaxshi tushungani juda yaxshi. Yoki, masalan, ma'lumotlar bazasida ma'lumot massivlarini saqlashni olaylik. Turli xil imkoniyatlar ko'p va Hibernate ularning barchasi bilan ishlashni biladi:

Hibernate turi (org.hibernate.type package) JDBC turi Java turi BasicTypeRegistr
BlobType BLOB java.sql.Blob blog, java.sql.Blob
ClobType CLOB java.sql.Clob clob, java.sql.Clob
BinaryType VARBINARY byte[] binary, byte[]
MaterializedBlobType BLOB byte[] materized_blob
ImageType LONGVARBINARY byte[] image
WrapperBinaryType VARBINARY java.lang.Byte[] wrapper-binary, Byte[], java.lang.Byte[]
CharArrayType VARCHAR char[] characters, char[]
CharacterArrayType VARCHAR java.lang.Character[] wrapper-characters, Character[], java.lang.Character[]
UUIDBinaryType BINARY java.util.UUID uuid-binary, java.util.UUID
UUIDCharType CHAR, can also read VARCHAR java.util.UUID uuid-char
PostgresUUIDType PostgreSQL UUID, through Types#OTHER, which complies to the PostgreSQL JDBC driver definition java.util.UUID pg-uuid
JDK 8 chiqarilgandan keyin Hibernate-da yana bir nechta vaqt bilan bog'liq turlar qo'shildi. Va barchasi hayotingni yengillashtirish uchun. Endi sen bu zamonaviy turlar qo'llab-quvvatlanadimi deb o'ylashing shart emas. Hibernate ishlab chiqaruvchilari ularni sen uchun qo'llab-quvvatlashni qo'shib qo'yishgan:
Hibernate turi (org.hibernate.type package) JDBC turi Java turi BasicTypeRegistr
DurationType BIGINT java.time.Duration Duration, java.time.Duration
InstantType TIMESTAMP java.time.Instant Instant, java.time.Instant
LocalDateTimeType TIMESTAMP java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType DATE java.time.LocalDate LocalDate, java.time.LocalDate
LocalTimeType TIME java.time.LocalTime LocalTime, java.time.LocalTime
OffsetDateTimeType TIMESTAMP java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeType TIME java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeType TIMESTAMP java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION