Értékek listájának használata a JdbcTemplate IN záradékban

1. Bemutatkozás

Egy SQL utasításban az IN operátorral tesztelhetjük, hogy egy kifejezés megfelel-e a listában szereplő értékeknek. Ezért többféle OR feltétel helyett használhatjuk az IN operátort.

Ebben az oktatóanyagban megmutatjuk, hogyan lehet az értékek listáját átadni egy tavaszi JDBC sablon lekérdezés IN záradékába.

2. Átadás a Lista Paraméter a BAN BEN Kikötés

Az IN operátor lehetővé teszi számunkra, hogy több értéket adjunk meg egy WHERE záradékban. Például arra használhatjuk, hogy megtaláljuk az összes alkalmazottat, akiknek azonosítója szerepel egy megadott azonosító listában:

KIVÁLASZTÁS * AZ ALKALMAZOTTAKBÓL, HOL ID IN (1, 2, 3)

Általában az IN záradékon belüli értékek száma változó. Ezért létre kell hoznunk egy helyőrzőt, amely támogatja az értékek dinamikus listáját.

2.1. Val vel JdbcTemplate

Val vel JdbcTemplate, tudjuk használni '?' karakterek az értékek listájának helyőrzőiként. Száma '?' karakterek megegyeznek a lista méretével:

List getEmployeesFromIdList (List ids) {String inSql = String.join (",", Collections.nCopies (ids.size (), "?")); Alkalmazottak listája = jdbcTemplate.query (String.format ("SELECT * FROM EMPLOYEE WHERE id IN (% s)", inSql), ids.toArray (), (rs, rowNum) -> új alkalmazott (rs.getInt ("id "), rs.getString (" keresztnév "), rs.getString (" vezetéknév "))); visszatérő alkalmazottak; } 

Ebben a módszerben először előállítunk egy helyőrző karakterláncot, amely tartalmazza ids.size () „?” karaktereket vesszővel elválasztva. Ezután betesszük ezt a karaktersorozatot az SQL utasításunk IN záradékába. Például, ha három számunk van a azonosítók listában az SQL utasítás:

KIVÁLASZTÁS * AZ ALKALMAZOTTAKBÓL, HOL ID ID (?,?,?)

Ban,-ben lekérdezés módszer, átadjuk a azonosítók lista paraméterként, hogy megfeleljen az IN záradékban lévő helyőrzőknek. Így dinamikus SQL utasítást hajthatunk végre az értékek bemeneti listája alapján.

2.2. Val vel NamedParameterJdbcTemplate

A dinamikus értéklista kezelésének másik módja a használat NamedParameterJdbcTemplate. Például közvetlenül létrehozhatunk egy megnevezett paramétert az input listához:

GetEmployeesFromIdListNamed (Lista azonosítók) lista {SqlParameterSource paraméterek = új MapSqlParameterSource ("azonosítók, azonosítók); Az alkalmazottak listája = namedJdbcTemplate.query ("SELECT * FROM EMPLOYEE WHERE id IN (: ids)", paraméterek, (rs, rowNum) -> új alkalmazott (rs.getInt ("id"), rs.getString ("first_name") , rs.getString ("vezetéknév"))); visszatérő alkalmazottak; }

Ebben a módszerben először a MapSqlParameterSource objektum, amely a bemeneti id listát tartalmazza. Ezután csak egy megnevezett paramétert használunk az értékek dinamikus listájának ábrázolására.

A motorháztető alatt, NamedParameterJdbcTemplate a megnevezett paramétereket helyettesíti a „?” helyőrzők és felhasználások JdbcTemplate a lekérdezés végrehajtásához.

3. Kezelése egy nagy Lista

Ha egy listán nagyszámú érték szerepel, akkor meg kell fontolnunk az alternatív módon történő átadásukat az JdbcTemplate lekérdezés.

Például az Oracle adatbázis nem támogat 1000 liternél többet egy IN záradékban.

Ennek egyik módja az hozzon létre egy ideiglenes táblázatot a listához. A különböző adatbázisok azonban eltérő módon hozhatják létre ideiglenes táblákat. Például használhatjuk a LÉTREHOZ GLOBÁLIS IDEIGLENES TÁBLÁZAT utasítás az ideiglenes tábla létrehozásához az Oracle adatbázisban.

Hozzunk létre egy ideiglenes táblázatot a H2 adatbázis számára:

List getEmployeesFromLargeIdList (List ids) {jdbcTemplate.execute ("CREATE IDEIGLENES TÁBLÁZAT, HA NEM LÉTRE munkavállaló_tmp (id INT NOT NULL)"; List workerIds = new ArrayList (); for (Integer id: ids) {workerIds.add (új objektum [] {id}); } jdbcTemplate.batchUpdate ("INSERT INTO worker_tmp VALUES (?)", workerIds); Alkalmazottak listája = jdbcTemplate.query ("KIVÁLASZTÁS * MUNKAVÁLLALÓTÓL, HOL ID IN (KIVÁLASZTÁS ID-BŐL alkalmazott_tmp)", (rs, rowNum) -> új alkalmazott (rs.getInt ("id"), rs.getString ("keresztnév") , rs.getString ("vezetéknév"))); jdbcTemplate.update ("TÖRLÉS A munkavállaló_tmp-ből"); visszatérő alkalmazottak; }

Itt először létrehozunk egy ideiglenes táblázatot a bemeneti lista összes értékének tárolására. Ezután beillesztjük az input lista értékeit ebbe a táblázatba.

Az eredményül kapott SQL utasításunkban az IN záradékban szereplő értékek az ideiglenes táblázatból származnak, és elkerültük az IN záradék összeállítását nagyszámú helyőrzővel.

Végül a lekérdezés befejezése után megtisztítjuk az ideiglenes táblázatot a későbbi újrafelhasználás céljából.

4. Következtetés

Ebben az oktatóanyagban megmutattuk, hogyan kell használni JdbcTemplate és NamedParameterJdbcTemplate értéklista átadásához az SQL lekérdezés IN záradékához. Ezenkívül alternatív módot is biztosítottunk nagyszámú listaérték kezelésére egy ideiglenes tábla használatával.

Mint mindig, a cikk forráskódja elérhető a GitHubon.