Povežite Javu s MySQL bazom podataka

Java Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Pregled

Postoji mnogo načina na koje se možemo povezati s MySQL bazom podataka s Jave, a u ovom uputstvu istražit ćemo nekoliko mogućnosti kako bismo vidjeli kako to postići.

Za početak ćemo razmotriti vjerojatno najpopularnije opcije koristeći JDBC i Hibernate.

Zatim ćemo pogledati i neke vanjske knjižnice, uključujući MyBatis, Apache Cayenne i Spring Data. Usput ćemo pružiti brojne praktične primjere.

2. Preduvjeti

Pretpostavit ćemo da već imamo instaliran i pokrenut MySQL poslužitelj na localhostu (zadani priključak 3306) i da imamo testnu shemu sa sljedećom tablicom osoba:

STVORI TABELU osoba (ID INT, FIRST_NAME VARCHAR (100), LAST_NAME VARCHAR (100));

Trebat će nam i mysql-konektor-java artefakt koji je kao i uvijek dostupan u Maven Central:

 mysql mysql-konektor-java 8.0.19 

3.Povezivanje pomoću JDBC-a

JDBC (Java Database Connectivity) je API za povezivanje i izvršavanje upita u bazi podataka.

3.1. Uobičajena svojstva

Tijekom ovog članka obično ćemo koristiti nekoliko uobičajenih JDBC svojstava:

  • URL veze - niz koji JDBC pokretački program koristi za povezivanje s bazom podataka. Može sadržavati informacije poput mjesta pretraživanja baze podataka, naziva baze podataka za povezivanje i drugih svojstava konfiguracije:
    jdbc: mysql: // [host] [, failoverhost ...] [: port] / [baza podataka] [? propertyName1] [= propertyValue1] [& propertyName2] [= propertyValue2] ...

    Postavit ćemo ovo svojstvo tako: jdbc: mysql: // localhost: 3306 / test? serverTimezone = UTC

  • Klasa vozača - potpuno kvalificirani naziv klase vozača koji se koristi. U našem ćemo slučaju koristiti MySQL upravljački program: com.mysql.cj.jdbc.Driver
  • Korisničko ime i lozinka - vjerodajnice MySQL računa

3.2. Primjer JDBC veze

Pogledajmo kako se možemo povezati s našom bazom podataka i izvršiti jednostavan odabir svih putem pokušaja s više resursa:

String sqlSelectAllPersons = "SELECT * FROM person"; String connectionUrl = "jdbc: mysql: // localhost: 3306 / test? ServerTimezone = UTC"; probajte (Connection conn = DriverManager.getConnection (connectionUrl, "username", "password"); PreparedStatement ps = conn.prepareStatement (sqlSelectAllPersons); ResultSet rs = ps.executeQuery ()) {while (rs.next ()) {long id = rs.getLong ("ID"); Naziv niza = rs.getString ("FIRST_NAME"); Niz lastName = rs.getString ("LAST_NAME"); // učinimo nešto s izdvojenim podacima ...}} catch (SQLException e) {// handle the exception}

Kao što vidimo, unutar probati body, prelistavamo niz rezultata i izvlačimo vrijednosti iz tablice osoba.

4.Povezivanje pomoću ORM-ova

Tipičnije ćemo se povezati s našom MySQL bazom podataka pomoću Okvira za relacijsko mapiranje objekata (ORM). Pa, pogledajmo nekoliko primjera povezivanja pomoću popularnijih ovih okvira.

4.1. Izvorni API-ji za hibernaciju

U ovom ćemo odjeljku vidjeti kako koristiti Hibernate za upravljanje JDBC vezom s našom bazom podataka.

Prvo, moramo dodati hibernacija-jezgra Ovisnost o Mavenu:

 org.hibernate hibernate-core 5.4.10.Final 

Hibernate zahtijeva da se za svaku tablicu mora stvoriti klasa entiteta. Idemo naprijed i definirajmo Osoba razred:

@Entity @Table (name = "Person") javna klasa Osoba {@Id Long id; @Column (name = "FIRST_NAME") String firstName; @Kolona (name = "LAST_NAME") Niz lastName; // dobivači i postavljači} 

Sljedeći važan aspekt je stvaranje datoteke resursa Hibernate, koja se obično naziva hibernate.cfg.xml, gdje ćemo definirati podatke o konfiguraciji:

     com.mysql.cj.jdbc.Driver jdbc: mysql: // localhost: 3306 / test? serverTimezone = UTC korisničko ime lozinka org.hibernate.dialect.MySQL5Dialect potvrdi 

Hibernate ima mnoga konfiguracijska svojstva. Osim standardnih svojstava veze, vrijedno je spomenuti i dijalektno svojstvo koje nam omogućuje da odredimo ime SQL dijalekta za bazu podataka.

Ovo svojstvo koristi okvir za ispravno pretvaranje izraza Hibernate Query Language (HQL) u odgovarajući SQL za našu danu bazu podataka. Hibernate isporučuje s više od 40 SQL dijalekata. Kako se u ovom članku usredotočujemo na MySQL, ostat ćemo na MySQL5Dialect dijalekt.

Napokon, Hibernate također mora znati potpuno kvalificirano ime klase entiteta putem oznake mapiranja. Nakon što dovršimo konfiguraciju, upotrijebit ćemo SjednicaTvornica klasa, koja je klasa odgovorna za stvaranje i objedinjavanje JDBC veza.

To se obično mora postaviti samo jednom za aplikaciju:

SessionFactory sessionFactory; // konfigurira postavke iz hibernate.cfg.xml registra StandardServiceRegistry = novi StandardServiceRegistryBuilder (). configure (). build (); isprobajte {sessionFactory = novi MetadataSources (registar) .buildMetadata (). buildSessionFactory (); } catch (Exception e) {// obrada iznimke}

Sad kad smo uspostavili vezu, možemo pokrenuti upit za odabir svih ljudi iz naše tablice osoba:

Sjednica sesije = sessionFactory.openSession (); session.beginTransaction (); Rezultat popisa = session.createQuery ("od Person", Person.class) .list (); result.forEach (person -> {// učiniti nešto s instancom Person ...}); session.getTransaction (). commit (); session.close ();

4.2. MyBatis

MyBatis je predstavljen 2010. godine i predstavlja SQL mapper okvir čija je snaga jednostavnost. U drugom uputstvu govorili smo o tome kako integrirati MyBatis s Spring i Spring Boot. Ovdje ćemo se usredotočiti na to kako izravno konfigurirati MyBatis.

Da bismo ga koristili, moramo dodati mybatis ovisnost:

 org.mybatis mybatis 3.5.3 

Pod pretpostavkom da ponovno koristimo Osoba klase iznad bez napomena, možemo nastaviti s izradom a PersonMapper sučelje:

javno sučelje PersonMapper {String selectAll = "SELECT * FROM Person"; @Select (selectAll) @Results (value = {@Result (property = "id", column = "ID"), @Result (property = "firstName", column = "FIRST_NAME"), @Result (property = "lastName ", column =" LAST_NAME ")}) Popis selectAll (); }

Sljedeći je korak sve o MyBatis konfiguraciji:

Konfiguracija initMybatis () baca SQLException {DataSource dataSource = getDataSource (); TransactionFactory trxFactory = novo JdbcTransactionFactory (); Okoliš env = novo okruženje ("dev", trxFactory, dataSource); Konfiguracija config = nova konfiguracija (env); TypeAliasRegistry alias = config.getTypeAliasRegistry (); aliases.registerAlias ​​("osoba", Person.class); config.addMapper (PersonMapper.class); povratak config; } DataSource getDataSource () baca SQLException {MysqlDataSource dataSource = novi MysqlDataSource (); dataSource.setDatabaseName ("test"); dataSource.setServerName ("localhost"); dataSource.setPort (3306); dataSource.setUser ("korisničko ime"); dataSource.setPassword ("lozinka"); dataSource.setServerTimezone ("UTC"); vratiti dataSource; }

Konfiguracija se sastoji od stvaranja a Konfiguracija objekt koji je spremnik za postavke poput Okoliš. Sadrži i postavke izvora podataka.

Tada možemo koristiti Konfiguracija objekt, koji se obično postavlja jednom za aplikaciju da stvori SqlSessionFactory:

Konfiguracija konfiguracije = initMybatis (); SqlSessionFactory sqlSessionFactory = novi SqlSessionFactoryBuilder (). Build (konfiguracija); probajte (SqlSession session = sqlSessionFactory.openSession ()) {PersonMapper mapper = session.getMapper (PersonMapper.class); Popis osoba = mapper.selectAll (); // napravite nešto sa popisom osoba ...}

4.3. Apache Cayenne

Apache Cayenne je okvir postojanosti čije prvo izdanje datira iz 2002. Da biste saznali više o njemu, predlažemo da pročitate naš uvod u Apache Cayenne.

Kao i obično, dodajmo cayenne-poslužitelj Ovisnost o Mavenu:

 org.apache.cayenne cayenne-server 4.0.2 

Posebno ćemo se usredotočiti na postavke MySQL veze. U ovom ćemo slučaju konfigurirati cayenne-project.xml:

Nakon automatskog generiranja datamap.map.xml i Osoba razred u obliku a CayenneDataObject, možemo izvršiti neke upite.

Na primjer, nastavit ćemo kao i prije s odabranim svima:

ServerRuntime cayenneRuntime = ServerRuntime.builder () .addConfig ("cayenne-project.xml") .build (); ObjectContext context = cayenneRuntime.newContext (); Popis osoba = ObjectSelect.query (Person.class) .select (context); // učiniti nešto s popisom osoba ...

5.Povezivanje korištenjem proljetnih podataka

Spring Data je programski model za pristup podacima koji se temelji na Springu. Tehnički, Spring Data je krovni projekt koji sadrži mnoge potprojekte koji su specifični za određenu bazu podataka.

Pogledajmo kako koristiti dva od ovih projekata za povezivanje s MySQL bazom podataka.

5.1. Proljetni podaci / JPA

Spring Data JPA robustan je okvir koji pomaže u smanjenju koda i pruža mehanizam za implementaciju osnovnih CRUD operacija putem jednog od nekoliko unaprijed definiranih sučelja spremišta. Uz to, ima i mnoge druge korisne značajke.

Svakako pogledajte naš uvod u Spring Data JPA kako biste saznali više.

The proljeće-podaci-jpa artefakt možete pronaći na Maven Central:

 org.springframework.data spring-data-jpa 2.2.4.OBLAŽENJE 

Nastavit ćemo koristiti Osoba razred. Sljedeći je korak konfiguriranje JPA pomoću napomena:

@Configuration @EnableJpaRepositories ("paketi.to.scan") javna klasa JpaConfiguration {@Bean public DataSource dataSource () {DriverManagerDataSource dataSource = new DriverManagerDataSource (); dataSource.setDriverClassName ("com.mysql.cj.jdbc.Driver"); dataSource.setUrl ("jdbc: mysql: // localhost: 3306 / test? serverTimezone = UTC"); dataSource.setUsername ("korisničko ime"); dataSource.setPassword ("lozinka"); vratiti dataSource; } @Bean public JpaTransactionManageractionManager (EntityManagerFactory emf) {return new JpaTransactionManager (emf); } @Bean public JpaVendorAdapter jpaVendorAdapter () {HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter (); jpaVendorAdapter.setDatabase (Database.MYSQL); jpaVendorAdapter.setGenerateDdl (true); return jpaVendorAdapter; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory () {LocalContainerEntityManagerFactoryBean lemfb = new LocalContainerEntityManagerFactoryBean (); lemfb.setDataSource (dataSource ()); lemfb.setJpaVendorAdapter (jpaVendorAdapter ()); lemfb.setPackagesToScan ("paketi.koji sadrže.entity.classes"); vratiti lemfb; }}

Da bismo Spring Datau omogućili implementaciju CRUD operacija, moramo stvoriti sučelje koje proširuje CrudRepository sučelje:

@Repository javno sučelje PersonRepository proširuje CrudRepository {}

I na kraju, pogledajmo primjer select-all s Spring Data:

personRepository.findAll (). forEach (person -> {// učiniti nešto s izvađenom osobom});

5.2. Proljetni podaci / JDBC

Spring Data JDBC ograničena je implementacija obitelji Spring Data, čiji je primarni cilj omogućiti jednostavan pristup relacijskim bazama podataka.

Iz tog razloga ne nudi značajke poput predmemoriranja, prljavog praćenja, lijenog učitavanja i mnogih drugih JPA značajki.

Ovaj put ovisnost o Mavenu koja nam treba je opruga-podaci-jdbc:

 org.springframework.data spring-data-jdbc 1.1.4.OBLAŽENJE 

Konfiguracija je lakša u odnosu na onu koju smo koristili u prethodnom odjeljku za Spring Data JPA:

@Configuration @EnableJdbcRepositories ("paketi.to.scan") javna klasa JdbcConfiguration produžuje AbstractJdbcConfiguration {// NamedParameterJdbcOperations se interno koristi za podnošenje SQL naredbi u bazu podataka @Bean NamedParameterJdbcOperations operations () {return new NamedPur; } @Bean PlatformTransactionManageractionManager () {vratiti novi DataSourceTransactionManager (dataSource ()); } @Bean public DataSource dataSource () {DriverManagerDataSource dataSource = novi DriverManagerDataSource (); dataSource.setDriverClassName ("com.mysql.cj.jdbc.Driver"); dataSource.setUrl ("jdbc: mysql: // localhost: 3306 / test? serverTimezone = UTC"); dataSource.setUsername ("korisničko ime"); dataSource.setPassword ("lozinka"); vratiti dataSource; }}

U slučaju Spring Data JDBC, moramo definirati novi Osoba klase ili modificirajte postojeću kako biste dodali neke bilješke specifične za Proljeće.

To je zato što će se Spring Data JDBC pobrinuti izravno za mapiranje entiteta umjesto za hibernaciju:

uvoz org.springframework.data.annotation.Id; uvoz org.springframework.data.relational.core.mapping.Column; uvoz org.springframework.data.relational.core.mapping.Table; @Table (value = "Person") javna klasa Person {@Id Long id; @Column (value = "FIRST_NAME") String firstName; @Kolona (vrijednost = "LAST_NAME") Niz lastName; // geteri i postavljači}

S Spring Data JDBC također možemo koristiti CrudRepository sučelje. Dakle, deklaracija će biti identična onoj koju smo napisali gore u primjeru Spring Data JPA. Isto tako, isto se odnosi na primjer odabira svih.

6. Zaključak

U ovom uputstvu vidjeli smo nekoliko različitih načina povezivanja s MySQL bazom podataka s Jave. Počeli smo s bitnom JDBC vezom. Zatim smo pogledali uobičajene ORM-ove poput Hibernate, Mybatis i Apache Cayenne. Na kraju smo pogledali Spring Data JPA i Spring Data JDBC.

Korištenje API-ja JDBC ili Hibernate znači više standardnog koda. Korištenje robusnih okvira, poput Spring Data ili Mybatis, zahtijeva više konfiguracije, ali daje značajnu prednost jer pruža zadane implementacije i značajke poput predmemoriranja i lijenog učitavanja.

Dno Java

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ