Hurtig guide til MyBatis

1. Introduktion

MyBatis er en open source persistence-ramme, der forenkler implementeringen af ​​databaseadgang i Java-applikationer. Det giver support til brugerdefineret SQL, lagrede procedurer og forskellige typer kortlægningsrelationer.

Kort sagt, det er et alternativ til JDBC og Hibernate.

2. Maven-afhængigheder

For at gøre brug af MyBatis er vi nødt til at tilføje afhængigheden af ​​vores pom.xml:

 org.mybatis mybatis 3.4.4 

Den seneste version af afhængigheden kan findes her.

3. Java API'er

3.1. SQLSessionFactory

SQLSessionFactory er kerneklassen for enhver MyBatis-applikation. Denne klasse instantieres ved hjælp af SQLSessionFactoryBuilder 's Bygger() metode, der indlæser en konfigurations-XML-fil:

Strengressource = "mybatis-config.xml"; InputStream inputStream Resources.getResourceAsStream (ressource); SQLSessionFactory sqlSessionFactory = ny SqlSessionFactoryBuilder (). Build (inputStream);

Java-konfigurationsfilen inkluderer indstillinger som datakildedefinition, transaktionsadministratoroplysninger og en liste over kortlæggere, der definerer relationer mellem enheder, disse sammen bruges til at opbygge SQLSessionFactory eksempel:

offentlig statisk SqlSessionFactory buildqlSessionFactory () {DataSource dataSource = ny PooledDataSource (DRIVER, URL, USERNAME, PASSWORD); Miljømiljø = nyt miljø ("Udvikling", nyt JdbcTransactionFactory (), dataSource); Konfigurationskonfiguration = ny konfiguration (miljø); configuration.addMapper (PersonMapper.class); // ... SqlSessionFactoryBuilder builder = ny SqlSessionFactoryBuilder (); returner builder.build (konfiguration); }

3.2. SQLSession

SQLSession indeholder metoder til udførelse af databasefunktioner, opnåelse af kortlæggere og styring af transaktioner. Det kan instantieres fra SQLSessionFactory klasse. Forekomster af denne klasse er ikke trådsikre.

Efter udførelse af databaseoperationen skal sessionen lukkes. Siden SqlSession implementerer Kan lukkes automatisk interface, kan vi bruge prøv med ressourcer blok:

prøv (SqlSession-session = sqlSessionFactory.openSession ()) {// gør arbejde}

4. Kort

Kort er Java-grænseflader, der kortlægger metoder til de tilsvarende SQL-sætninger. MyBatis giver kommentarer til definition af databasefunktioner:

offentlig grænseflade PersonMapper {@Insert ("Indsæt i person (navn) værdier (# {navn})") offentlig heltal gemme (person person); // ... @Select ("Vælg personId, navn fra person, hvor personId = # {personId}") @Results (værdi = {@Result (egenskab = "personId", kolonne = "personId"), @Result (egenskab = "navn", kolonne = "navn"), @Result (egenskab = "adresser", javaType = List.class, kolonne = "personId", [e-mailbeskyttet] (select = "getAddresses"))}) offentlig person getPersonById (Helt person person); // ...}

5. MyBatis-kommentarer

Lad os se nogle af de vigtigste annoteringer leveret af MyBatis:

  • @Insert, @Select, @Update, @Deletedisse bemærkninger repræsenterer SQL-sætninger, der skal udføres ved at kalde annoterede metoder:
    @Insert ("Indsæt i person (navn) værdier (# {name})") offentlig heltal gem (person person); @Update ("Opdater personens sætnavn = # {name} hvor personId = # {personId}") offentlig ugyldig opdateringPerson (personperson); @Delete ("Slet fra person hvor personId = # {personId}") offentlig ugyldig deletePersonById (heltal personId); @Vælg ("SELECT person.personId, person.name FRA person WHERE person.personId = # {personId}") Person getPerson (Integer personId);
  • @Resultater - det er en liste over resultattilknytninger, der indeholder detaljerne om, hvordan databasekolonnerne kortlægges til Java-klasseattributter:
    @Vælg ("Vælg personId, navn fra person, hvor personId = # {personId}") @Results (værdi = {@Result (egenskab = "personId", kolonne = "personId") // ...}) offentlig person getPersonById (Helt person person);
  • @Resultat - det repræsenterer en enkelt forekomst af Resultat ud af listen over resultater hentet fra @Resultater. Det inkluderer detaljer som kortlægning fra databasekolonne til Java bean-ejendom, Java-type af ejendommen og også tilknytningen til andre Java-objekter:
    @Results (værdi = {@Result (egenskab = "personId", kolonne = "personId"), @Result (egenskab = "navn", kolonne = "navn"), @Result (egenskab = "adresser", javaType = Liste .class) // ...}) offentlig person getPersonById (Integer personId);
  • @Mangedet specificerer en kortlægning af et objekt til en samling af de andre objekter:
    @Results (værdi = {@Result (egenskab = "adresser", javaType = List.class, kolonne = "personId", [e-mailbeskyttet] (select = "getAddresses"))))

    Her getAddresses er metoden, der returnerer samlingen af Adresse ved at spørge adressetabellen.

    @Vælg ("vælg addressId, streetAddress, personId fra adresse hvor personId = # {personId}") offentlig adresse getAddresses (Helt personId);

    Svarende til @Mange kommentar, det har vi @En kommentar, der specificerer en til en kortlægningsforholdet mellem objekter.

  • @MapKeydette bruges til at konvertere listen over poster til Kort af poster med nøglen som defineret af værdi attribut:
    @Vælg ("vælg * fra person") @ MapKey ("personId") Kort getAllPerson ();
  • @Mulighederdenne kommentar angiver en bred vifte af kontakter og konfigurationer, der skal defineres, så i stedet for at definere dem på andre udsagn kan vi @Muligheder for at definere dem:
    @Insert ("Indsæt i adresse (streetAddress, personId) værdier (# {streetAddress}, # {personId})") @Options (useGeneratedKeys = false, flushCache = true) public Integer saveAddress (Adresse adresse);

6. Dynamisk SQL

Dynamisk SQL er en meget kraftig funktion leveret af MyBatis. Med dette kan vi strukturere vores komplekse SQL med nøjagtighed.

Med traditionel JDBC-kode er vi nødt til at skrive SQL-udsagn, sammenkæde dem med nøjagtigheden af ​​mellemrum mellem dem og placere kommaerne på de rigtige steder. Dette er meget udsat for fejl og meget vanskeligt at debugge i tilfælde af store SQL-sætninger.

Lad os undersøge, hvordan vi kan bruge dynamisk SQL i vores applikation:

@SelectProvider (type = MyBatisUtil.class, method = "getPersonByName") offentlig person getPersonByName (strengnavn);

Her har vi angivet en klasse og et metodenavn, som faktisk konstruerer og genererer den endelige SQL:

offentlig klasse MyBatisUtil {// ... public String getPersonByName (String name) {return new SQL () {{SELECT ("*"); FRA ("person"); WHERE ("navn som # {name} || '%'"); }}. toString (); }}

Dynamisk SQL leverer alle SQL-konstruktioner som en klasse, f.eks. VÆLG, HVOR osv. Med dette kan vi dynamisk ændre generationen af HVOR klausul.

7. Lagret procedurestøtte

Vi kan også udføre den lagrede procedure ved hjælp af @Vælg kommentar. Her skal vi videregive navnet på den lagrede procedure, parameterlisten og bruge en eksplicit Opkald til denne procedure:

@Select (værdi = "{CALL getPersonByProc (# {personId, mode = IN, jdbcType = INTEGER})}") @Options (statementType = StatementType.CALLABLE) offentlig person getPersonByProc (Integer personId);

8. Konklusion

I denne hurtige vejledning har vi set de forskellige funktioner, der leveres af MyBatis, og hvordan det letter udviklingen af ​​databasevendte applikationer. Vi har også set forskellige kommentarer fra biblioteket.

Den komplette kode til denne artikel er tilgængelig på GitHub.