Rask guide til MyBatis

1. Introduksjon

MyBatis er et open source-vedvarende rammeverk som forenkler implementeringen av databasetilgang i Java-applikasjoner. Den gir støtte for tilpasset SQL, lagrede prosedyrer og forskjellige typer kartleggingsrelasjoner.

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

2. Maven-avhengigheter

For å gjøre bruk av MyBatis må vi legge til avhengighet til vårt pom.xml:

 org.mybatis mybatis 3.4.4 

Den siste versjonen av avhengigheten finner du her.

3. Java APIer

3.1. SQLSessionFactory

SQLSessionFactory er kjerneklassen for alle MyBatis-applikasjoner. Denne klassen er instansert ved hjelp av SQLSessionFactoryBuilder 's bygger() metode som laster en XML-konfigurasjonsfil:

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

Java-konfigurasjonsfilen inkluderer innstillinger som datakildedefinisjon, transaksjonsadministrasjonsdetaljer og en liste over kartleggere som definerer relasjoner mellom enheter, disse sammen brukes til å bygge SQLSessionFactory forekomst:

offentlig statisk SqlSessionFactory buildqlSessionFactory () {DataSource dataSource = new PooledDataSource (DRIVER, URL, USERNAME, PASSWORD); Miljømiljø = nytt miljø ("Utvikling", ny JdbcTransactionFactory (), dataSource); Konfigurasjonskonfigurasjon = ny konfigurasjon (miljø); configuration.addMapper (PersonMapper.class); // ... SqlSessionFactoryBuilder builder = ny SqlSessionFactoryBuilder (); return builder.build (konfigurasjon); }

3.2. SQLSession

SQLSession inneholder metoder for å utføre databaseoperasjoner, skaffe kartleggere og administrere transaksjoner. Det kan instantieres fra SQLSessionFactory klasse. Forekomster av denne klassen er ikke trådsikre.

Etter at databasen har blitt utført, bør økten lukkes. Siden SqlSession implementerer Kan lukkes automatisk grensesnitt, kan vi bruke prøv-med-ressurser blokkere:

prøv (SqlSession session = sqlSessionFactory.openSession ()) {// gjør jobben}

4. Kartleggere

Kart er Java-grensesnitt som kartlegger metoder til de tilsvarende SQL-setningene. MyBatis gir merknader for å definere databasedrift:

offentlig grensesnitt PersonMapper {@Insert ("Sett inn i person (navn) verdier (# {navn})") offentlig Heltall lagre (Person person); // ... @Select ("Velg personId, navn fra person der personId = # {personId}") @Results (verdi = {@Result (eiendom = "personId", kolonne = "personId"), @Result (eiendom = "navn", kolonne = "navn"), @Result (eiendom = "adresser", javaType = List.class, kolonne = "personId", [e-postbeskyttet] (select = "getAddresses"))}) offentlig person getPersonById (Integer personId); // ...}

5. MyBatis-merknader

La oss se noen av hovedkommentarene fra MyBatis:

  • @Insert, @Select, @Update, @Deletedisse kommentarene representerer SQL-setninger som skal utføres ved å ringe merkede metoder:
    @Insert ("Sett inn i person (navn) verdier (# {name})") offentlig Heltall lagre (Person person); @Update ("Update Person set name = # {name} where personId = # {personId}") public void updatePerson (Person person); @Delete ("Delete from Person where personId = # {personId}") offentlig ugyldig deletePersonById (Integer personId); @Velg ("SELECT person.personId, person.name FROM person WHERE person.personId = # {personId}") Person getPerson (Integer personId);
  • @Resultater - det er en liste over resultatkartlegginger som inneholder detaljene for hvordan databasekolonnene er kartlagt til Java-klasseattributter:
    @Velg ("Velg personId, navn fra person der personId = # {personId}") @Results (verdi = {@Result (eiendom = "personId", kolonne = "personId") // ...}) offentlig person getPersonById (Integer personId);
  • @Resultat - det representerer en enkelt forekomst av Resultat ut av listen over resultater hentet fra @Resultater. Den inkluderer detaljene som kartlegging fra databaskolonne til Java bønneegenskap, Java-type for eiendommen og også tilknytningen til andre Java-objekter:
    @Results (verdi = {@Result (eiendom = "personId", kolonne = "personId"), @Result (eiendom = "navn", kolonne = "navn"), @Result (eiendom = "adresser", javaType = Liste .klasse) // ...}) offentlig person getPersonById (Integer personId);
  • @Mangeden spesifiserer en kartlegging av ett objekt til en samling av de andre objektene:
    @Results (verdi = {@Result (eiendom = "adresser", javaType = List.class, kolonne = "personId", [e-postbeskyttet] (select = "getAddresses"))})

    Her getAddresses er metoden som returnerer samlingen av Adresse ved å spørre adressetabellen.

    @Velg ("select addressId, streetAddress, personId from address where personId = # {personId}") public Address getAddresses (Integer personId);

    Lik @Mange kommentar, har vi @En kommentar som spesifiserer en til en kartleggingsrelasjon mellom objekter.

  • @MapKeydette brukes til å konvertere listen over poster til Kart av poster med nøkkelen som definert av verdi Egenskap:
    @Velg ("velg * fra person") @ MapKey ("personId") Kart getAllPerson ();
  • @Alternativerdenne kommentaren spesifiserer et bredt spekter av brytere og konfigurasjoner som skal defineres slik at vi i stedet for å definere dem på andre utsagn @Alternativer for å definere dem:
    @Insert ("Sett inn i adresse (streetAddress, personId) verdier (# {streetAddress}, # {personId})") @Options (useGeneratedKeys = false, flushCache = true) offentlig Heltall saveAddress (Adresse adresse);

6. Dynamisk SQL

Dynamic SQL er en veldig kraftig funksjon levert av MyBatis. Med dette kan vi strukturere vår komplekse SQL med nøyaktighet.

Med tradisjonell JDBC-kode må vi skrive SQL-setninger, sammenkoble dem med nøyaktigheten av mellomrom mellom dem og sette kommaene på riktige steder. Dette er veldig utsatt for feil og veldig vanskelig å feilsøke, når det gjelder store SQL-setninger.

La oss undersøke hvordan vi kan bruke dynamisk SQL i applikasjonen vår:

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

Her har vi spesifisert 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 gir alle SQL-konstruksjonene som en klasse f.eks. Å VELGE, HVOR etc. Med dette kan vi endre generasjonen av HVOR klausul.

7. Lagret prosedyrestøtte

Vi kan også utføre den lagrede prosedyren ved hjelp av @Å velge kommentar. Her må vi sende navnet på den lagrede prosedyren, parameterlisten og bruke en eksplisitt Anrop til den prosedyren:

@Select (value = "{CALL getPersonByProc (# {personId, mode = IN, jdbcType = INTEGER})}") @Options (statementType = StatementType.CALLABLE) public Person getPersonByProc (Integer personId);

8. Konklusjon

I denne raske opplæringen har vi sett de forskjellige funksjonene som MyBatis tilbyr, og hvordan det letter utviklingen av applikasjoner som vender mot databaser. Vi har også sett forskjellige merknader levert av biblioteket.

Den komplette koden for denne artikkelen er tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found