Jar JDBC

1. Prehľad

V tomto článku si ukážeme praktické prípady použitia modulu Spring JDBC.

Všetky triedy na jar JDBC sú rozdelené do štyroch samostatných balíkov:

  • jadro - základná funkčnosť JDBC. Niektoré dôležité triedy v rámci tohto balíka zahŕňajú JdbcTemplate, SimpleJdbcInsert,SimpleJdbcCall a NamedParameterJdbcTemplate.
  • dátový zdroj - triedy nástrojov pre prístup k zdroju údajov -. Má tiež rôzne implementácie zdroja údajov na testovanie kódu JDBC mimo kontajnera Jakarta EE.
  • objekt - DB prístup objektovo orientovaným spôsobom. Umožňuje vykonávať dotazy a vracať výsledky ako obchodný objekt. Mapuje tiež výsledky dotazu medzi stĺpcami a vlastnosťami obchodných objektov.
  • podpora - podporné triedy pre triedy pod jadro a objekt balíkov. Napr. poskytuje SQLException funkčnosť prekladu.

2. Konfigurácia

Na začiatok začnime s jednoduchou konfiguráciou zdroja údajov (v tomto príklade použijeme databázu MySQL):

@Configuration @ComponentScan ("com.baeldung.jdbc") verejná trieda SpringJdbcConfig {@Bean public DataSource mysqlDataSource () {DriverManagerDataSource dataSource = nový DriverManagerDataSource (); dataSource.setDriverClassName ("com.mysql.jdbc.Driver"); dataSource.setUrl ("jdbc: mysql: // localhost: 3306 / springjdbc"); dataSource.setUsername ("guest_user"); dataSource.setPassword ("heslo_ hosťa"); vrátiť dátový zdroj; }}

Prípadne môžeme tiež dobre využiť vloženú databázu na vývoj alebo testovanie - tu je rýchla konfigurácia, ktorá vytvorí inštanciu vloženej databázy H2 a vopred ju naplní jednoduchými skriptmi SQL:

@Bean public DataSource dataSource () {return new EmbeddedDatabaseBuilder () .setType (EmbeddedDatabaseType.H2) .addScript ("classpath: jdbc / schema.sql") .addScript ("classpath: jdbc / test-data.sql"). Zostavenie (); } 

Nakoniec - to isté sa samozrejme dá urobiť pomocou konfigurácie XML pre dátový zdroj:

3. The JdbcTemplate a spustenie dotazov

3.1. Základné dotazy

Šablóna JDBC je hlavným rozhraním API, prostredníctvom ktorého budeme mať prístup k väčšine funkcií, ktoré nás zaujímajú:

  • vytváranie a uzatváranie spojení
  • vykonávanie príkazov a volaní uložených procedúr
  • iterácia nad Sada výsledkov a návratnosť výsledkov

Po prvé, začnime na jednoduchom príklade, ktorý ukáže, čo JdbcTemplate môcť urobiť:

int result = jdbcTemplate.queryForObject ("VYBERTE POČET (*) OD ZAMESTNÁVATEĽA", Integer.class); 

a tiež tu je jednoduchý VLOŽIŤ:

public int addEmplyee (int id) {return jdbcTemplate.update ("INSERT INTO EMPLOYEE VALUES (?,?,?,?)", id, "Bill", "Gates", "USA"); }

Všimnite si štandardnú syntax poskytovania parametrov - pomocou znaku `? Ďalej - pozrime sa na alternatívu k tejto syntaxi.

3.2. Dotazy s pomenovanými parametrami

Získať podpora pomenovaných parametrov, použijeme ďalšiu šablónu JDBC poskytovanú rámcom - the NamedParameterJdbcTemplate.

Týmto sa navyše zalamuje JbdcTemplate a poskytuje alternatívu k tradičnej syntaxi pomocou „?”Na upresnenie parametrov. Pod kapotou nahrádza pomenované parametre parametrom JDBC „?“ zástupný symbol a delegáti na zabalené JDCTemplate na vykonanie dotazov:

SqlParameterSource namedParameters = nový MapSqlParameterSource (). AddValue ("id", 1); návrat namedParameterJdbcTemplate.queryForObject ("VYBERTE PRVÉHO_NAME ZO ZAMESTNÁVATEĽA KDE ID =: id", namedParameters, String.class);

Všimnite si, ako používame MapSqlParameterSource poskytnúť hodnoty pre pomenované parametre.

Pozrime sa napríklad na príklad, ktorý používa vlastnosti z fazule na určenie pomenovaných parametrov:

Zamestnanec zamestnanec = nový zamestnanec (); employee.setFirstName ("James"); Reťazec SELECT_BY_ID = "VYBERTE COUNT (*) OD ZAMESTNANCA KDE PRVÉ_NAME =: meno"; SqlParameterSource namedParameters = nový BeanPropertySqlParameterSource (zamestnanec); návrat namedParameterJdbcTemplate.queryForObject (SELECT_BY_ID, namedParameters, Integer.class);

Všimnite si, ako teraz využívame BeanPropertySqlParameterSource namiesto manuálneho zadávania pomenovaných parametrov ako predtým.

3.3. Mapovanie výsledkov dotazu na objekt Java

Ďalšou veľmi užitočnou funkciou je schopnosť mapovať výsledky dotazov na objekty Java - implementáciou RowMapper rozhranie.

Napríklad - pre každý riadok vrátený dotazom Spring používa mapovač riadkov na vyplnenie Java bean:

verejná trieda EmployeeRowMapper implementuje RowMapper {@Override public Employee mapRow (ResultSet rs, int rowNum) hodí SQLException {zamestnanec zamestnanec = nový zamestnanec (); employee.setId (rs.getInt ("ID")); employee.setFirstName (rs.getString ("FIRST_NAME")); employee.setLastName (rs.getString ("LAST_NAME")); employee.setAddress (rs.getString ("ADRESA")); návratný zamestnanec; }}

Následne môžeme odovzdať mapovač riadkov do API dotazu a získať plne osídlené objekty Java:

Reťazcový dotaz = "VYBERTE * OD ZAMESTNANCA KDE ID =?"; Zaměstnanec zamestnanec = jdbcTemplate.queryForObject (dopyt, nový objekt [] {id}, nový EmployeeRowMapper ());

4. Výnimka z prekladu

Jar prichádza s vlastnou hierarchiou výnimiek z dát už po vybalení z krabice - s DataAccessException ako koreňová výnimka - a prekladá do nej všetky základné nespracované výnimky.

A tak si zachovávame zdravý rozum, keď nebudeme musieť zvládať výnimky z pretrvávania na nízkej úrovni a ťažiť zo skutočnosti, že jar zakrýva výnimky na nízkej úrovni DataAccessException alebo jednej z jeho podtried.

Toto tiež udržuje mechanizmus spracovania výnimiek nezávislý od základnej databázy, ktorú používame.

Okrem toho predvolené SQLErrorCodeSQLExceptionTranslator, môžeme tiež zabezpečiť vlastnú implementáciu SQLExceptionTranslator.

Tu je rýchly príklad vlastnej implementácie, prispôsobenia chybovej správy, ak dôjde k porušeniu duplicitného kľúča, čo má za následok chybový kód 23505 pri použití H2:

verejná trieda CustomSQLErrorCodeTranslator rozširuje SQLErrorCodeSQLExceptionTranslator {@Override chránený DataAccessException customTranslate (úloha reťazca, reťazec sql, SQLException sqlException) {if (sqlException.getErrorCode () == 23505) {vrátiť nový DuplicateKeyException ("nový" DuplicateKeyException) ); } return null; }}

Ak chcete použiť tento vlastný prekladač výnimiek, musíme ho odovzdať JdbcTemplate volaním setExceptionTranslator () metóda:

CustomSQLErrorCodeTranslator customSQLErrorCodeTranslator = nový CustomSQLErrorCodeTranslator (); jdbcTemplate.setExceptionTranslator (customSQLErrorCodeTranslator);

5. Operácie JDBC pomocou tried SimpleJdbc

SimpleJdbc triedy poskytujú jednoduchý spôsob konfigurácie a vykonávania príkazov SQL. Tieto triedy používajú na zostavenie základných dotazov metaúdaje databázy. SimpleJdbcInsert a SimpleJdbcCall triedy poskytujú ľahší spôsob vykonávania volaní vložených a uložených procedúr.

5.1. SimpleJdbcInsert

Poďme sa pozrieť na vykonávanie jednoduchých príkazov vloženia s minimálnou konfiguráciou.

Príkaz INSERT je generovaný na základe konfigurácie SimpleJdbcInsert a všetko, čo potrebujeme, je poskytnúť názov tabuľky, názvy stĺpcov a hodnoty.

Najskôr vytvorme a SimpleJdbcInsert:

SimpleJdbcInsert simpleJdbcInsert = nový SimpleJdbcInsert (dataSource) .withTableName ("EMPLOYEE");

Ďalej uveďte názvy a hodnoty stĺpcov a vykonajte operáciu:

public int addEmplyee (Zamestnanec emp) {Parametre mapy = nový HashMap (); parameters.put ("ID", emp.getId ()); parameters.put ("FIRST_NAME", emp.getFirstName ()); parameters.put ("LAST_NAME", emp.getLastName ()); parameters.put ("ADRESA", emp.getAddress ()); return simpleJdbcInsert.execute (parametre); }

Ďalej umožniť databázy na vygenerovanie primárneho kľúča, môžeme využiť executeAndReturnKey () API; budeme tiež musieť nakonfigurovať samotný stĺpec, ktorý sa generuje automaticky:

SimpleJdbcInsert simpleJdbcInsert = nový SimpleJdbcInsert (dataSource) .withTableName ("EMPLOYEE") .usingGeneratedKeyColumns ("ID"); Číslo id = simpleJdbcInsert.executeAndReturnKey (parametre); System.out.println ("Generované ID -" + id.longValue ());

Nakoniec - tieto údaje môžeme odovzdať aj pomocou znaku BeanPropertySqlParameterSource a MapSqlParameterSource.

5.2. Uložené procedúry s SimpleJdbcCall

Poďme sa tiež pozrieť na vykonávanie uložených procedúr - využijeme SimpleJdbcCall abstrakcia:

SimpleJdbcCall simpleJdbcCall = nový SimpleJdbcCall (dataSource) .withProcedureName ("READ_EMPLOYEE"); 
public Employee getEmployeeUsingSimpleJdbcCall (int id) {SqlParameterSource in = new MapSqlParameterSource (). addValue ("in_id", id); Map out = simpleJdbcCall.execute (in); Zamestnanecké emp = nový zamestnanec (); emp.setFirstName ((String) out.get ("FIRST_NAME")); emp.setLastName ((String) out.get ("LAST_NAME")); návrat emp; }

6. Dávkové operácie

Ďalší jednoduchý prípad použitia - dávkovanie viacerých operácií naraz.

6.1. Základné dávkové operácie pomocou JdbcTemplate

Použitím JdbcTemplate, dávkové operácie je možné vykonať prostredníctvom batchUpdate () API.

Zaujímavá je tu stručná, ale veľmi užitočná časť BatchPreparedStatementSetter implementácia:

public int [] batchUpdateUsingJdbcTemplate (zoznam zamestnancov) {return jdbcTemplate.batchUpdate ("INSERT INTO EMPLOYEE VALUES (?,?,?,?)", new BatchPreparedStatementSetter () {@Override public void setValues, intedStatement (PreparedStatement), PreparedStatement {ps.setInt (1, zamestnanci.get (i) .getId ()); ps.setString (2, zamestnanci.get (i) .getFirstName ()); ps.setString (3, zamestnanci.get (i). getLastName ()); ps.setString (4, zamestnanci.get (i) .getAddress ();} @Override public int getBatchSize () {návrat 50;}});}

6.2. Dávkové operácie pomocou NamedParameterJdbcTemplate

Máme tiež možnosť dávkových operácií s NamedParameterJdbcTemplatebatchUpdate () API.

Toto API je jednoduchšie ako predchádzajúce - nie je potrebné implementovať žiadne ďalšie rozhrania na nastavenie parametrov, pretože má interne pripravený nastavovač príkazov na nastavenie hodnôt parametrov.

Namiesto toho môžu byť hodnoty parametrov odovzdané do batchUpdate () metóda ako pole SqlParameterSource.

SqlParameterSource [] dávka = SqlParameterSourceUtils.createBatch (zamestnanci.toArray ()); int [] updateCounts = namedParameterJdbcTemplate.batchUpdate ("INSERT INTO EMPLOYEE VALUES (: id,: firstName,: lastName,: address)", batch); vrátiť updateCounts;

7. Pružina JDBC s pružinou

Spring Boot poskytuje štartér spring-boot-starter-jdbc na používanie JDBC s relačnými databázami.

Rovnako ako v prípade každého spúšťača Spring Boot, aj tento pomáha pri rýchlom spustení a spustení našej aplikácie.

7.1. Maven závislosť

Budeme potrebovať spring-boot-starter-jdbc závislosť ako primárna, aj závislosť pre databázu, ktorú budeme používať. V našom prípade je to tak MySQL:

 org.springframework.boot spring-boot-starter-jdbc mysql mysql-connector-java runtime 

7.2. Konfigurácia

Spring Boot pre nás automaticky nakonfiguruje zdroj údajov. Musíme len poskytnúť vlastnosti v a vlastnosti spis:

spring.datasource.url = jdbc: mysql: // localhost: 3306 / springjdbc spring.datasource.username = guest_user spring.datasource.password = guest_password

To je všetko, iba vykonaním týchto konfigurácií je naša aplikácia funkčná a môžeme ju použiť na ďalšie operácie s databázami.

Explicitná konfigurácia, ktorú sme videli v predchádzajúcej časti pre štandardnú aplikáciu Spring, je teraz zahrnutá ako súčasť automatickej konfigurácie Spring Boot.

8. Záver

V tomto článku sme sa pozreli na abstrakciu JDBC v jarnom rámci, kde sme rôznymi praktickými príkladmi pokryli rôzne možnosti poskytované jarnou JDBC.

Pozreli sme sa tiež na to, ako môžeme rýchlo začať s Spring JDBC pomocou štartéra Spring Boot JDBC.

Zdrojový kód príkladov je k dispozícii na serveri GitHub.