Tahák - MySQL a kolekce v Javě

MySQL

CRUD operace

-- INSERT - vložení záznamu INSERT INTO uzivatele (jmeno, email) VALUES ('Jan', 'jan@email.cz'); -- SELECT - výběr dat SELECT * FROM uzivatele WHERE id = 1; -- UPDATE - aktualizace UPDATE uzivatele SET jmeno = 'Petr' WHERE id = 1; -- DELETE - smazání DELETE FROM uzivatele WHERE id = 1;

Základní SQL funkce

-- Počet uživatelů SELECT COUNT(*) FROM uzivatele; -- Průměrný věk SELECT AVG(vek) FROM uzivatele; -- Spojení jména a příjmení SELECT CONCAT(jmeno, ' ', prijmeni) AS cele_jmeno FROM uzivatele;

JOIN operace

-- INNER JOIN - uživatelé s objednávkami SELECT u.jmeno, o.datum FROM uzivatele u INNER JOIN objednavky o ON u.id = o.uzivatel_id; -- LEFT JOIN - všichni uživatelé (i bez objednávek) SELECT u.jmeno, o.datum FROM uzivatele u LEFT JOIN objednavky o ON u.id = o.uzivatel_id;

Databázové vazby (relace)

Příklady vazeb:
• 1:1 - Uživatel → Profil (každý uživatel má jeden profil)
• 1:N - Kategorie → Produkty (jedna kategorie má více produktů)
• M:N - Studenti ←→ Kurzy (studenti mohou mít více kurzů)

Databázové indexy

-- Vytvoření indexu CREATE INDEX idx_email ON uzivatele (email); -- Vytvoření unikátního indexu CREATE UNIQUE INDEX idx_unique_email ON uzivatele (email); -- Složený index CREATE INDEX idx_jmeno_prijmeni ON uzivatele (jmeno, prijmeni);

Kolekce a proudy v Javě

Generické vs. obecné kolekce

Typ Příklad Výhody Nevýhody
Obecné kolekce List list = new ArrayList(); Kompatibilita se starším kódem Chybějící typová kontrola, nutnost přetypování
Generické kolekce List<String> list = new ArrayList<>(); Typová bezpečnost, čitelnost kódu Méně flexibilní při práci s různými typy
// Obecná kolekce - problém s typovou kontrolou List list = new ArrayList(); list.add("text"); list.add(123); // Kompilátor nehlásí chybu String text = (String) list.get(1); // Runtime error! // Generická kolekce - typová bezpečnost List list = new ArrayList<>(); list.add("text"); // list.add(123); // Kompilační chyba String text = list.get(0); // Žádné přetypování

Hashmapy

// Vytvoření a použití HashMap Map mapa = new HashMap<>(); mapa.put("Jan", 25); mapa.put("Petr", 30); // Čtení hodnoty int vek = mapa.get("Jan"); // 25 // Kontrola existence klíče if (mapa.containsKey("Jan")) { System.out.println("Jan je v mapě"); } // Iterace přes mapu for (Map.Entry entry : mapa.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); }

Základní principy Stream API

// Základní operace Stream API List jmena = Arrays.asList("Jan", "Petr", "Anna", "Eva"); // Filtrování a transformace List vysledek = jmena.stream() .filter(jmeno -> jmeno.length() > 3) // pouze jména delší než 3 znaky .map(String::toUpperCase) // převod na velká písmena .sorted() // seřazení .collect(Collectors.toList()); // sebrání do seznamu // Agregační operace long pocet = jmena.stream().count(); Optional nejdelsi = jmena.stream() .max(Comparator.comparing(String::length)); // Seskupování Map> podleDelky = jmena.stream() .collect(Collectors.groupingBy(String::length));

Hlavní rozdíly mezi kolekcemi

Rozhraní Implementace Charakteristika Použití
List ArrayList, LinkedList Uspořádaná, povoluje duplicity Když potřebujete zachovat pořadí
Set HashSet, TreeSet Neuspořádaná, žádné duplicity Když potřebujete jedinečné hodnoty
Map HashMap, TreeMap Klíč-hodnota, klíče jedinečné Když potřebujete asociativní pole
Queue LinkedList, PriorityQueue FIFO nebo prioritní fronta Když potřebujete frontu
Tip: Stream API je výkonné, ale pro jednoduché operace mohou být tradiční cykly čitelnější a efektivnější.