2017 m. spalio 23 d., pirmadienis

Java Aplinka

Java iš komandinės eilutės

Java komandinės eilutės įrankių aprašymai: http://docs.oracle.com/javase/6/docs/technotes/tools/index.html#basic

Pagrindiniai:

  • javac - java kompiliatorius.
  • java - naudojama paleisti Java programoms.
  • jar - JAR failų ruošimo įrankis.

javac naudojimas ir parametrai

javac [options] [sourcefiles] [classes] [@argfiles]

Pagrindiniai “nustatymai”:
-cp arba -classpath - kabliataškais atskirti keliai iki jar failų ar aplankų su *.class failais. Nenurodžius naudojamas sistemos kintamasis CLASSPATH.
-d katalogas - nustatoma, į kokį katalogą patalpinti sukompiliuotą kodą.
-sourcepath sourcepath - nustatoma iš kur imti klasių kodą. Gali būti direktorijos, zip ir jar failai, atskiriami “;”. Klasės rastos classpath gali būti perkompiliuojamos, jei jos randamos ir sourcepath.
Sourcefiles - tai failai, kuriuos norime kompiliuoti.
classes - class failai, kurie apdorojami ieškant annotacijų. Plačiau neaptarsime.
@argfiles - options ir sourcefiles rinkiniai surašyti į failus

Kas yra JAR failai

  • JAR = Java ARchive files. Tai iš esmės zip failai, su specialia struktūra.
  • Idealiu atveju - tai nuo sistemos nepriklausantys vykdomi failai, kuriuose surenkami daugelis Java programai reikalingų failų (pvz paveikslėlių).
  • Pagrindinėms operacijoms naudojamas jar įrankis, kuris yra dalis JDK.
Sukurti JAR failą: jar cf jar-file input-file(s)
  • c - create, f - rezultatas turėtų būti failas, rašomi be tarpų, gali būti bet kokia tvarka.
  • jar-file - norimo jar failo pavadinimas.
  • input-file(s) - tarpu atskirtų failų ar direktorijų sąrašas (direktorijos bus automatiškai išskleidžiamos į failų sąrašus).
  • Peržiūrėti JAR failo turinį : jar tf jar-file 
  • t - table of contents, rodo kad norime peržiūrėti turinį; f - reiškia, kad taikomės į failą, kurį nurodysime komandinėje eilutėje
  • jar-file - pavadinimas failo, kurio turinį norime peržiūrėti.
Išskleisti JAR failą - jar xf jar-file [archived-file(s)]
  • x - nurodoma, kad norime išskleisti jar failą; f - kad failą nurodysime komandinėje eilutėje.
  • jar-file - failas, kurį norime išskleisti.
  • [archived-file(s)] - failai JAR faile, kuriuos norime išskleisti. Jei nenurodyti detaliai - išskleidžiami visi.
  • išskleistas JAR failo turinys bus patalpintas į direktoriją, kurioje vykdoma komanda, išlaikant vidinę JAR failo aplankų struktūrą.
Papildyti JAR failą: jar uf jar-file input-file(s)
  • u - update, nurodo, kad bus pildomas failas; f - kad faila bus nurodytas komandinėje eilutėje.
  • jar-file - failas, kurį norėsime papildyti.
  • input-file(s) - tarpais atskirtų failų sąrašas, kuriuos norėsime įkelti į JAR failą.
  • Failai jau esantys JAR’o viduje bus pakeisti naujais.
JAR failai: vykdymas

JAR failus galima paleisti (įvykdyti), JEI:

Programa paleidžiama iš komandinės eilutės ir supakuota į JAR failą paleidžiama taip: 
java -jar jar-file
META-INF/MANIFEST.MF faile turi būti nurodyta Main klasė įrašant tokią eilutę: Main-Class: classname

JAR Manifest failai
  • JAR failai gali būti pasirašomi elektroniniu būdu, tvarkomi kodo versijavimo sistemose, užtikrinti paketo vientisumą (sealing a package).
  • Šioms funkcijoms reikalinga informacija saugoma manifest faile (META-INF/MANIFEST.MF, sukuriamas pagal nutylėjimą jar įrankio kuriant patį JAR failą)

Manifest failo keitimas JAR’e

jar cfm jar-file manifest-addition-file input-file(s)
  • c - jar failo kūrimas, f - nurodymas, kad jar failo pavadinimas bus komandinėje eilutėje, m - nurodymas, kad esamas JAR failas apjungiamas su manifest addition-file turiniu.
  • manifest-addition-file - tekstinis failas, kurio turiniu bus papildytas dabar egzistuojantis manifest failas.
Nustatant EntryPoint klasę galima naudoti komandą: 

jar cfe jar-file-name package.MainClassName input-file(s)
  • e - nurodo, kad bus nustatomas main klasės pavadinimas
  • package.MainClassName - main klasės paketas ir pavadinimas atitinkamai.
Classpath

  • Classpath - tai stringas iš nuorodų atskirtų “;” į vartotojo sukurtas klases. Šios nuorodos reikalingos įvairiems Java įrankiams ir programoms (pvz javac, java ir t.t.)
  • Classpath nuorodos rodo į jar ir zip failus arba class failų direktoriją. Jei kalba eina apie class failus direktorijoje - užtenka nurodyti kelią iki aukščiausio lygio paketo direktorijos.
  • Classpath galima nustatyti kaip sistemos kintamąjį ‘CLASSPATH’ arba kiekvienu atveju individualiai kviečiant java įrankius nurodžius parametrą -classpath.
  • “*” wildcard naudojimas reiškia, kad visi direktorijoje esantys jar failai bus įtraukti į classpath, bet .class failai -ne.
  • Visi *.class failai iš foo bus įtraukti į classpath įrašius tiesiog “foo”.
  • Java paketų, nepaisant to, kad jie atvaizduojami kaip katalogai failų sistemoje, nereikia rašyti į classpath.
Classpath tvarkymas

1. Maven - paruošiama lokali bendra classpath direktorija, kuria visi sutartinai naudojasi per CLASSPATH sistemos kintamąjį.
2. Rankomis Eclipse “Project properties”->.classpath failas projekto direktorijoje. Jo padavimas programai paleidimo metu - Eclipse reikalas.
3. “Po plika Java” - nustatant -classpath/-cp parametrus arba sistemos kintamąjį CLASSPATH http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

Classloader
  • Classloading - tai mechanizmas, kuris ieško reikalingų klasių Java programos veikimui.
  • Absoliučia dauguma atvejų naudojamas standartinis classloading mechanizmas, kurį pateikia JRE.
  • Klasių ieškoma iš eilės šiose vietose:
    • Bootstrap klasės: veikimui būtinos runtime klasės iš rt.jar, internationalization klasės iš i18n.jar ir pan.
    • Instaliuoti plėtiniai specialiuose kataloguose: JRE instaliaciniame kataloge lib/ext; Specializuotuose OS plėtinių saugyklose (nuo Java6), pvz /usr/jdk/packages/lib/ext naudojant Solaris.
    • Classpath nurodytuose jar ir zip failuose, direktorijose (tokia tvarka, kaip jie išvardinti classpath).

2017 m. spalio 22 d., sekmadienis

Darbas su duomenimis

Darbas su duomenimis


  • Įvestis ir išvestis (io streams, buffers)
  • Properties file usage
  • Duomenų tipų konvertavimas
  • Autoboxing and Unboxing


Java duomenų srautai

  • Byte srautai - bitų duomenų skaitymui ir rašymui.
  • Character srautai - naudojami tekstinių simbolių rašymui ir skaitymui, automatiškai apdorojant vertimą į ir iš VM aplinkoje nustatytų simbolių rinkinių.
  • Buffered srautai - skirti optimizuoti sistemos žemo lygio kvietimų skaičių.
  • Scanning ir Formatting srautai - padeda programai rašyti ir skaityti formatuotą tekstą.
  • Command line I/O - darbui su komandine eilute.
  • Data Streams - naudojami primityvių duomenų ir String’ų rašymui/skaitymui.
  • Object Streams - naudojami įvairių objektų binariniam rašymui/skaitymui.


Darbas su srautais

  1. Klaidų apdorojimas - nepamiršti try-catch.
  2. Srautai turi būti atidaromi ir uždaromi tvarkingai.
  3. Paprastų srautų pavyzdžiai:
    1. Byte - FileInputStream, FileOutputStream
    2. Character - FileReader, FileWriter
    3. Simbolių eilučių - BufferedReader, PrintWriter.
    4. System.in,System.out,System.err, System.console()
    5. Duomenų srautai: DataInputStream ir DataOutputStream.
  4. Objektų srautai - ObjectInputStream and ObjectOutputStream

Trys standartiniai srautai, kuriuos visada galima panaudoti:
  • System.in - InputStreamReader cin = new InputStreamReader(System.in);
  • System.out - System.out.println("Some randome text.");
  • System.err - System.err.println("No console.");
Console
  • Sukūrimas - Console c = System.console();
  • Gali būti naudojamas slaptažodžių nuskaitymui.

Darbas su failais

java.nio.file.Path - nuo Java7. Java.io.File su ankstesnėmis versijomis.
Veiksmai su failais / aplankais.
Failų kūrimas, skaitymas ir rašymas.


java.nio.file.Path, java.io.File

  • java.nio.file.Path - nuo Java7.java.io.File - ankstesniais atvejais.
  • Pagrindinės išspręstos java.io.File problemos:
  • Senesnės versijos gražinami klaidos pranešimai buvo neinformatyvūs.
  • Problemos su metodais: nepatikimas rename veikimas, prastas veikimas esant dideliam
  • apkrovimui.
  • Nepatikimas failų sistemos simbolinių nuorodų (“Symbolic links”) veikimas.
  • Nepakankamas rinkinys priemonių darbui su meta duomenimis.

Veiksmai su failais/aplankais

  • Path - kelias iki failo duotoje failų sistemoje
    • Pvz /home/katalogas/failas1.txt arba c:\users\katalogas\failas1.txt
  • Patikrinti ar egzistuoja/pasiekiamas - Files.exists, Files.notExists
  • Ištrinti - delete(Path), deleteIfExists(Path)
  • Kopijuoti - Files. copy(Path, Path, CopyOption...)
  • CopyOption - tai papildomų parametrų sąrašas atskirtas kableliais arba masyvas CopyOption[]. Galimos reikšmės: REPLACE_EXISTING, COPY_ATTRIBUTES, NOFOLLOW_LINKS.
  • Perkelti - move(Path, Path, CopyOption...)

Failų kurimas:
  • createFile(Path, FileAttribute<?>)
  • createTempFile(Path, String, String, FileAttribute<?>)
  • createTempFile(String, String, FileAttribute<?>)

Properties failo naudojimas

Properties failas naudojamas key-value reikšmėms saugoti.
Properties reikšmės naudojamos sistemos veikimo konfigūravimui, pvz - atsisiuntimų išsaugojimo vieta.
Raktas ir reikšmė visada String tipo.
Java aplinka visada palaiko sistemos aplinkos konfigūracijos failą. Daugiau apie sistemos konfigūracijos savybes čia

properties panaudojimas

Pagrindiniai Properties objekto metodai:
  • contains(Object value), containsKey(Object key)
  • getProperty(String key), getProperty(String key, String default)
  • list(PrintStream s), list(PrintWriter w)
  • elements(), keys(), and propertyNames(), stringPropertyNames()
  • size()
  • setProperty(String key, String value)
  • remove(Object key)

Duomenų tipų konvertavimas

Galimi duomenų konvertavimai (conversion) Java kalboje: http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html
  • Plėtimas (Widening primitive) - primityvaus duomenų tipo praplėtimas vyksta, kai mažesnio tikslumo tipas konvertuojamas į didesnio tikslumo tipą.
  • Primityvųs tipai jų tikslumo didėjimo tvarka: byte, short, int, long, float ir double.
  • Priešingas konvertavimas vadinamas siaurinimo (Narrowing primitive), tačiau jis naudojamas retai ir turi būti naudojamas atsargiai, kadangi yra galimybė prarasti informaciją.
  • Objekto bendrinimas (Widening reference) - objektą visada galima laikyti jo tėvinės klasės objektu.
  • Objekto siaurinimas/specializacija (Narrowing reference) - objektą galima laikyti tėvinės klasės subklasės objektu tik atlikus tinkamus veiksmus (jei įmanoma išvis).
Autoboxing ir Unboxing - primityvių tipų konvertavimas į atitinkamus objektus ir atgal, 
pvz:
int -> Integer yra vadinamas autoboxing, Integer -> int - Unboxing. Kiti galimi variantai: boolean
  • Unchecked conversions
  • Capture conversions
  • String conversions
  • Value set conversions
Autoboxing ir Unboxing

Autoboxing - “kintamojo įdėjimas į objekto dėžutę”, pvz int į Integer. Unboxing - “objekto transformavimas į primityvų tipą”, pvz Byte į byte. Konvertavimas vykdomas: perduodant kintamuosius kaip parametrus, jei metodas tikisi atitinkamo Objekto arba primityvios reikšmės. Priskiriant primityvią reikšmę objektui arbaatvirkščiai.

2017 m. spalio 21 d., šeštadienis

Java kolekcijos

java.util.Collection - pagrindinis kolekcijų interfeisas. Žymi elementų rinkinį ir įgyvendina java.util.Iterable - kolekcijas galima naudoti foreach sakinyje.
java.util.List - kolekcija sauganti surikiuotus elementus (sąrašas)
java.util.Set - kolekcija sauganti unikalius elementus (aibė)
java.util.SortedSet - kolekcija sauganti surūšiuotus unikalius elementus (surūšiuota aibė)


Foreach

ArrayList<String> eilutes = new ArrayList<>();

for (String eilute: eilutes) {
System.out.println(eilute);
}

Pagrindinės List realizacijos

java.util.ArrayList - realizacija paremta dinamiškai augančiu masyvu
  • Greitesnė iteracija
  • Kompaktiškas
  • Greitesnis iterpimas gale ar arti galo
  • Greitesnė prieiga prie n-tojo elemento
java.util.LinkedList - realizacija paremta dvipusiu sąrašu
  • Greitesnis įterpimas į sąrašo vidurį
  • Greitesnis šalinimas iš sąrašo vidurio
List pavyzdys

List<Integer> skaiciai = new ArrayList<>();
skaiciai.add(4);
skaiciai.add(5);

for (Integer skaicius: skaiciai) {
System.out.println(skaicius);
}

Pagrindinės Set ir Sorted realizacijos

  • java.util.Set
    • java.util.HashSet - realizacija paremta HashMap
  • java.util.SortedSet
    • java.util.TreeSet - realizacija paremta TreeMap
java.util.Map

Kolekcija sauganti elementų poras (K, V), kur K raktas pagal kurį galima surasti V.
Pavyzdžiui galime į kolekciją dėti automobilių objektus pagal jų numerį.


Map realizacijos

java.util.HashMap - saugo elementus pagal rakto maišos (hash) funkciją
java.util.LinkedHashMap - saugo elementus kaip ir HashMap, papildomai saugodamas ir elementų tvarką.
Aiški elementų iteracijos tvarka (pagal įdėjimo arba priėjimo tvarką).
java.util.TreeMap - saugo elementus dvejetainiame medyje. Aiški elementų iteracijos tvarka (pagal raktą).

Map pavyzdys

HashMap<Integer, String> skaiciuVardai = new HashMap<>();
skaiciuVardai.put(1, “Vienas”);
skaiciuVardai.put(2, “Du”);
skaiciuVardai.put(3, “Trys”);

System.out.println(skaiciuVardai.get(2));


hashCode() ir equals()

  • Visi objektai įgyvendina hashCode() ir equals()
  • Pagal nutylėjimą realizacijos paveldimos iš java.lang.Object
    • Neteisingos tipiniams naudojimo atvejams
equals()

  • Standartinis atsako į klausimą “Ar tai tas pats objektas?” (lyg lyginant su ==)
  • Kontraktas sako, kad turėtų atsakyti “Ar tai toks pat objektas?”
  • Perrašome, tam kad du tokie patys objektai galėtų būti
    • lygūs. Pvz.: sukurkime du skaičiaus objektus:
    • Integer penki = new Integer(5);
    • Integer kitasPenki = new Integer(5);
    • Jei būtų naudojamas standartinis equals(...) objektai nebūtų lygūs
• Paprastai įgyvendinamas lyginant laukų reikšmes.
• IDE paprastai moka sugeneruoti

hashCode()

Panaudojamas HashMap objektų dėliojimui į “kibirus”. Nuo teisingos ir geros realizacijos priklauso ar objektą bus galima teisingai panaudoti kaip HashMap raktą. Pasak equals() lygių metodų hashCode() turi grąžinti vienodą reikšmę.IDE moka sugeneruoti teisingą


Palyginami objektai

  • Palyginami objektai gali būti “didesni” ar “mažesni” vieni už kitus (arba “pirmesni” ir “paskesni”)
  • Palyginami objektai įgyvendina java.util.Comparable interfeisą.
  • Tokie objektai talpinami į sąrašus gali būti išrūšiuojame.

java.util.Comparator

  • Intefeisas leidžiantis įgyvendinti rušiavimo tvarkos nustatymo algoritmą nerūšiuojamiems objektams
  • Naudojamas TreeSet, TreeMap

2017 m. spalio 20 d., penktadienis

Duomenų bazių projektavimas

Duomenų tipai

Kuriant lentelę reikia išvardyti jos stulpelius, kiekvienam kurių būtina nurodyti galimų reikšmių
aibę– stulpelio tipą. Visų pirma stulpelio duomenų tipui priskiriama duomenų rūšis:

  • Simboliniai duomenys
  • Dvejetainiai duomenys
  • Skaičiai
  • Datos
  • Laikas

Simboliniai duomenys (angl. character datatypes).

Simbolių eilutė turi simbolių skaičiaus atributą – ilgį. 

Fiksuoto ilgio simbolių eilutės:
  • CHAR(n) – iki 254 bait,
Kintamo ilgio:
  • VARCHAR(n) – iki 32672 (4000) baitų ilgio,
  • CLOB(n[K|M|G]) – iki 2 GB (4 GB).
Kai n > 254 užklausose negalima naudoti:
  • DISTINCT,GROUP BY,ORDER BY

Skaitiniai duomenys (number datatypes).

SMALLINT – sveikieji skaičiai [-32 768; 32 767].
INTEGER – „dideli“ sveikieji skaičiai (4 baitai) [-2 147 483 648; 2 147 483 647].
BIGINT – „ypač dideli“ sveikieji skaičiai (8 b)
REAL – slankiojo kablelio skaičiai, 32 bitai, pvz., -2E5, 5.555E-18, -.655645e8.
FLOAT (DOUBLE) – dvigubo tikslumo skaičiai (64 b)
DECIMAL (n, m) (NUMERIC) – dešimtainiai supakuoti skaičiai – iki 1000 (31) dešimtainių
skaitmenų.

Dvejetainiai duomenų tipai (binary datatypes).

BIT(n)- Fiksuoto ilgio:

Kintamojo ilgio:
BIT VARYING(n)
BLOB(n[K|M|G])


Datos ir laiko duomenys.
DATE – (atmintyje – 4 baitai)
TIME – (3 baitai)
TIMESTAMP –(10 bait)
DATE ir TIME vaizdavimas priklauso nuo terpės
(locale),
2005.01.01, 12:00:00,
2005-01-01-12.15.55.330000
DBVS visada „supranta“ ISO datą ir laiką:
2005-01-01, 12:00:00

Visi SQL duomenų tipai turi ypatingą reikšmę - NULL.

Parinkus stulpeliui duomenų tipą, reikia parinkti ilgio charakteristiką ir tikslumą.


Lentelės kūrimo sintaksė

CREATE TABLE

Kuriant (apibrėžiant) lentelę būtinai nurodoma:
  • lentelės vardas.
  • lentelės stulpelių vardai ir jų tipai.

NOT NULL - stulpelis negali įgyti NULL reikšmės.
DEFAULT - numatytoji reikšmė

Indeksų kūrimas

Indeksas yra objektas kuris gali pagreitinti priėjimą prie duomenų, pateikiant eilutes iš lentelės vartotojui. Jie gali būti sukuriami automatiškai ar išoriškai. Jei nėra indekso priskirto stulpeliui tai pilna lentelė bus peržiūrima.
Indeksas pasirūpina tiesioginį ir greitą priėjimą prie eilučių lentelėse. Jų tikslas yra pašalinti diskų I/O operacijas, tam panaudojant indeksų dalį . Indeksus automatiškai naudoja ir palaiko ORCLE Serveris. Kai jau kartą indeksai yra sukurti, jokių vartotojo tiesioginių veiksmų nereikia. Indeksai yra logiškai ir fiziškai nepriklausomi nuo lentelės kuriai jie sukurti. Tai reiškia kad jie gali būti sukurti ar panaikinti bet kuriuo laiku ir neturi įtakos bazinei lentelei ar kitiems indeksams. Kai lentelė panaikinama, surišti su ja indeksai taip pat panaikinami.Taigi indeksai kuriami automatiškai ar rankiniu būdu. Automatiškai jie kuriami kai jūs nustatote pirminį raktą arba stulpelio reikšmes apibūdinate kaip unikalias. Rankiniu būdu galima suskurti indeksą dėl neunikalių stulpelio reikšmių kad pagreitinti priėjimą prie eilučių.

Indeksas gali būti kuriamas vienai ar keliems stulpeliams.
CREATE INDEX Indeksas ON Lentelė (Stulpelis1[,stulpelis2]...);

Padidinti užklausos greitį galima per Ename lentelei EMP.
CREATE INDEX Emp_Ename_idx ON EMP(Ename);
DROP INDEX Emp_Ename_Index;

Daug indeksų lentelei nereiškia kad tai pagreitins darbą. Kiekviena DML operacija kuri
baigiama per COMMIT lentelei su indeksais reiškia kad ir indeksai turi būti atnaujinami.
Daugiau indeksų kuriuos surišate su lentele, daugiau pastangų Serveris turi kad atnaujinti
indeksus po DML.

Indeksai kuriami kai:
  • Dažnai stulpeliai naudojami paragrafe WHERE ar apjungimo sąlygoje
  • Stulpelis talpina plačią reikšmių eilę.
  • Stulpelis talpina didelį kiekį NULL reikšmių
  • Du ar daugiau stulpelių dažnai naudojamos kartu WHERE paragrafe ar apjungimo sąlygoje
  • Lentelė yra didelė ir daugumoje užklausų yra pateikiami 2-4% visų lentelės eilučių.

Negalima kurti indeksų:
  • Kai lentelė yra maža.
  • Stulpeliai nėra dažnai vartojami kaip sąlyga užklausoje.
  • Dauguma užklausų tikisi ištraukti daugiau nei 2-4% visų lentelės eilučių.
  • Lentelė dažnai yra atnaujinama.

DB projektavimas
  • Atliekamas prieš pradedant DB formavimo procesą.
  • Svarbus norint sukurti efektyvią, tikslią, poreikius atitinkančią sistemą.
  • Patartina planavimą pradėti raštu ant balto popieriaus lapo.
  • Nors atrodo, kad toks projektavimas yra laiko gaišimas pradžioje, tačiau išties daugiau laiko sugaištama vėliau, jei prieš tai neplanuojama.
DB projektavimo procesas

  1. Numatyti duomenų bazės paskirtį.
  2. Apibrėžti, kokios lentelės bus reikalingos.
  3. Apibrėžti, kokie laukai turės būti DB lentelėse.
  4. Nurodyti laukus su unikaliomis reikšmėmis.
  5. Nustatyti, kaip lentelės siesis tarpusavyje.
  6. Tobulinti pradinį projektą.

DB paskirtis

Pradedant kurti duomenų bazę reikia atsakyti į tris esminius klausimus:

  1. Kokius duomenis turėtų kaupti duomenų bazė?
  2. Kokią informaciją apie šiuos duomenis norės žinoti DB vartotojas?
  3. Kokius veiksmus vartotojas norės atlikti su duomenimis?

Išoriniai raktai:

Pirminiai raktai taip pat atlieka vaidmenį kuriant ryšius tarp lentelių. Vienos lentelės
pirminis laukas įterpiamas į kitą lentelę ir tampa ten išoriniu raktu.

DB normalizavimas 
  • Patikrinimas, kad:
    • Lentelėje yra tik su pirminiu raktu susiję duomenys,
    • Kad kiekviename lauke yra tik vienas duomenų blokas.
    • Kad pasikartojantys duomenys yra eliminuoti
  • Normalizavimo tikslai:
    • Duomenų surikiavimas į tokias logines grupes, kad kiekviena grupė apibūdintų
    • dalį visumos;
    • Pasikartojančių duomenų kiekio duomenų bazėje minimizavimas;
    • Efektyviai ir greitai prieinamos ir valdomos duomenų bazės sukūrimas nepakenkiant duomenų vientisumui;
    • Sukūrimas tokios struktūros, kad keičiant duomenis, juos reikėtų taisyti tik vienoje vietoje.
Ryšiai tarp lentelių

Ryšys – sąsaja tarp bendrų laukų dvejose duomenų bazės lentelėse.
Trys tipai:
  • 1:1
    • Naudojamas retai, paprastai dėl saugumo, arba kai dalis lentelės laukų dažniausiai būna tušti
  • ◦1:∞
    • Dažniausiai naudojamas ryšys. Pirminis raktas su išorinio rakto lauku kitoje lentelėje
  • ◦∞: ∞
    • Reikia skaidyti į du 1:∞ ryšius per tarpinę lentelę
Tobulinimas

Sudėliojus pirminį DB projektą (lentelės, laukai ir ryšiai) reikia atidžiai jį išnagrinėti, ieškant galimų trūkumų.

Patikrinkite, ar tokia duomenų bazės struktūra leis jums gauti tuos atsakymus, kurių norite.

Paskutinė galimybė lengvai ištaisyti DB struktūros klaidas!


Dažniausios klaidos
  • Per mažai dėmesio planavimui
  • Normalizavimo ignoravimas
  • Prastai parinkti laukų/lentelių pavadinimai
  • Dokumentacijos trūkumas

Duomenų išrinkimas (SQL JOIN sakinys)

Kelių lentelių jungimas

Viena iš svarbiausių SELECT sakinio galimybių yra dviejų ar daugiau lentelių jungimas (angl. join).

Užklausa, jungianti 2 lenteles:

SELECT <stulpeliai> FROM <lentel1>, <lentel2>
WHERE <jungimo slyga> [AND <paieškos slyga>]

Daugelyje DBVS yra užtikrinamas lentelių jungimas SELECT sakinio fraze JOIN:

SELECT <stulpeliai>
FROM <lentelė1> JOIN <lentelė 2>
ON <jungimo sąlyga>
[WHERE <paieškos sąlyga>]



Pavardės vykdytojų, vykdančių projektą Nr. 1:

SELECT Pavardė
FROM Vykdytojai, Vykdymas
WHERE Vykdytojas = Nr AND Projektas = 1
Sąlyga Vykdytojas = Nr - loginis ryšys tarp dviejų lentelių.



Bendruoju atveju, jei užklausoje dviems lentelms nėra jokios sąlygos ir vienoje iš lentelių yra n eilučių, o kitoje - m eilučių, tai rezultatą sudarys m × n eilučių

Informacija apie tai, kokie vykdytojai kokius projektus vykdo ir kiek kiekvienam projektui skiria
valandų:

SELECT Pavardė, Pavadinimas, Valandos
FROM Vykdytojai, Projektai, Vykdymas
WHERE Projektas = Projektai.Nr AND
Vykdytojas = Vykdytojai.Nr

Stulpelio Nr patikslinimas lentelės vardu yra būtinas, nes dvi lentelės turi stulpelį vardu Nr.


Užklausa, jungianti 2 lenteles:

SELECT <stulpeliai> FROM <lentel1>, <lentel2>
WHERE <jungimo slyga> [AND <paieškos slyga>]

Daugelyje DBVS yra užtikrinamas lentelių jungimas SELECT sakinio fraze JOIN:

SELECT <stulpeliai>
FROM <lentelė1> JOIN <lentelė 2>
ON <jungimo sąlyga>
[WHERE <paieškos sąlyga>]

Struktrinės užklausos



Vienoje užklausoje gali būti ir kita užklausa, t.y. galimos struktūrinės užklausos – „Structured QL“.

Keli SELECT sakiniai yra griežtoje hierarchinėje priklausomybėje.
Pavardės vykdytojų, dalyvaujančių projekte Nr. 1:

SELECT Pavardė FROM Vykdytojai
WHERE Nr IN (SELECT Vykdytojas
FROM Vykdymas
WHERE Projektas = 1)

Programų testavimas ir derinimas

Programų testavimas ir derinimas

  • Java išimčių gaudymas (sakiniai try, catch ir finally)
  • Java išimčių apibrėžimas ir gaudymas
  • Standartinis Java logging mechanizmas
  • JUnit karkasas, TDD
  • Eclipse derinimo mechanizmas

Java išimtys (exceptions)
  • Java išimtys įvyksta, kai sutrikdomas normalus programos veikimas (pavyzdžiui dalyba iš 0, bandymas nuskaityti neegzituojančio objekto lauką, t.t.)
  • Java kalboje išimtys valdomos try-catch sakinių pagalba.
  • Tinkamai parašyta Java paprograme turi apdoroti arba deklaruoti galimas klaidas.
Išimčių tipai - tikrinamos išimtys

Tikrinami (checked) - išimtys, nuo kurių programa neturėtų nulūžti ir su kuriomis turi galėti susidoroti.
Taip vadinami, nes jų tvarkymas tikrinamas kompiliuojant
Galimų išimčių sąrašas yra metodo apibrėžimo dalis.
Naudojant metodą reikalaujama, kad tikrinamos išimtys būtų apdorotos naudotojo kode.
Tai visos išimtys išskyrus tas, kurios yra Error, RuntimeException ar jų plėtiniai.

Klaidos - (errors) tai išimtys nuo kurių programos gali atsigauti arba ne, priklausomai nuo autoriaus pasirinkto apdorojimo. Tai klasės Error ir jos plėtinių tipo klaidos. Pavyzdžiui - disko skaitymo klaida: programa gali nuspręsti lūžti arba pranešti vartotojui, kad failas, nors ir atidarytas - bet negali būti nuskaitytas.

Veiklos sutrikimai (runtime exceptions) - klaidos, nuo kurių programa nulūžta jos veikimo metu.
Įvykus runtime išimtims nebesitikima, kad programa gali toliau normaliai veikti, todėl jų specialaus jų apdorojimo kompiliatorius nereikalauja.  Dažniausiai tai RuntimeException klasės ir jos plėtinių tipo klaidos. Pavyzdžiui programos tikslas yra gaminti kėdes ir staiga į konvėjerį patenka stalas, kurį bandant apdoroti gali sugriūti viskas ARBA tiesiog neaišku, kaip stalo atsiradimą apdoroti.

Unchecked išimčių kontraversija

Tikrinamų klaidų naudojimas pagerina programos veikimo aiškumą ir reikalavimų naudotojui aiškumą. Jei tai naudinga - kodėl nedaryti visų išimčių tikrinamomis? Nes neviską programa gali apdoroti ir jaudintis dėl kietojo disko gedimo rašant kalkuliatoriaus programą nėra
prasmės.
 Trumpai: jei galima ir logiška tikėtis, kad metodo naudotojas gali ir/ar turėtų apdoroti kažkokią specifinę išimtį - reikėtų naudoti tikrinamas išimtis, kitu atveju - ne.

Logging elementai

• Logger - objektas, naudojamas žinutėms kurti. Dažniausiai tiesiogiai siejamas su klasės pavadinimu.
• Handler - žurnalo žinučių tvarkymui naudojami objektai (pvz atspausdinti konsolėje, įrašyti į failą, etc.)
• Filter - žurnalo žinučių filtravimui naudojami objektai (pvz - tik žinutės iš mano klasės, tik žinutės su daugiau nei 20 simbolių)
• Formatter - žurnalų žinučių formatavimui naudojamas objektas. Retai keičiamas.
• LogManager - žurnalų tvarkymo objektas, sukuriamas Java sistemos. Dažniausiai jo naudoti nereikia.

Java logging - žinučių svarba

  • SEVERE (highest value)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST (lowest value)
  • Nurodžius pvz INFO - įrašomos visos INFO ir svarbesnės žinutės, bet ignoruojamos žemesnės svarbos.
JUnit pagrindinės taisyklės
  1. Testai turi būti trumpi ir testuoti konkrečius dalykus.
  2. Testas turi būti bendros formos “<esant pradinei situacijai> <kai įvykdomi veiksmai> <turi būti gautas rezultatas>” (given-when-then).
  3. Testo metodo pavadinimas turi apibūdinti, ką tas testas tikrina, pvz:. ordersShouldBeCreated.
Eclipse derinimo mechanizmas
  • Pagrindinės derinimo sąvokos/komandos.
  • Programos paleidimas derinimo režimu.
  • Kintamųjų stebėjimas, keitimas.
  • Išraiškų vykdymas.
  • Web aplikacijų derinimas.

Derinimas - Sąvokos
  • Breakpoint - sustojimo taškas. Programa paleista derinimo rėžimu sustos šioje vietoje ir nevykdys toliau einančio kodo.
  • Conditional breakpoint - sustojimo taškas, jei tenkinama sąlyga.
  • Watch(a.k.a.expression) - laukas ar reiškinys, kurio reikšmė stebima derinimo metu.

2017 m. spalio 19 d., ketvirtadienis

Duomenų išrinkimas (SQL SELECT sakinys)

Duomenų išrinkimas panaudojant

WHERE sakinyje nurodoma sąlyga, kurią turi tenkinti grąžinamos eilutės.
ORDER BY sakiniu nurodoma viena ar daugiau rikiavimo sąlygų.
GROUP BY sąlygoje nurodoma, kad reikia grupuoti tam tikras eilutes. Grupuojant eilutes, dažniausiai naudojamos agregatinės funkcijos maksimalioms, vidutinėms ir panašioms reikšmėms išrinkti iš grupuotų eilučių.
HAVING sakinyje nurodomas kriterijus, taikomas grupuojamoms eilutėms; šis
raktinis žodis gali būti naudojamas tik tais atvejais, jeigu užklausoje yra GROUP
BY sakinys.

1.Platesnis WHERE paragrafo panaudojimas

Duomenų išrinkimui pagal užduotą sąlygą formuojama užklausa, naudojant
paragrafą WHERE. Sąlyga gali būti pateikiama kaip aritmetinė išraiška ar kaip
simbolių eilutė, surišta per lyginimo operatorius =,>,<,>=,<=,<>.

SELECT * FROM Emp WHERE Sal>=1500;

SELECT Ename,Sal,Comm FROM Emp WHERE Sal<=Comm;
sąlygoje dalyvauja du stulpeliai, bet nenurodyta konkreti reikšmė.

*Simbolinės eilutės arba data sąlygoje turi būti pateikta tarp viengubų kabučių.

Paragrafe WHERE gali būti formuojama sąlyga, naudojant sąlygos
pateikimo būdus:

BETWEEN ... AND - kurie nurodo žemiausios ir aukščiausios reikšmių intervalą,
išrenkant duomenis iš lentelės, t.y. rezultate pateikia duomenis tam tikram
reikšmių intervalui.

SELECT Ename,Sal FROM EMP WHERE Sal BETWEEN 1000 AND 1500;
Pateikia darbuotojus, kurių alga yra intervale tarp 1000 ir 1500.

BETWEEN ..AND operatorius apima ir kraštutines reikšmes. Mažesnioji reikšmė
turi būti nurodyta pirma, didesnioji - antra.

IN (sąrašas reikšmių, kurios turi būti pateiktos užklausos rezultate,
pateikiamos per kablelį)

SELECT Empno,Ename,Sal,Mgr FROM EMP WHERE Mgr IN(7902,7566);
pateiks sąraše tik du darbuotojus.

Šią sąlygą galima būtų pateikti ir kitaip.

SELECT * FROM EMP WHERE Deptno IN(10,20);

Išves darbuotojus, kurie dirba 10 ir 20 departamentuose.


LIKE ( šablonas duomenų išrinkimui iš lentelės )

LIKE galima naudoti šabloną pagal kurį atrenkami duomenys iš lentelės.
Sąlygoje gali būti pateikiami tik simboliniai ar skaitmeniniai duomenys. Mažiausiai
turi būti du simboliai formuojant šabloną.

% - reiškia nulį arba keletą simbolių
_ reiškia vieną simbolį

SELECT Ename FROM EMP WHERE Ename LIKE ‘S%’;

parodo visus darbuotojų vardus, kurių pavardė prasideda “S” raide, bet
neparodys, kurių vardai prasidės “s” raide(mažąja). LIKE operatorius gali būti
kaip trumpinys.

SELECT Ename,Hiredate FROM EMP WHERE Hiredate LIKE ‘% 81‘;
- Visi kurie pradėjo dirbti 81 metais.

SELECT Ename FROM EMP WHERE Ename LIKE ‘_A%’;
Parodys visus darbuotojus, kurių varde bus antra raidė “A”


IS NULL - (nurodo, jog vartotoją domina tik eilutės lentelėje su neapibrėžta lauko reikšme)
NULL paragrafas gali būti naudojamas norint pateikti duomenis su NULL reikšme.

SELECT Ename,Mgr FROM EMP WHERE Mgr IS NULL;
pateiks duomenis, kur Mgr neužpildytas.

IS NULL tikrina nurodyto stulpelio reikšmę.

SELECT Ename,Job,Comm FROM EMP WHERE Comm IS NULL;
parodo visus darbuotojus, kurie negauna komisinio atlyginimo.

Sudėtinga sąlyga gali būti pateikta naudojant AND arba OR.
Tokiu būdu galima pateikti kelias sąlygas duomenų išrinkimui.

SELECT Empno,Ename,Job,Sal FROM EMP WHERE Sal>=1100 AND Job=’CLERK’;

Rezultate pasirodys visi darbuotojai, kurie užima nurodytas pareigas ir jų alga
viršija 1100.

SELECT Empno,Ename,Job,Sal FROM EMP WHERE Sal>1100 OR Job=’CLERK’;

Rezultate pasirodys visi darbuotojai, kurie užima nurodytas pareigas arba jų alga viršija 1100.

Su kiekvienu sąlygos paragrafu gali būti naudojamas ir paragrafas
NOT, kuris reiškia sąlygos neigimą.

SELECT * FROM EMP WHERE Comm IS NOT NULL;
Rezultate parodo visus darbuotojus, kurie gauna komisinį atlyginimą.

... WHERE NOT Job IN (“CLERK’,’MANAGER’)
... WHERE Sal NOT BETWEEN 1000 AND 1500



SELECT Ename,Job,Sal FROM EMP WHERE job=’SALESMAN’
OR job=’PRESIDENT’ AND sal>1500;

Dvi sąlygos nurodant pareigas su atlyginimu, kai pareigos pateikiamos taip pat per sąlygą OR (arba) t.y. kai pareigos gali turėti skirtingas reikšmes, bet abiem atvejais atlyginimui keliami tie patys reikalavimai.

SELECT Ename,Job,Sal FROM EMP WHERE (job=’SALESMAN’
OR job=’PRESIDENT’) AND sal>1500;

Irgi dvi sąlygos, bet tikrinama pirma pareigybes ir jei yra viena iš nurodytų,
toliau tikrinamas atlyginimas.

Rūšiavimas ORDER BY

Normaliai išvedant duomenis iš lentelės į ekraną, duomenų tvarka yra tokia, kaip jie buvo suvesti į lentelę. Norint pakeisti duomenų atvaizdavimo tvarką operatoriuje SELECT galima naudoti paragrafą ORDER BY, kuriame nustatome, kaip turi būti pateikti duomenys užklausos rezultate. Standartiniu būdu, naudojant ORDER BY, duomenų vaizdavimas vyksta pagal alfabetą nuo A iki Z arba skaičių
didėjimo tvarka. 
Norint pakeisti duomenų atvaizdavimo tvarką atvirkščiai, prie paragrafo ORDER BY naudojame papildomą žodį DESC. Jei naudojame paragrafą ORDER BY, jis turi būti nurodomas operatoriaus SELECT gale.

SELECT * FROM EMP ORDER BY Hiredate; 
rūšiuoja pagal priėmimo į darbą datą

SELECT * FROM EMP ORDER BY Hiredate DESC;
rūšiuoja taip pat pagal datą, bet atvirkštine tvarka, T.y. vėliausia priimti į darbą pasirodys užklausos
rezultate.


LOWER(stulpelis|reikšmė) 

 Bet kokiam formate parašytus simbolius rezultate pateikia mažosiomis raidėmis. Labai naudinga nurodant sąlygą užklausoje kai reikia suvienodinti informacijos formatą duomenų atrinkimo metu. Be to ji naudinga aplikacijose pateikiant informaciją vienodam pavidale, jei ji yra suvesta skirtingam formate.

SELECT LOWER(VARDAS) FROM DARBUOTOJAS

UPPER(stulpelisėlė|reikšmė)

Bet kokiam formate parašytus simbolius rezultate pateikia didžiosiomis raidėmis. Labai naudinga nurodant sąlygą užklausoje kai reikia suvienodinti informacijos formatą duomenų atrinkimo metu. Be to ji naudinga aplikacijose pateikiant informaciją vienodam pavidale, jei ji yra suvesta skirtingam formate.

SELECT UPPER(VARDAS) FROM DARBUOTOJAS

Funkcijos Visai Grupei (Grupinės)

Šios funkcijos veikia per visą lentelę arba per lentelės sritį ir tik tada pateikia bendrą rezultatą kiekvienai grupei atskirai arba visai lentelei. Pagal nutylėjimą visos lentelės eilutės skaitomos kaip viena grupė, jei nenurodyta kitaip. Paragrafas GROUP BY komandoje SELECT gali būti naudojamas sudalinti lentelę į grupes. Grupinėse funkcijose NULL reikšmė ignoruojama. Grupinėms funkcijoms galima priskirti
funkcijas:

AVG() - nustato vidurkį grupei
COUNT() - nustato eilučių, kurių išraiška yra apibrėžta, kiekį lentelėje
MAX() -nustato didžiausią reikšmę
MIN() - nustato mažiausią reikšmę
SUM() - nustato bendrą sumą, ignoruojant neapibrėžtas reikšmes

Bet kuriuo atveju funkcijos taikomos visai grupei, bet jei nurodyta DISTINCT (MIN(DISTINCT SAL)), tai funkcija taikoma tik skirtingoms reikšmėms, t.y. pasikartojančios reikšmės yra ignoruojamos. Visais atvejais, jei yra NULL reikšmė, tai įrašas ignoruojamas, išskyrus funkciją COUNT, kai naudojama ‘*’.

  • SELECT MAX(SAL),MIN(SAL),AVG(SAL) FROM Emp;
  • SELECT COUNT(*) from EMP where DEPTNO=20;
Norint sugrupuoti įrašus lentelėje, naudojam paragrafą GROUP BY

SELECT AVG(SAL) FROM Emp;
SELECT AVG(SAL) FROM Emp GROUP BY JOB;



Kiekvienai pareigybei išvedamas darbo užmokesčio vidurkis, tačiau toks atvaizdavimo būdas nėra akivaizdus, todėl rekomenduojama šalia spausdinti ir pareigybę:

SELECT JOB,AVG(SAL) FROM Emp GROUP BY JOB;
SELECT JOB, AVG(SAL) FROM Emp WHERE JOB=‘MANAGER’ GROUP BY JOB ;

Duomenys lentelėje sugrupuojami pagal darbą, ir dar po to galima išrinkti konkrečiai nurodytą darbą ir suskaičiuoti atlyginimo vidurkį.

Viduje vienos grupės galima dar grupuoti smulkiau. Tarkime skirtinguose departamentuose, norime
grupuoti informaciją pagal pareigybes :

SELECT JOB, AVG(SAL) FROM Emp WHERE JOB=‘MANAGER’ GROUP BY DEPTN,JOB ;
SELECT Deptno,Job,Sum(sal) FROM EMP GROUP BY Deptno,Job;

Pateikiant rezultatą pirmiausia duomenys grupuojami pagal departamento numerį, o po to
jo viduje dar grupuojama pagal darbo pobūdį. Taip sutvarkius, sumuojamas bendras
atlyginimas suformuotose grupėse.

Grupinėse funkcijose yra svarbu išvedant duomenis, užklausą formuoti taip, kad nebūtų individualių laukų, kurie nėra įtraukti į paragrafą GROUP BY

SELECT DEPTN,MIN(SAL) FROM EMP; - klaidinga užklausa, nes funkcija MIN yra grupinė, o laukas DEPTNO yra kiekvienam įraše ir tai nesuderinama.

Teisingai atrodytų: 
SELECT DEPTN,MIN(SAL) FROM EMP GROUP BY DEPTNO;

Dabar DEPTNO jau yra grupės pavadinimas ir nebėra individualus laukas.

Gali būti grupuojami duomenys, pateikiant juos kaip grupę grupėje. Naudojant grupines funkcijas yra galimybė išjungti arba įjungti iš rezultato atskiras duomenų grupes. Tam galime naudoti paragrafą HAVING, kuris panaudojamas po GROUP BY.
Turi tokią pačią prasmę kaip ir operatorius WHERE, tačiau kuris yra negalimas grupinėse funkcijose.

Bendru atveju sintaksė būtų tokia

SELECT stulpelis, grupinė_funkcija
FROM lentelė
[WHERE Sąlyga]
[GROUP BY sąrašas_grupavimui]
[HAVING grupės sąlyga]
[ORDER BY rūšiavimo sąlyga]
SELECT Job,Sum(Sal) Benbra_Suma FROM EMP
WHERE Job NOT LIKE ‘SALES%’
GROUP BY Job
HAVING Sum(Sal)>5000
ORDER BY Sum(Sal)

Rūšiuoja pagal gautą sumą grupėse. Bendra_Suma formuoja naują stulpelio antraštę
Skaičiuoja visiems darbuotojams, išskyrus “SALES

Norint parodyti vidutinį atlyginimą darbuotojams, pagal sąlygą, jog mus domina tik departamentai, kuriuose dirba daugiau nei trys žmonės, formuosime užklausą:

SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING COUNT(*)>3;

Norint parodyti tik darbus, kurių didžiausias atlyginimas yra >=$3000, formuosim užklausą:

SELECT JOB,MAX(SAL) FROM EMP HAVING GROUP BY JOB MAX(SAL)>=3000;

Nesant grupavimo, geriau atrankos sąlygai užduoti naudoti paragrafą WHERE.
Žemiau pateikiamas pavyzdys yra neteisingas, nes grupinei funkcija naudojama poroje su
paragrafu WHERE

SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO WHERE AVG(SAL)>2000;

Teisingai būtų taip:
SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL)>2000;

SELECT Max(Avg(Sal)) FROM EMP GROUP BY Deptno;

Pirma suskaičiuoja atlyginimo vidurkį departamente, o po to išrenka didžiausią
vidurkį tarp departamentų.

Java kalbos sintaksė

Primityvūs duomenų tipai

1. byte - skirtas saugoti sveikus skaičius nuo -128 iki 127. Naudojamas didelės apimties duomenims, kai svarbu efektyviai naudoti atmintį.
2. short - panašiai kaip ir byte - nedaug vietos užimantis sveikiems skaičiams saugoti skirtas duomenų tipas reikšmėms nuo -32768 iki 32767.
3. int - naudojamas sveikiems skaičiams nuo -2^32 iki +2^32 - 1 saugoti.
4. long - naudojamas sveikiems skaičiams nuo -2^63 iki 2^63-1 saugoti.
5. float - 32 bitų laukas naudojamas slankaus kablelio skaičiams saugoti. Netinka tikslioms reikšmėms
saugoti, bet efektyviai naudojamas, kai svarbu tausoti atmintį.
6. double - 64 bitų laukas naudojamas slankaus kablelio skaičiams saugoti. Netinka tikslioms
reikšmėms saugoti, bet efektyviai naudojamas, kai svarbu tausoti atmintį.
7. boolean - naudojamas taip/ne reikšmėms saugoti.
8. char - vienas teksto simbolis (t.y. viena raidė, taškas, tarpas ir pan.).

String duomenų tipas


  • Naudojamas simbolių eilutei saugoti.
  • Sudarytas iš primityvių char simbolių.
  • String objektas nėra primityvus duomenų tipas.
  • Specialus char simboliai: \t (tab), \n (line feed), \" (double quote), \' (single quote), ir \\ (backslash).
  • null reikšmė.


Masyvai
• Masyvai skirti saugoti kelioms vienodo tipo reikšmėms.
• Masyvo dydis nurodomas jį kuriant: 

int[] integerArray = new int[10];

• Masyvo elementai pasiekiami nurodant elemento indeksą, kuris prasideda nuo 0:

 integerArray[0] = 1;

• Masyvus galima sukurti naudojantis supaprastinta sintakse: 

int[] integerArray = {1, 2, 3, 4, 5};


Reiškiniai

Reiškiniai yra sudaryti iš kintamųjų, operatorių ir
paprogramių iškvietimų. Pavyzdžiai paryškinti:

int cadence = 0;
anArray[0] = 100;
System.out.println("Element 1 at index 0: " + anArray[0]);

int result = 1 + 2; // result is now 3
if (value1 == value2)
System.out.println("value1 == value2");

Reiškiniai visada grąžina reikšmę, kurios tipas priklauso
nuo panaudotų kintamųjų ir operatorių.

Sakiniai

Sakiniai Java kalboje daugmaž atitinka įprastos kalbos
sakinius, kuriais kalbame.
Sakiniai praktiškai visada baigiami ; ženklu
Kai kurie reiškiniai gali būti sakiniais.
Sakinių pavyzdžiai:

// Priskyrimo sakinys
aValue = 8933.234;
// Reikšmės padidinimo sakinys
aValue++;
// paprogramės iškvietimo sakinys
System.out.println("Hello World!");
// objekto sukūrimo sakinys
Bicycle myBike = new Bicycle();


Sudėtingi sakiniai

Reikalingi kodo vykdymo sąlygoms, išsišakojimams ir pasikartojimams valdyti.
Java kalboje naudojami :
  • if-then / if-then-else
  • switch
  • for
  • while
  • do-while
  • break
  • continue
  • return
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/flow.html

break, continue, return

Break - išeina iš paskutinio ciklo arba switch sakinio.
“labeled break” - išeina iš pažymėto ciklo ar switch sakinio.
Continue - nutraukia ciklo bloko vykdymą ir pereina prie kitos
ciklo iteracijos.
Return - nutraukia paprogramės vykdymą ir gali grąžinti
rezultatą.

return

• Grąžina kodo vykdymą į tą vietą, kurioje buvo iškviesta
paprogramė.
• Gali negrąžinti jokios reikšmės arba grąžina po return
sekančio reiškinio reikšmę.


Pagrindiniai metodo elementai

  1. Metodo tipas - public, private, protected.
  2. Grąžinamos reikšmės tipas arba raktinis žodis void jei metodas negrąžina jokios reikšmės.Privalomas.
  3. Paprogramės pavadinimas. Privalomas
  4. Parametrų sąrašas skliausteliuose () - parametrai atskiriami kableliu, kiekvienam parametrui nurodomas tipas ir pavadinimas. Jei nėra parametrų - naudojami tušti skliausteliai.
  5. Galimų klaidų (exception) sąrašas.
  6. Paprogramės kodas tarp {} skliaustelių. Privaloma dalis, nors gali būti tuščia.

Paprogramės (methods)

  • Metodo pavadinimus rekomenduojama sieti su pavadinimu veiksmo, kurį
  • atliksime. Pavyzdžiui “nuskaityti”, “bėgti”, “pažaliuoti”.
  • Metodai atpažįstami pagal savo “parašą” (signature and overloading), kurį
  • sudaro pavadinimas ir parametrai.

Papildomi skaitiniai

2017 m. spalio 18 d., trečiadienis

Java Įvadas

IDE

• Integrated Development Environment
• Palengvina kūrimo procesą
• Valdo sąranka
• Palengvina darbą su kodu
• Palengvina darbą su dideliais projektais
• Integruoja daug įrankių į vieną paketą (kompiliatorių, surinkėją, derintoją, versijų valdymo sistemą, kodo kokybės inspektavimo įrankius, ...)


Eclipse

• Integruota kūrimo aplinka (angl. Integrated Development
Environment)
• Palengvina programų rašymą, testavimą, derinimą,
surinkimą

Naudingos eclipse kombinacijos

• Ctrl+Shift+T - ieškoti tipo (klasės, baigtiniai tipai, ...)
• Ctrl+Shift+R - ieškoti resurso (kitų tipų failų)
• Ctrl+Shift+F - suformatuoti kodą pagal apibrėžtą standartą
• Ctrl+Z - atšaukti paskutinį veiksmą
• Ctrl+Space - rodo galimus tekstinės išraiškos pabaigos variantus (“autocomplete”)
• Pažymėjus simbolį (tekstinį elementą)
• F3 - nukelia į apibrėžimą ar deklaraciją
• F4 - parodo tipų hierarchiją (jei pažymėtas tipas ar jo elementas)
• Ctrl+Alt+H - parodo metodus, kurie naudoja elementą


Greitas įvadas į klases ir objektus

• Klasė apibrėžia koks bus sukurtas objekto egzempliorius
• Ką jis žino (laukai)
• Ką jis moka (metodai)


Kas yra Java?

• Platforma
• Programavimo kalba
• Standartinė biblioteka
• Virtuali mašina
• Kūrimo įrankiai

Standartinė biblioteka

• Turtinga biblioteka įgyvendinantį dažniausiai naudojamą
funkcionalumą:
• Duomenų struktūros (sąrašai, medžiai, ...)
• Darbas su failais
• Darbas su tinklu
• Darbas su formatais (Properties, XML, ZIP, JPG, ...)
• Daugiagijo modelio palaikymas
• Vartotojo sąsajos kūrimas

Virtuali mašina

• Vykdo Java kodą
• Optimizuoja esamai sistemai
• Abstrakcija užtikrinanti Java programų nepriklausomumą
nuo platformos

Skirtingi Java paketai

• JRE  - norintiems paleisti programas
• JDK - norintiems kurti programas


Primityvieji tipai

byte x = -10; // Skaičius su ženklu (-128..127); 8 bitai
short x = 1000; // Skaičius su ženklu (-32768 ... 32767); 16bit
int x = 102224; // Skaičius su ženklu; 32bit
long x = 2344445; // Didelis skaičius su ženklu; 64bit
float x = 32.44f; // Skaičius su slankiuoju kableliu; 32bit
double x = -31.443; // Skaičius su slankiuoju kableliu; 64bit
boolean x = true; // Dvinaris true arba false
char x = ‘A’; // Simbolis; 16bit

Klasė: narių matomumas

  • private - matomas tik pačios klasės viduje (jos metoduose)
  • protected - leidžia matyti paveldinčioms klasėms, bei klasėms tame pačiame pakete
  • package (kai nieko nenurodyta) - leidžia matyti klasėms tame pačiame pakete
  • public - mato, gali kviesti ir naudoti visi

Interfeisas

• Visiškai abstrakti klasė
• Kitos klasės gali įgyvendinti kiek tik nori
• Naudojama aprašyti kontraktams
• Aš galiu dirbti su tuo kas moka X
• Jei įgyvendinu X, tai galiu būti naudojamas ten kur moka dirbti su X

Kolekcijos: Set

• Unikalių elementų rinkinys
• Elementų vietos atsiminti negerantuoja
• Unikalumo užtikrinimas veiks, tik jei yra teisingos hashCode() ir equals() realizacijos


Kolecijos: SortedSet

• Išrūšiuotų unikalių elementų rinkinys
• Naudojant TreeSet
• privalu arba turėti elementus, kurie įgyvendina Comparable<T> interfeisą
• Arba perduoti Comparator<T> objektą, kuris mokės tuos elementus palyginti

Įvadas į DBVS ir SQL kalbą

Duomenų bazės, DBVS

Duomenų bazė (DB) - tarpusavyje susijusių duomenų rinkinys, kuriems apdoroti pasitelkiamas kompiuteris. Tokia DB yra panaši į elektroninę kartoteką.

Panašios DB vartotojai atlieka operacijas:
  • naujo įrašo (naujos kortelės) įtraukimas;
  • esamo įrašo (kortelės duomenų) keitimas;
  • esamo įrašo (kortelės) šalinimas;
  • duomenų paieška duomenų bazėje (kartotekoje).
Kompiuterinė sistema, kurioje atliekama panašios operacijos, vadinama duomenų bazės sistema (DBS).
PĮ, suteikianti DB vartotojui galimybę dirbti su DB neatsižvelgiant į technines detales, vadinama duomenų bazių valdymo sistema (DBVS).


DBVS leidžia vartotojui žiūrėti į DB kaip į žymiai aukštesnio lygio objektą, negu į įrašų bylą – tai pagrindinė paskirtis.
DBVS atlieka vartotojo sąsajos (interfeiso) su DB vaidmenį.
Vartotojai operuoja DB naudojant formalią kalbą, pvz. SQL.


 Reliacinės (sąryšinės) ir kitokios DB

DBVS suteikia vartotojui galimybę vartoti logines sąvokas. Sąvokų rinkinys ir jų vartojimo taisyklės - modelis. Dauguma DBVS naudoja reliacinį duomenų modelį – 1970 m. E.F. Kodas (E.F. Codd), IBM. DB, kurios apibrėžiamos naudojant reliacinį modelį, vadinamos reliacinėmis duomenų bazėmis (RDB). Atitinkamos jų valdymo sistemos - reliacinėmis duomenų bazių valdymo sistemomis (RDBVS).

Pagrindinės reliacinio modelio sąvokos:
  • lentelė(table)
  • eilutė (row)
  • stulpelis (column) 
Reliacinė sistema remiasi šiais pagrindiniais principais: 
  1. duomenys vartotojui pateikiami lentelėmis ir niekaip kitaip; 
  2. vartotojui pateikiami operatoriai, leidžiantys iš esamų lentelių gauti naujas.
RDB - tai DB, kurią vartotojai priima kaip lentelių rinkinį.
  • Lentelės eilutė aprašo vieną objektą.
  • Stulpelis - objekto charakteristiką.
  • Eilutės ir stulpelio sankirta – reikšmė (laukas) (value).

Šiuo metu vienos labiausiai paplitusių ir išvystytų RDBVS:
  • IBM DBVS DB2
  • Oracle DBVS ORACLE
  • Microsoft DBVS SQL Server
  • Sybase Inc. DBVS – SYBASE
  • PostgreSQL – atvirojo kodo
  • MySQL – atvirojo kodo
SQL
Vartotojo sąsajai su DB (užklausoms formuluoti) yra naudojama formalizuota kalba. 
Reliacinėse sistemose - SQL (Structured Query Language) SQL sukurta IBM 1970-jų m. pr. 1-oji realizacija - RDBVS IBM System R. 1986 – SQL-86 (1-as ANSI/ISO standartas) 1992 – SQL-92 (SQL2) 1999 – SQL:1999 (SQL3) 2008 – SQL:2008

SQL yra neprocedūrinė (deklaratyvi) programavimo kalba. Kalboje išskiriama trys sakinių grupės:
  • duomenų apibrėžimo sakiniai (kalba) (DDL, Data Definition Language),
  • manipuliavimo duomenimis sakiniai (DML, Data Manipulation Language),
  • duomenų valdymo sakiniai (DCL, Data Control Language). SQL = DDL + DML + DCL

DDL sakiniais kuriamos DB ir lentelės. Kuriant DB yra nurodoma jos vardas (pavadinimas), fizinė vieta ir kt. Kuriant lentelę - lentelės vardas, stulpelių vardai ir jų tipai.
SQL duomenų rūšys: tekstiniai duomenys, skaičiai, dvejetainiai duomenys, datos ir laikai. 
Kiekviena rūšis su fizinėmis realizacijos savybėmis yra duomenų tipas.
Kiekviename duomenų tipe yra spec. reikšmė NULL, žyminti, kad duomenys yra nežinomi, dar neįvesti, jau pašalinti...
DML sakiniais formuojamos užklausos (query) duomenims surasti, šalinti ir įterpti.
DCL sakiniais koordinuojamas vartotojų darbas su DB.

Duomenų išrinkimas
SELECT sakinys naudojamas įrašams iš vienos ar daugiau lentelų atrinkti. FROM sakinyje nurodomos lentelės, iš kurių reikia išrinkti eilutes (sąryšiai gali būti nurodomi skirtingais JOIN variantais). WHERE sakinyje nurodoma sąlyga, kurią turi tenkinti grąžinamos eilutės. GROUP BY sąlygoje nurodoma, kad reikia grupuoti tam tikras eilutes. Grupuojant eilutes, dažniausiai naudojamos agregatinės funkcijos maksimalioms, vidutinėms ir panašioms reikšmėms išrinkti iš grupuotų eilučių. ORDER BY sakiniu nurodoma viena ar daugiau rikiavimo sąlygų. HAVING sakinyje nurodomas kriterijus, taikomas grupuojamoms eilutėms; šis raktinis žodis gali būti naudojamas tik tais atvejais, jeigu užklausoje yra GROUP BY sakinys.

Duomenų valdymas
INSERT vartojamas naujų įrašų įterpimui į lentelę. 
DELETE leidžia ištrinti įrašus iš lentelės. 
UPDATE naudojamas pakeisti vieno ar daugiau įrašų reikšmes.

SQL Select sakinys
Duomenų atrinkimui iš duomenų bazės naudojamas SELECT sakinys. 
Rezultatai grąžinami lentelės pavidalu, kuri vadinama “Result-Set”.
SELECT sakinio sintaksė:
SELECT laukai FROM lentelės_pavadinimas; 
SELECT * FROM lentelės_pavadinimas;

Duomenų išrinkimas panaudojant DISTINCT.
DISTINCT - skirtingų reikšmių pasirinkimas Jei žinote, kad jūsų sakinys pasirinks perteklinius duomenis, ir norite matyti tik skirtingas reikšmes, savo sąlygoje SELECT galite naudoti raktinį žodį DISTINCT. 
Pavyzdžiui, tarkime, kad kiekvienas iš jūsų klientų atstovauja keliems skirtingiems interesams, ir kai kurie iš jų naudoja tą patį telefono numerį. Norėdami užtikrinti, kad kiekvieną telefono numerį matytumėte tik kartą, jūsų sąlyga SELECT atrodys taip:
SELECT DISTINCT telefonoNumeris FROM klientai

Duomenų išrinkimas panaudojant WHERE.
Duomenų išrinkimui pagal užduotą sąlygą formuojama užklausa, naudojant paragrafą WHERE. Sąlygoje gali būti nurodyti stulpelių vardai, kuriems yra taikoma sąlyga ir ši sąlyga yra tikrinama kiekvienai lentelės eilutei, formuojant užklausos rezultatą.
WHERE - stulpelio vardas; sąlyga; kito stulpelio vardas arba konstanta ar reikšmių sąrašas taip formuojama sąlyga duomenų atrinkimui.
SELECT Ename,Job,Deptno FROM EMP WHERE Job=’CLERK’;

Pateiks rezultate tik darbuotojus su nurodyta specialybe. Sąlygoje svarbu pateikti lyginimui skirtus duomenis reikiamam formate (dešinėj pusėj raidžių dydis, datos formatas ir kt.)

DML-DARBAS SU DUOMENIMIS.
Duomenų manipuliavimo komandos leidžia įterpti duomenis į duomenų bazę arba pašalinti juos iš ten. Be to galima duomenis pataisyti ir ten pat juos palikti. Yra trys pagrindinės operacijos su duomenimis, kuriuos gali atlikti vartotojas, jei tam jam suteikti įgaliojimai.
  • INSERT
  • UPDATE
  • DELETE

UPDATE leidžia pakeisti duomenis lentelėje.
UPDATE Lentelės vardas SET Stulpelis1=reikšmė1[,Stulpelis2=reikšmė2 ...] [WHERE sąlyga];

Galima iš karto atnaujinti kelias eilutes pagal nurodytą sąlygą. Stulpelis1, Stulpelis2... Stulpelių vardai, kurių reikšmes reikia pakeisti naujomis Reikšmė1, Reikšmė2 atitinkamos naujos stulpelių reikšmės. WHERE užduoda sąlygą, kuriai esant patenkintai tos eilutės yra atnaujinamos. 
Sąlyga yra nebūtina, bet jei ji nenurodyta, pakeitimas atliekamas visoms eilutėms lentelėje.

UPDATE Emp SET DEPTNO=20 WHERE EMPNO=7782

Bus pakeista stulpelio DEPTNO reikšmė eilutei, kur EMPNO=7782, t.y. darbuotojas pervedamas į kitą departamentą.

UPDATE Emp SET DEPTNO=20; 

Visoms eilutėms lentelėje Emp pakeičiamas departamento numeris. Visi darbuotojai taps to paties departamento pareigūnais.

INSERT leidžia įterpti vieną eilutę į lentelę.
INSERT INTO Lentelės_vardas[(stulpelis1[,stulpelis2, ...])] VALUES(reikšmė1[, reikšmė2, ...]);

Komanda įterps reikšmę1 į stulpelį1, reikšmę2 į stulpelį2 ir t.t. Stulpelių sąrašas yra nebūtinas, bet jei sąrašas nenurodytas, tai komanda nebus užbaigta tol, kol nebus įvesta tiek duomenų, kiek numatyta lentelės struktūroje. Simboliniai duomenys ir datos tipo duomenys visada nurodomi tarp viengubų kabučių.

INSERT INTO Dept(Deptno,Dname,Loc) VALUES(50,’DEVELOPMENT’,’DETROIT’); 

Galima įvedimo metu taip pat suformuoti ir tuščias laukų reikšmes, Dėl to reikia norimą palikti neužpildytą stulpelį neįtraukti į sąrašą.

INSERT INTO Dept(Deptno,Dname) VALUES(60,’MIS’); 

Tą patį galima padaryti ir kitaip

INSERT INTO Dept VALUES(70,’FINANCE’,NUL);


DELETE galima pašalinti įrašus iš lentelės.

DELETE FROM Lentelės_vardas [WHERE sąlyga]; Iš lentelės nurodytu vardu bus pašalintas įrašas, kuris patenkina sąlygą.

DELETE FROM Dept WHERE Dname=’DEVELOPMENT’; 

Jei sąlyga nenurodyta, panaikinamos visos eilutės.

DELETE FROM Dept;

Kaip paprastai įrašų panaikinimui galima pasinaudoti užklausa pateikiančia duomenis iš kitos lentelės

DELETE FROM EMPLOE WHERE Deptno=(SELECT Deptno FROM Dept WHERE Dname=’SALES’);

Iš lentelės EMPLYE pašalins visus darbuotojus, kurių pareigos nurodytos sąlygoje.
Pašalinti visus įrašus galima taip pat ir su komanda

  • TRUNCATE TABLE lentelės_vardas; Ši komanda įrašus šalina fiziškai ir atstatyti jų neįmanoma.
  • DROP pašalina viską: duomenis kartu su struktūra.
  • DROP TABLE lentelės_vardas;

Etiketės