Eziokwu mbụ, ma ọ bụ ihe kpatara eji emepụta usoro ahụ dabere na ngwaọrụ nchekwa data

Ndewo, Habr!

Anyị na-aga n'ihu na-enyocha isiokwu ahụ Java и mmiri, gụnyere na ọkwa nchekwa data. Taa, anyị na-akpọ gị òkù ka ị gụọ ihe mere, mgbe ị na-emepụta nnukwu ngwa, ọ bụ usoro nchekwa data, ọ bụghị koodu Java, nke kwesịrị ịdị mkpa dị mkpa, otu esi eme nke a, na ihe ndị ọzọ dị na iwu a.

N'ime akụkọ a na-adịbeghị anya, m ga-akọwa ihe kpatara m ji kwenye na ọ fọrọ nke nta ka ọ bụrụ ihe niile, ụdị data dị na ngwa kwesịrị ịmepụta "site na nchekwa data" kama "site na ikike nke Java" (ma ọ bụ asụsụ ndị ahịa ọ bụla ị bụ. na-arụ ọrụ). Site n'iji ụzọ nke abụọ, ị na-edozi onwe gị maka ogologo ụzọ mgbu na nhụjuanya ozugbo ọrụ gị malitere ito eto.

Edere isiokwu a dabere na otu ajụjụ, nyere na Stack Overflow.

Mkparịta ụka na-akpali mmasị na reddit na ngalaba /r/java и /r/mmemme.

Nhazi koodu

Ọ tụrụ m n'anya na enwere obere akụkụ nke ndị ọrụ, ebe ha mataworo jOOQ, na-ewe iwe n'ihi na jOOQ na-adaberesi ike na ọgbọ koodu isi iji rụọ ọrụ. Ọ dịghị onye na-egbochi gị iji jOOQ ka ọ dị gị mma, ma ọ bụ ịmanye gị iji ọgbọ koodu. Mana ndabara (dị ka akọwara n'akwụkwọ ntuziaka) ụzọ isi rụọ ọrụ na jOOQ bụ na ị na-amalite site na atụmatụ nchekwa data (nketa), tụgharịa injinia site na iji jOOQ code generator ka wee nweta otu klas nke na-anọchi anya tebụl gị, wee dee ụdị. -ajụjụ nchekwa na tebụl ndị a:

	for (Record2<String, String> record : DSL.using(configuration)
//   ^^^^^^^^^^^^^^^^^^^^^^^ Информация о типах выведена на 
//   основании сгенерированного кода, на который ссылается приведенное
// ниже условие SELECT 
 
       .select(ACTOR.FIRST_NAME, ACTOR.LAST_NAME)
//           vvvvv ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^ сгенерированные имена
       .from(ACTOR)
       .orderBy(1, 2)) {
    // ...
}

A na-emepụta koodu ahụ ma ọ bụ aka na mpụga nke mgbakọ, ma ọ bụ aka na mgbakọ ọ bụla. Dịka ọmụmaatụ, mmeghari dị otú ahụ nwere ike iso ozugbo Mbugharị ọdụ data Flyway, nke nwekwara ike iji aka mee ya ma ọ bụ na-akpaghị aka.

Ọgbọ koodu isi mmalite

Enwere nkà ihe ọmụma dị iche iche, uru na ọghọm ndị metụtara usoro ndị a maka ọgbọ koodu - akwụkwọ ntuziaka na akpaka - na agaghị m atụle n'ụzọ zuru ezu n'isiokwu a. Ma, n'ozuzu, isi ihe niile nke koodu emepụtara bụ na ọ na-enye anyị ohere ịmegharị na Java na "eziokwu" anyị na-ewere n'eziokwu, ma n'ime usoro anyị ma ọ bụ n'èzí ya. N'otu aka ahụ, nke a bụ ihe ndị nchịkọta na-eme mgbe ha na-emepụta bytecode, koodu igwe, ma ọ bụ ụdị koodu isi iyi ọzọ - anyị na-enweta ihe nnọchianya nke "eziokwu" anyị n'asụsụ ọzọ, n'agbanyeghị ihe kpatara ya.

Enwere ọtụtụ ndị na-emepụta koodu. Ọmụmaatụ, XJC nwere ike iwepụta koodu Java dabere na faịlụ XSD ma ọ bụ WSDL. Ụkpụrụ bụ otu mgbe:

  • Enwere ụfọdụ eziokwu (ime ma ọ bụ mpụga) - dịka ọmụmaatụ, nkọwapụta, ụdị data, wdg.
  • Anyị chọrọ ihe nnọchianya mpaghara nke eziokwu a n'asụsụ mmemme anyị.

Ọzọkwa, ọ fọrọ nke nta ka ọ bụrụ na ọ bụ ihe amamihe dị na ya ịmepụta ihe nnọchiteanya dị otú ahụ ka ị ghara ịla n'iyi.

Ụdị ndị na-enye ihe na nhazi nkọwa

Mara: ụzọ ọzọ, nke ọgbara ọhụrụ na nke akọwapụtara maka ịmepụta koodu maka jOOQ na-eji ụdị ndị na-eweta, ka etinyere ha na F#. N'okwu a, koodu ahụ na-emepụta site na nchịkọta, n'ezie na nchịkọta nchịkọta. Na ụkpụrụ, koodu dị otú ahụ adịghị adị n'ụdị isi mmalite. Java nwere ihe yiri ya, ọ bụ ezie na ọ bụghị dị ka ihe mara mma, ngwá ọrụ - nkọwa nhazi, dịka ọmụmaatụ, Lombok.

N'echiche, otu ihe ahụ na-eme ebe a dịka ọ dị na nke mbụ, ewezuga:

  • Ị naghị ahụ koodu emepụtara (ikekwe ọnọdụ a ọ dị ka ihe na-adịghị mma nye mmadụ?)
  • Ị ga-ahụrịrị na enwere ike ịnye ụdị, ya bụ, "ezi" ga-adị mgbe niile. Nke a dị mfe n'ihe banyere Lombok, nke na-akọwa "eziokwu". Ọ nwere ntakịrị mgbagwoju anya na ụdị nchekwa data na-adabere na njikọ dị ndụ mgbe niile.

Kedu ihe bụ nsogbu na imepụta koodu?

Na mgbakwunye na ajụjụ aghụghọ nke otu kacha mma isi na-agba ọsọ koodu ọgbọ - aka ma ọ bụ na-akpaghị aka, anyị ga-ekwukwa na e nwere ndị kweere na koodu ọgbọ adịghị mkpa ma ọlị. Ihe ziri ezi maka echiche a, nke m na-ahụtakarị, bụ na ọ na-esiri ike mgbe ahụ ịmepụta pipeline. Ee, o siri ike n'ezie. Ọnụ ego akụrụngwa ndị ọzọ na-ebilite. Ọ bụrụ na ị na-eji otu ngwaahịa na-amalite (ma ọ bụ jOOQ, ma ọ bụ JAXB, ma ọ bụ Hibernate, wdg), ịtọlite ​​​​ebe a na-emepụta ihe na-ewe oge na ị ga-etinye oge n'ịmụ API n'onwe ya ka ị nwee ike wepụ uru na ya. .

Ọ bụrụ na ọnụ ahịa ndị metụtara ịghọta usoro nke generator dị oke elu, mgbe ahụ, n'ezie, API rụrụ ọrụ na-adịghị mma na ojiji nke onye na-emepụta koodu (na emesia ọ na-apụta na nhazi onye ọrụ na ya dịkwa ike). Iji mee ihe kwesịrị ịbụ ihe kacha mkpa maka ụdị API ọ bụla. Mana nke a bụ naanị otu arụmụka megide imepụta koodu. Ma ọ bụghị ya, ọ bụ akwụkwọ ntuziaka kpamkpam ide ihe nnọchite anya mpaghara nke eziokwu dị n'ime ma ọ bụ nke mpụga.

Ọtụtụ ndị ga-ekwu na ha enweghị oge ime ihe a niile. Ha na-agwụcha maka ngwaahịa Super ha. Otu ụbọchị, anyị ga-edozi ihe ebuga mgbakọ, anyị ga-enwe oge. M'gāza ha:

Eziokwu mbụ, ma ọ bụ ihe kpatara eji emepụta usoro ahụ dabere na ngwaọrụ nchekwa data
Mbụ, Alan O'Rourke, nchịkọta ndị na-ege ntị

Mana na Hibernate/JPA ọ dị mfe ide koodu Java.

N'ezie. Maka Hibernate na ndị ọrụ ya, nke a bụ ma ngọzi na nkọcha. Na Hibernate ị nwere ike dee ụlọ ọrụ abụọ dị ka nke a:

	@Entity
class Book {
  @Id
  int id;
  String title;
}

Na ihe fọrọ nke nta ka ọ bụrụ ihe niile dị njikere. Ugbu a ọ dị Hibernate ka iwepụta "nkọwa" dị mgbagwoju anya nke otu a ga-esi akọwa kpọmkwem ihe a na DDL nke "olumba" SQL gị:

	CREATE TABLE book (
  id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
  title VARCHAR(50),
 
  CONSTRAINT pk_book PRIMARY KEY (id)
);
 
CREATE INDEX i_book_title ON book (title);

... na-amalite na-agba ọsọ ngwa. Ohere mara mma nke ukwuu ịmalite ngwa ngwa ma nwalee ihe dị iche iche.

Agbanyeghị, biko hapụ m. M na-agha ụgha.

  • Hibernate ọ ga-emenye nkọwapụta igodo isi aha a n'ezie?
  • Hibernate ọ ga-emepụta ndeksi na TITLE? – M maara n'ezie na anyị ga-mkpa ya.
  • Hibernate ọ ga-eme ka igodo a mata kpọmkwem na nkọwapụta njirimara?

Ikekwe ọ bụghị. Ọ bụrụ na ị na-emepụta ọrụ gị site na ọkọ, ọ na-adị mma mgbe niile ka ị tụfuo nchekwa data ochie wee mepụta nke ọhụrụ ozugbo ị gbakwunyere nkọwa ndị dị mkpa. Ya mere, ụlọ ọrụ akwụkwọ ahụ ga-emecha were ụdị:

	@Entity
@Table(name = "book", indexes = {
  @Index(name = "i_book_title", columnList = "title")
})
class Book {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  int id;
  String title;
}

Jụụ. Megharịa. Ọzọ, na nke a, ọ ga-adị nnọọ mfe na mmalite.

Mana ị ga-akwụrịrị ya ma emechaa

Mee elu mee ala, ị ga-abanye na mmepụta. Ọ bụ mgbe ahụ ka ihe nlereanya a ga-akwụsị ịrụ ọrụ. N'ihi na:

Na mmepụta, ọ gaghị ekwe omume, ma ọ bụrụ na ọ dị mkpa, tụfuo nchekwa data ochie wee malite site na ọkọ. Ebe nchekwa data gị ga-abụ ihe nketa.

Site ugbu a gaa n'ihu ruo mgbe ebighị ebi ị ga-ede Ederede Mbugharị DDL, dịka ọmụmaatụ, iji Flyway. Kedu ihe ga-eme ụlọ ọrụ gị n'okwu a? Ị nwere ike ịmegharị ha na aka gị (ma si otú ahụ okpukpu abụọ nke ọrụ gị), ma ọ bụ ị nwere ike ịgwa Hibernate ka ọ gbanwee ha maka gị (olee ka ndị a na-emepụta n'ụzọ dị otú a iji mezuo atụmanya gị?) N'ụzọ ọ bụla, ị ga-efunahụ gị.

Ya mere, ozugbo ịbanye na mmepụta, ị ga-achọ patches na-ekpo ọkụ. Na ọ dị mkpa ka etinye ha n'ime mmepụta ngwa ngwa. Ebe ọ bụ na ị kwadoghị ma hazieghị pipeline dị larịị nke njem gị maka mmepụta, ị na-akwacha ihe niile. Mgbe ahụ ị nweghịzi oge ime ihe niile n'ụzọ ziri ezi. Ị na-akatọkwa Hibernate, n'ihi na ọ bụ onye ọzọ kpatara ya, ọ bụghị gị ...

Kama nke ahụ, a gaara eme ihe n'ụzọ dị nnọọ iche site ná mmalite. Dịka ọmụmaatụ, tinye wiil gburugburu na igwe igwe.

Ebe nchekwa data mbụ

Ezigbo "eziokwu" dị na atụmatụ nchekwa data gị yana "ọchịchị" dị n'ime ya dị n'ime nchekwa data. A na-akọwa atụmatụ ahụ naanị na nchekwa data n'onwe ya na ọ nweghị ebe ọ bụla, onye ahịa ọ bụla nwere ụdị nke atụmatụ a, ya mere ọ na-eme ka ọ bụrụ ihe ezi uche dị na ya iji mee ka nrube isi na atụmatụ ahụ na iguzosi ike n'ezi ihe, ime ya nke ọma na nchekwa data - ebe ozi dị. echekwara.
Nke a bụ ochie, ọbụna a hackneyed amamihe. Igodo isi na pụrụ iche dị mma. Igodo mba ọzọ dị mma. Nyochaa mgbochi dị mma. Nkwupụta - Ọ dị mma.

Ọzọkwa, nke ahụ abụghị naanị. Dịka ọmụmaatụ, iji Oracle, ị ga-achọ ịkọwapụta:

  • Kedu okpokoro okpokoro dị na tebụl gị?
  • Kedu uru PCTFREE ya?
  • Kedu nha cache dị n'usoro gị (n'azụ id)

Nke a nwere ike ọ gaghị adị mkpa na obere usoro, ma ị gaghị echere ruo mgbe ị ga-abanye n'ime nnukwu data - ị nwere ike ịmalite irite uru site na njikarịcha nchekwa ndị na-ere ahịa na-enye dị ka ndị a kpọtụrụ aha n'elu ngwa ngwa. Ọ nweghị ORM m ahụla (gụnyere jOOQ) na-enye ohere ịnweta nhọrọ DDL zuru oke ị nwere ike chọọ iji na nchekwa data gị. ORM na-enye ụfọdụ ngwaọrụ na-enyere gị aka ide DDL.

Ma na njedebe nke ụbọchị, a na-eji aka dee sekit a haziri nke ọma na DDL. DDL ọ bụla emepụtara bụ naanị mkpokọta ya.

Kedu maka ụdị ahịa ahịa?

Dịka ekwuru n'elu, na onye ahịa ị ga-achọ otu nnomi nke schema nchekwa data gị, nlele ndị ahịa. Ọ baghị uru ikwuba, nlele ndị ahịa a ga-adakọrịrị na ụdị n'ezie. Kedu ụzọ kacha mma isi nweta nke a? Iji koodu generator.

Ebe nchekwa data niile na-enye ozi meta ha site na SQL. Nke a bụ otu esi enweta tebụl niile na nchekwa data gị n'asụsụ SQL dị iche iche:

	-- H2, HSQLDB, MySQL, PostgreSQL, SQL Server
SELECT table_schema, table_name
FROM information_schema.tables
 
-- DB2
SELECT tabschema, tabname
FROM syscat.tables
 
-- Oracle
SELECT owner, table_name
FROM all_tables
 
-- SQLite
SELECT name
FROM sqlite_master
 
-- Teradata
SELECT databasename, tablename
FROM dbc.tables

Ajuju ndị a (ma ọ bụ ndị yiri ya, dabere ma ị ga-atụlekwa echiche, echiche ihe onwunwe, ọrụ ndị nwere tebụl) site na ịkpọ oku. DatabaseMetaData.getTables() site na JDBC, ma ọ bụ iji jOOQ meta-modul.

Site na nsonaazụ nke ajụjụ ndị dị otú ahụ, ọ dị mfe ịmepụta ihe ngosi ọ bụla n'akụkụ ndị ahịa nke ụdị nchekwa data gị, n'agbanyeghị ụdị teknụzụ ị na-eji na onye ahịa.

  • Ọ bụrụ na ị na-eji JDBC ma ọ bụ oge opupu ihe ubi, ị nwere ike ịmepụta usoro nke eriri
  • Ọ bụrụ na ị na-eji JPA, ị nwere ike ịmepụta ụlọ ọrụ n'onwe ha
  • Ọ bụrụ na ị na-eji jOOQ, ị nwere ike ịmepụta jOOQ meta-model

Dabere na ole ọrụ API onye ahịa gị na-enye (dịka jOOQ ma ọ bụ JPA), ụdị meta emepụtara nwere ike ịba ọgaranya ma zuo oke. Were, dịka ọmụmaatụ, ohere nke ịbanye na nzuzo. ewebata na jOOQ 3.11, nke dabere na ozi meta ewepụtara gbasara mmekọrịta igodo mba ofesi dị n'etiti tebụl gị.

Ugbu a mgbakwunye nchekwa data ọ bụla ga-emelite koodu ndị ahịa na-akpaghị aka. Were ya dị ka ọmụmaatụ:

ALTER TABLE book RENAME COLUMN title TO book_title;

Ị ga-achọ n'ezie ịrụ ọrụ a ugboro abụọ? Ọ dịghị ikpe. Naanị nyefee DDL, megharịa ya na pipeline gị, wee nweta ihe emelitere:

@Entity
@Table(name = "book", indexes = {
 
  // Вы об этом задумывались?
  @Index(name = "i_book_title", columnList = "book_title")
})
class Book {
  @Id
  @GeneratedValue(strategy = IDENTITY)
  int id;
 
  @Column("book_title")
  String bookTitle;
}

Ma ọ bụ klaasị jOOQ emelitere. Ọtụtụ mgbanwe DDL na-emetụtakwa semantics, ọ bụghị naanị syntax. Ya mere, ọ nwere ike ịba uru ileba anya na koodu a chịkọtara iji hụ ihe koodu ga- (ma ọ bụ nwere ike) site na mmụba nchekwa data gị.

Naanị eziokwu

N'agbanyeghị ụdị teknụzụ ị na-eji, enwere otu ụdị nke bụ naanị isi iyi nke eziokwu maka ụfọdụ sistemụ - ma ọ bụ, opekempe, anyị kwesịrị ịgbalịsi ike maka nke a wee zere ọgba aghara ụlọ ọrụ dị otú ahụ, ebe “eziokwu” dị ebe niile na enweghị ebe ọ bụla ozugbo. . Ihe niile nwere ike ịdị mfe karị. Ọ bụrụ na ị na-eji usoro ndị ọzọ na-agbanwe faịlụ XML, naanị jiri XSD. Lee anya INFORMATION_SCHEMA meta-model si jOOQ n'ụdị XML:
https://www.jooq.org/xsd/jooq-meta-3.10.0.xsd

  • XSD ghọtara nke ọma
  • XSD tokenizes ọdịnaya XML nke ọma ma na-enye ohere nkwado n'asụsụ ndị ahịa niile
  • XSD bụ ụdị nke ọma ma nwee ndakọrịta azụ azụ
  • Enwere ike ịtụgharị XSD ka ọ bụrụ koodu Java site na iji XJC

Isi ihe ikpeazụ dị mkpa. Mgbe ị na-eji ozi XML na-ekwurịta okwu na sistemụ mpụga, anyị chọrọ ijide n'aka na ozi anyị bara uru. Nke a dị mfe iji JAXB, XJC na XSD nweta. Ọ ga-abụ nnukwu ara ịche na, site na iji ụzọ nhazi "Java first" ebe anyị na-eme ozi anyị dị ka ihe Java, na enwere ike ịdekọ ha na XML ma ziga ha na sistemụ ọzọ maka oriri. XML emepụtara n'ụzọ dị otu a ga-abụ nke adịghị mma nke ukwuu, enweghị akwụkwọ, yana siri ike ịmalite. Ọ bụrụ na enwere nkwekọrịta ọkwa ọrụ (SLA) maka ụdị interface dị otú ahụ, anyị ga-emegharị ya ozugbo.

N'ezie, nke a bụ ihe na-eme mgbe niile na JSON APIs, mana nke ahụ bụ akụkọ ọzọ, m ga-ese okwu oge ọzọ ...

Databases: ha bụ otu ihe

Mgbe ị na-arụ ọrụ na ọdụ data, ị na-achọpụta na ha niile yiri nke ọma. Ntọala ahụ nwere data ya ma ga-ejikwa atụmatụ ahụ. Mgbanwe ọ bụla emere na schema a ga-emerịrị ya ozugbo na DDL ka emelite otu isi iyi nke eziokwu.

Mgbe mmelite isi mmalite mere, ndị ahịa niile ga-emelitekwa mbipụta nke ụdị ahụ. Enwere ike dee ụfọdụ ndị ahịa na Java site na iji jOOQ na Hibernate ma ọ bụ JDBC (ma ọ bụ ha abụọ). Enwere ike dee ndị ahịa ndị ọzọ na Perl (anyị na-achọ ka ha nwee chi ọma), ebe ndị ọzọ nwere ike dee na C #. Ọ baghị uru. Isi ihe nlereanya dị na nchekwa data. Ụdị emepụtara site na iji ORM na-abụkarị nke adịghị mma, edepụtaghị nke ọma, yana siri ike ịzụlite.

Ya mere, emehiela. Emehiela ihe site na mmalite. Na-arụ ọrụ site na nchekwa data. Wulite pipeline nke nwere ike ịmegharị ya. Kwado ndị na-emepụta koodu ka ọ dị mfe iṅomi ụdị nchekwa data gị wee tụfuo ya na ndị ahịa. Ma kwụsị ichegbu onwe gị maka ndị na-emepụta koodu. Ha dị mma. Ị ga-eji ha na-arụpụtakwu ihe. Naanị ị ga-etinye obere oge ịtọlite ​​​​ha site na mmalite - na afọ nke mmụba arụpụtaghị ihe na-echere gị, nke ga-emejupụta akụkọ ihe mere eme nke ọrụ gị.

Ekelekwala m, emechaa.

Nkọwa

Iji mee ka o doo anya: Akụkọ a ọ dịghị ụzọ ọ bụla na-akwado na ị ga-ehulata usoro dum (ya bụ, ngalaba, azụmahịa azụmahịa, wdg, wdg) iji kwado ụdị nchekwa data gị. Ihe m na-ekwu n'isiokwu a bụ na koodu ndị ahịa nke na-emekọrịta ihe na nchekwa data kwesịrị ime ihe na ndabere nke ụdị nchekwa data, ka ya onwe ya ghara imegharị ụdị nchekwa data na ọnọdụ "nke mbụ". Echiche a na-adịkarị na oyi akwa ohere data na onye ahịa gị.

N'ime ụlọ elu abụọ, nke a ka na-echekwa n'ebe ụfọdụ, ụdị usoro dị otú ahụ nwere ike ịbụ naanị ihe ga-ekwe omume. Agbanyeghị, n'ọtụtụ sistemụ, oyi akwa ohere data na-adị m ka ọ bụ "subsystem" nke na-ekpuchi ụdị nchekwa data.

Naanị

Enwere ihe dị iche na iwu ọ bụla, ekwuwokwa m na nchekwa data-mbụ na usoro ọgbọ koodu nwere ike mgbe ụfọdụ na-ekwesịghị ekwesị. Nke a bụ ụzọ ole na ole dị (ma eleghị anya ndị ọzọ):

  • Mgbe amaghị atụmatụ ahụ ma chọọ ka achọpụta ya. Dịka ọmụmaatụ, ị bụ onye na-eweta ngwá ọrụ na-enyere ndị ọrụ aka ịnyagharị eserese ọ bụla. Ugh. Enweghị ọgbọ koodu ebe a. Mana ka, nchekwa data na-abịa na mbụ.
  • Mgbe a ga-emepe sekit na ofufe iji dozie ụfọdụ nsogbu. Ọmụmaatụ a dị ka ụdị nke ụkpụrụ ahụ dị ntakịrị Njirimara njirimara, ya bụ, ị nweghị atụmatụ akọwapụtara nke ọma. N'okwu a, ị gaghị enwe ike ijide n'aka na RDBMS ga-adabara gị.

Ewepụrụ bụ na okike pụrụ iche. N'ọtụtụ ọnọdụ metụtara iji RDBMS, a na-amata atụmatụ ahụ tupu oge eruo, ọ na-ebi n'ime RDBMS na ọ bụ naanị isi iyi nke "eziokwu", ndị ahịa niile ga-enwetakwa akwụkwọ ndị sitere na ya. Dị ka o kwesịrị, ịkwesịrị iji koodu generator.

isi: www.habr.com

Tinye a comment