Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 3. diel - Databázy v Java JDBC - Výpis dát a parametre

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
Mára Toner
Člen
Avatar
Odpovedá na Neaktivní uživatel
Mára Toner:5.7.2016 15:22

Sice nejsem David, ale pokusím se na vše odpovědět, aby to pochopili i ostatní, protože Tvé dotazy nejsou od věci.

Nejprve vysvětlím, jak přesně funguje ta bezpečnost - jak třída PreparedStatement zaručí, že nedojde k SQL Injection. Zkrátka - nejprve probíhají přípravy. Připravíme si náš dotaz, uvedeme jeho tvar (String) a poté pomocí metody setString a identifikátoru parametru uvedeme, čím se daný parametr nahradí.

A teď - když zavoláme metodu executeQuery, dotaz se odešle do databázového stroje - ale ve tvaru s tím otazníkem, ještě tam vůbec není uživatelský parametr. Databázový stroj ví, co to znamená - o to se postará třída PreparedStatement, že odešle vše, jak má být. Databázový stroj si tedy provede všechny vnitřní záležitosti, dotaz zkompiluje, uloží do mezipaměti a čeká na parametry. Poté, co je obdrží, nahradí "otazník" tím parametrem samotným - avšak už se nic nekompiluje, čili dotaz samotný (ten původní, náš dotaz) je zkompilovaný a je to tedy funkční kód, který se v databázi provede, kdežto parametr je ve tvaru čistých dat, která se do DB vloží - a je s nimi tedy i tak manipulováno.
Bezpečnost je tedy zajištěna na té nejnižší úrovni. Je to podle mě daleko lepší způsob, než escape sekvence, které i tak kompilují potencionálně nebezpečný kód.

K odeslání dotazu na SQL server dojde po zavolání metody executeQuery - vše předtím jsou pouze naše, lokální přípravy. Vytvoříme tedy dotaz, určíme jeho parametry - a AŽ POTÉ dotaz odešleme.
Druhý blok try je také blok "Try with resources", který se postará o správné zakončení po jeho vykonání. V těle bloku již máme výsledná data k dispozici v KOLEKCI ResultSet.
Nad touto kolekcí tedy můžeme zavolat metodu next.Tuto metodu nevoláme v cyklu, protože díky tvaru dotazu a použití operátoru WHERE víme, že nám SQL dotaz vrátil pouze "1 řádek" výsledků. Předpokládáme totiž, že každé slovo bude v databázi unikátní a bude mít uložen pouze jeden překlad. Samozřejmě, v reálné databázi by mohlo být nalezeno více významů, proto by se to muselo vhodně ošetřit (třeba cyklem).

Je to sice taková malá slohovka, ale číst se to doufám dá. Ve skutečnosti se tam nic moc složitého neděje a je to jednoduché k pochopení, ale chápu, že zpočátku se v tom člověk může lehce ztratit...

Hodně štěstí!

Odpovedať
If at first you don't succeed; call it version 1.0
Avatar
Filip Něnička:8.10.2019 16:58

Ahoj všem.
Poprosil bych vás o radu. Bohužel se mi nedaří vypsat data z databáze a už nevím čím to může být. Databázi mám připojenou podle lekce 2, to funguje bez problémů. Když dám execute command a něco zadám tak to funguje, takže propojené to je. Když se ale snažím vypsat databázi dle této lekce tak to nefunguje a hodí to "Chyba při komunikaci s databází". Nevíte kde by mohl být problém? Rozdíl jsem našel v JDK verzi(mám JDK 13) a kihovnu jsem si musel stáhnout a vytvořit sám. Nebyla tam.

Můj kód:

package slovnicek;
import java.sql.Connec­tion;
import java.sql.Driver­Manager;
import java.sql.Prepa­redStatement;
import java.sql.ResultSet;
import java.sql.SQLEx­ception;

public class Slovnicek {
public static void main(String[] args) {
try (Connection spojeni = DriverManager­.getConnection("jdbc:mys­ql://localhos­t:3306/slovni­cek_db?user=ro­ot&password=");
PreparedStatement dotaz = spojeni.prepa­reStatement("SE­LECT * FROM slovo");
ResultSet vysledky = dotaz.execute­Query();) {

while (vysledky.next()) {
int id = vysledky.getInt(1);
String cesky = vysledky.getStrin­g("cesky");
String anglicky = vysledky.getStrin­g("anglicky");
System.out.prin­tln("Id: " + id + ", česky: " + cesky + ", anglicky: " + anglicky);
}

} catch (SQLException ex) {
System.out.prin­tln("Chyba při komunikaci s databází");
}

}
}

Díky za rady

Editované
Avatar
Odpovedá na Filip Něnička
Petr Štechmüller:8.10.2019 18:41

Ahoj, dej si do té výjimky výpis chyby

ex.printStackTrace();

To to to řekne, kde přesně je chyba ;-)

Odpovedať
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Robert Michalovič:9.10.2019 6:25

Důležitou roli hraje taky i kompatibilita mezi verze connectoru(stažený *.jar) a verzí databáze a verzí Javy. Podle mě je problém v JDK13. Dost pochybuji, že je podporována. Používej 8čku a stáhni si správný connector JDBC.
viz. tabulka

Avatar
Odpovedá na Robert Michalovič
Filip Něnička:9.10.2019 19:05

Ahoj Roberte.
Díky za radu, pomohlo to :)

Filip

Avatar
Filip Něnička:13.10.2019 16:43

Ahoj,
měl bych ještě jeden dotaz. Snažím se změnit název tabulky co mám v databázi. Nemohu příjít na to, proč mi to nefunguje přes setName. Nevíte někdo kde tam je chyba?

Díky

Filip

String nazevVozidla = "fdadfa";
try (Connection spojeni = DriverManager­.getConnection("jdbc:mys­ql://localhos­t/drivvo?user=ro­ot&password=");
PreparedStatement dotaz = spojeni.prepa­reStatement("RE­NAME TABLE tabulka to ?");) {
dotaz.setString(1, nazevVozidla);
int radku = dotaz.execute­Update();
System.out.prin­tln(radku);
} catch (SQLException ex) {
ex.printStackTra­ce();
System.out.prin­tln("Chyba při komunikaci s databází");

Avatar
Odpovedá na Filip Něnička
Petr Štechmüller:13.10.2019 17:01

Ahoj, pro vložení kódu tu máme tlačítko.

Můžu se zeptat, odkud jsi získal ten dotaz na přejmenování tabulky? :-) Já jsem našel něco jiného:

ALTER TABLE table_name
  RENAME TO new_table_name
Odpovedať
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovedá na Petr Štechmüller
Filip Něnička:13.10.2019 18:05

Ahoj,
našel jsem to myslím na jednom blogu. Pokud zde můžu vkládat odkazy tak bych ho sem vložil. Ono to funguje pokud tam místo otazníku zadám jméno. Jde o ten otázník a setString. To nefunguje. To je ten problém :-/

Avatar
Odpovedá na Filip Něnička
Petr Štechmüller:13.10.2019 19:35

Co přesně znamená nefunguje? Je to dost obecný popis problému, se kterým ti nemůžu poradit. Koukal jsem, že tam máš při výjimce výpis ze stack trace, tak ho sem hoď

Odkaz sem samozřejmě hodit můžeš ;-)

Odpovedať
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Filip Něnička:14.10.2019 18:52

Ahoj.
Díky za trpělivost :-)

Háže mi to tuto chybu"
java.sql.SQLSyn­taxErrorExcep­tion: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near fdadfa at line 1

A tady je ten blog :-)

"":https://blog.marceloaltmann.com/…as-no-mysql/

Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 31.