CodeGym/Java kursus/All lectures for DA purposes/Forespørgsler med parametre

Forespørgsler med parametre

Ledig

4.1 Parametre for forespørgsler

Hibernate giver dig mulighed for at videregive parametre til forespørgsler. Alt arbejde med forespørgsler og databasen er således meget forenklet.

Det er meget sjældent at finde uforanderlige forespørgsler. I første omgang ser det ud til, at du bare skal returnere en liste over varer fra databasen. Og så viser det sig, at du skal have en opdateret liste over produkter til en bestemt bruger på en bestemt dato. Sorteret efter det påkrævede felt og endnu ikke hele listen, men en bestemt side: for eksempel produkter fra 21 til 30.

Og det er præcis, hvad parametriserede forespørgsler løser. Du skriver en forespørgsel i HQL, og så erstatter du de værdier, der kan ændres, med "særlige navne" - parametre. Og så separat, når du udfører anmodningen, kan du videregive værdierne for disse parametre.

Lad os skrive en HQL-forespørgsel, der returnerer alle opgaver for en bruger med et specifikt navn:

from EmployeeTask where employee.name = "Ivan Ivanovich"

Lad os nu erstatte navnet med en parameter:

from EmployeeTask where employee.name = :username

Og sådan vil vores Java-kode til at finde opgaver se ud:

String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

I stedet for et parameternavn kan du også kun bruge et tal:

String hql = "from EmployeeTask where employee.name = :1";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter(1, "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

Selvom det selvfølgelig er bedre at bruge navnet - det er meget nemmere at læse og vedligeholde en sådan kode.

4.2 setParameterList() metode.

Der er også tilfælde, hvor parameterværdien ikke er én, men repræsenterer en liste over objekter. For eksempel vil vi kontrollere, at medarbejdernes erhverv er indeholdt i en bestemt liste.

Hvordan kunne dette gøres:


String hql = "from EmployeeTask where occupation IN (:occupation_list)";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameterList("occupation_list", new String[] {"Programmer", "Tester"});
List<EmployeeTask> resultLIst = query.list();

4 typer liste kan overføres som en parameterværdi:

  • række af objekter: Objekt[]
  • samling: Samling
  • indtastet array: T[]
  • maskinskrevet samling: Samling<T>

Hvis du beslutter dig for at videregive en indtastet samling eller et array, skal du videregive datatypen som den tredje parameter. Eksempel:


String hql = "from EmployeeTask where occupation IN (:occupation_list)";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameterList("occupation_list", new String[] {"Programmer", "Tester"}, String.class);
List<EmployeeTask> resultLIst = query.list();

Når du arbejder med listeparametre, kan du også bruge et tal i stedet for parameternavnet. Men igen, navnet er mere bekvemt.

4.3 Beskyttelse mod SQL-injektion

Et af de vigtigste formål med parametrene er at beskytte databasen mod SQL-injektioner. Mange nybegyndere programmører ville i stedet for at bruge parametre simpelthen lime en streng af flere dele sammen.

I stedet for at skrive sådan her:

String hql = "from EmployeeTask where employee.name = :username";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter("username", "Ivan Ivanovich");
List<EmployeeTask> resultLIst = query.list();

Ville skrive sådan her:

String hql = "from EmployeeTask where employee.name = " + "Ivan Ivanovich";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
List<EmployeeTask> resultLIst = query.list();

Gør det aldrig!Klæb aldrig en SQL/HQL-forespørgsel fra flere dele sammen. For før eller siden vil brugernavnet komme til dig fra klienten. Og den onde hacker vil give dig en streng som""Ivan"; DROP TABLE user;"

Og så vil din forespørgsel til databasen tage formen:

from EmployeeTask where employee.name = "Ivan"; DROP TABLE user;

Og det er stadig godt, hvis dine data blot bliver slettet. Du kan også skrive sådan her:

from EmployeeTask where employee.name = "Ivan";
UPDATE user SET password = '1' WHERE user.role = 'admin'

Eller sådan her:

from EmployeeTask where employee.name = "Ivan";
UPDATE user SET role = 'admin' WHERE user.id = 123;
Kommentarer
  • Populær
  • Ny
  • Gammel
Du skal være logget ind for at skrive en kommentar
Denne side har ingen kommentarer endnu