Bruke en liste over verdier i en JdbcTemplate IN-klausul

1. Introduksjon

I en SQL-setning kan vi bruke IN-operatøren til å teste om et uttrykk samsvarer med noen verdi i en liste. Derfor kan vi bruke IN-operatøren i stedet for flere ELLER-forhold.

I denne opplæringen viser vi hvordan du sender en liste over verdier i IN-leddet i et Spring JDBC-malspørsmål.

2. Bestått en Liste Parameter til I Klausul

IN-operatøren lar oss spesifisere flere verdier i en WHERE-ledd. For eksempel kan vi bruke den til å finne alle ansatte hvis id er i en spesifisert ID-liste:

VELG * FRA MEDARBEIDER der du er i (1, 2, 3)

Vanligvis er det totale antallet verdier i IN-setningen variabel. Derfor må vi lage en plassholder som kan støtte en dynamisk verdiliste.

2.1. Med JdbcTemplate

Med JdbcTemplate, Vi kan bruke '?' tegn som plassholdere for verdilisten. Antallet ‘?’ tegn vil være de samme som størrelsen på listen:

List getEmployeesFromIdList (List ids) {String inSql = String.join (",", Collections.nCopies (ids.size (), "?")); Liste medarbeidere = jdbcTemplate.query (String.format ("VELG * FRA MEDARBEIDER der ID IN (% s)", inSql), ids.toArray (), (rs, rowNum) -> ny ansatt (rs.getInt ("id "), rs.getString (" first_name "), rs.getString (" last_name "))); returnere ansatte; } 

I denne metoden genererer vi først en plassholderstreng som inneholder ids.size () ‘? ' tegn skilt med komma. Deretter setter vi denne strengen i IN-setningen i SQL-setningen. For eksempel hvis vi har tre tall i ID-er liste, er SQL-setningen:

VELG * FRA MEDARBEIDER HVOR ID er i (?,?,?)

I spørsmål metoden, passerer vi ID-er listen som en parameter for å matche plassholderne i IN-setningen. På denne måten kan vi utføre en dynamisk SQL-setning basert på inngangslisten med verdier.

2.2. Med NamedParameterJdbcTemplate

En annen måte å håndtere den dynamiske verdilisten på er å bruke NamedParameterJdbcTemplate. For eksempel kan vi direkte opprette en navngitt parameter for inngangslisten:

List getEmployeesFromIdListNamed (List ids) {SqlParameterSource parameters = new MapSqlParameterSource ("ids, ids); Liste medarbeidere = namedJdbcTemplate.query ("VELG * FRA MEDARBEIDER der ID IN (: ids)", parametere, (rs, rowNum) -> ny ansatt (rs.getInt ("id"), rs.getString ("first_name") , rs.getString ("etternavn"))); returnere ansatte; }

I denne metoden konstruerer vi først en MapSqlParameterSource objekt som inneholder inngangs-ID-listen. Deretter bruker vi bare en navngitt parameter for å representere den dynamiske verdilisten.

Under panseret, NamedParameterJdbcTemplate erstatter de navngitte parametrene for ‘?’ plassholdere og bruksområder JdbcTemplate for å utføre spørringen.

3. Håndtere en stor Liste

Når vi har et stort antall verdier i en liste, bør vi vurdere alternative måter å overføre dem til JdbcTemplate spørsmål.

For eksempel støtter Oracle-databasen ikke mer enn 1000 liter i en IN-klausul.

En måte å gjøre det på er å lage en midlertidig tabell for listen. Imidlertid kan forskjellige databaser ha forskjellige måter å lage midlertidige tabeller på. For eksempel kan vi bruke LAG GLOBAL MIDLERTIDIG BORD uttalelse for å lage en midlertidig tabell i Oracle-databasen.

La oss lage en midlertidig tabell for H2-databasen:

List getEmployeesFromLargeIdList (List ids) {jdbcTemplate.execute ("CREATE MORPORARY TABLE IF NOT EXISTS employee_tmp (id INT NOT NULL)"); Liste ansatteIds = ny ArrayList (); for (Integer id: ids) {medarbeiderIds.add (nytt objekt [] {id}); } jdbcTemplate.batchUpdate ("INSERT INTO employee_tmp VALUES (?)", employeeIds); Liste ansatte = jdbcTemplate.query ("VELG * FRA MEDARBEIDER id der I (VELG id FRA ansatt_tmp)", (rs, rowNum) -> ny ansatt (rs.getInt ("id"), rs.getString ("first_name") , rs.getString ("etternavn"))); jdbcTemplate.update ("SLETT FRA ansatt_tmp"); returnere ansatte; }

Her oppretter vi først en midlertidig tabell for å inneholde alle verdiene i inngangslisten. Deretter setter vi inngangslistens verdier i denne tabellen.

I vår resulterende SQL-setning, verdiene i IN-setningen er fra den midlertidige tabellen, og vi har unngått å lage en IN-klausul med et stort antall plassholdere.

Til slutt, når vi er ferdig med spørringen, rydder vi opp den midlertidige tabellen for fremtidig gjenbruk.

4. Konklusjon

I denne opplæringen viste vi hvordan du bruker JdbcTemplate og NamedParameterJdbcTemplate for å sende en liste over verdier for IN-setningen til et SQL-spørsmål. Vi ga også en alternativ måte å håndtere et stort antall listeverdier ved å bruke en midlertidig tabell.

Som alltid er kildekoden for artikkelen tilgjengelig på GitHub.


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