NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 3 - Databáze v Java JDBC - Výpis dat a parametry

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Mára Toner
Člen
Avatar
Odpovídá 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í!

Odpovědět
5.7.2016 15:22
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

Editováno 8.10.2019 17:00
 
Odpovědět
8.10.2019 16:58
Avatar
Odpovídá 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 ;-)

Odpovědět
8.10.2019 18:41
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

 
Odpovědět
9.10.2019 6:25
Avatar
Odpovídá na Robert Michalovič
Filip Něnička:9.10.2019 19:05

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

Filip

 
Odpovědět
9.10.2019 19:05
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í");

 
Odpovědět
13.10.2019 16:43
Avatar
Odpovídá 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
Odpovědět
13.10.2019 17:01
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá 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 :-/

 
Odpovědět
13.10.2019 18:05
Avatar
Odpovídá 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š ;-)

Odpovědět
13.10.2019 19:35
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/

 
Odpovědět
14.10.2019 18:52
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 31.