2017 m. lapkričio 12 d., sekmadienis

Maven projekto valdymo įrankis

Maven instaliavimas

Debian šeimos Linux operacinėje sistemoje Maven galima instaliuoti aptprogramų valdymo įrankio pagalba:

$ sudo apt-get install maven

Maven konfigūracija

Windows
Nustatymai: %MAVEN_HOME%\conf\settings.xml
Lokalios repositorijos vieta: UserProfile\.m2\

Linux
Nustatymai: /usr/local/maven/conf/settings.xml
Lokalios repositorijos vieta: ~/.m2/

Nurodyti kitus Maven nustatymus:
mvn --settings=[PATH_TO_SETTINGS_FILE]
Nurodyti kitą lokalios repozitorijos vietą:
mvn -Dmaven.repo.local=/path/to/local/repo

Prieš Maven

• javac komandos naudojimas projektų kompiliavimui.
• Nuo IDE (Integrated development Environment) priklausomas projektų kompiliavimas.
• GNU Make įrankis.
• Ant (Another Neat Tool) įrankis.

Maven raida

• Maven 1 (2003)
• Maven 2 (2005) - nesuderinamas su Maven 1.
• Maven 3 (2010) - suderinamas su Maven 2, stabilesnis, turintis daugiau funkcionalumo.

Kas yra Maven

• Darinio (angl. build) sukūrimo įrankis.
• Standartizuota darinio sukūrimo infrastruktūra.
• Priklausomybių (angl. dependency) valdymo įrankis.
• Kokybės įrankis.
• Atviro kodo Apache projektas.

Maven filosofija

• Susitarimas per konfigūracija (mažiau konfigūracijos).
• Lengvas darinio sukūrimo procesas.
• Geriausių praktikų šablonai.
• Nuoseklus darinio sukūrimas.


Maven temos

• Katalogų struktūra
• Darinio gyvavimo ciklas (angl. lifecycle)
• Projekto aprašas (angl. descriptor)
• Priklausomybės (angl. dependencies)
• Papildiniai (angl. plugins)
• Savybės (angl. properties)
• Profiliai (angl. profile)
• Archetipas

Standartinė Maven projekto struktūra

src Visas projekto išeities kodas
src/main Projekto pagrindinio artefakto išeities kodas
src/main/java Projekto java išeities kodas
src/main/resources Nekompiliuojami projekto resursai
src/main/webapp Projekto žiniatinklio aplikacijos resursai
src/test Projekto testavimui skirtas išeities kodas
src/test/java Projekto testavimo java išeities kodas
src/test/resources Projekto nekompiliuojami testavimo resursai
target Maven darbinis katalogas
pom.xml Projekto aprašo byla

Darinio gyvavimo ciklai

• Maven paremtas darinio gyvavimo ciklais, skirtais artefaktų sukūrimui (pvz. jar byla, war byla) ir paskirstymui .
• Yra trys įtaisyti (angl. build-in) darinių gyvavimo ciklai:
• Default - atsakingas už projekto darinio pagaminimą ir įdiegimą,
• Clean - atsakingas už projekto išvalymą,
• Site - atsakingas už projekto svetainės sugeneravimą.
• Kiekvienas iš išvardintų ciklų yra sudarytas iš skirtingo rinkinio fazių.
• Fazė reprezentuoja konkretų gyvavimo ciklo etapą.

Pagrindinės “Default” fazės

• validate - patikrina ar projektas korektiškas ir visa reikiama informacija yra pasiekiama.
• generate-sources - generuoja išeities kodą įtraukimui į kompiliavimą.
• generate-resources - generuoja resursus įtraukimui į paketą.
• compile - kompiliuoja projekto išeities kodą.
• test - testuoja sukompiliuotą kodą naudojant nurodytą testavimo karkasą.
• package - supakuoja sukompiliuotą kodą į nurodytą paskirstymo formatą (pvz. jar).
• integration-test - pagal poreikį, įdiegia paketus į aplinką, kurioje vykdomi integraciniai testai.
• verify - vykdo patikrinimus ar paketai atitinka kokybės kriterijus.
• install - įdiegia paketus į lokalią repozitoriją, tam, kad kiti lokalus projektai galėtų naudoti priklausomybės ryšiui.
• deploy - galutinės paketų kopijos įdiegiamos į nutolusią repozitoriją, tam, kad pasidalinti su kitais PĮ kurėjais ir projektais.

“Clean” fazės

• pre-clean - vykdo procesus, reikalingus prieš realų projekto valymą.
• clean - pašalina visas bylas, kurios buvo sugeneruotos ankstesnio darinio sukūrimo metu.
• post-clean - vykdo procesus, skirtus projekto valymo užbaigimui.

“Site” fazės

• pre-site - vykdo procesus, reikalingus pieš realų projekto sveitainės generavimą.
• site - generuoja projekto svetainės dokumentaciją.
• post-site - vykdo procesus, skirtus užbaigti svetainės generavimui ir pasiruošti svetainės įdiegimui.
• site-deploy - įdiegia sugeneruota sveitainės dokumentaciją į nurodytą žiniatinklio serverį.

Maven tikslų pavyzdžiai

Maven darinio sukūrimas yra vykdomas nurodant gyvavimo ciklo tikslus (angl. goals):
• mvn install - įvykdo generate*, compile, test, package, integration-test ir install fazes.
• mvn clean - įvykdo tik clean gyvavimo ciklą.
• mvn clean compile - išvalo projektą ir įvykdo generate* ir compile fazes.
• mvn compile install - įvykdo generate*, compile, test, integration-test, package ir install fazes.
• mvn test clean - įvykdo generate*, compile, test fazes ir tada išvalo projektą.

POM - projekto aprašas


  • POM (angl. Project Object Model) saugomas byloje pom.xml.
    • Saugo projekto metaduomenis:
    • Vardas ir versija,
    • Supakavimo tipas,
    • Įrankių nuorodos (CI, SCM ir pan.),
    • Priklausomybės,
    • Papildiniai,
    • Profiliai - alternativios darinio sukūrimo konfigūracijos.
  • Naudojama XML kalba.
  • Vienas POM == vienas artefaktas.
  • POM ryšiai:
    • paveldėjimas,
    • agregavimas.

POM - projekto vardas (GAV)

Maven projektas unikaliai identifikuojamas naudojant:
  • groupId - sutartas projekto grupavimo identifikatorius (be tarpų ir kablelių),
  • artifactId - sutartas projekto vardas (be tarpų ir kablelių),
  • version - projekto versija.
GAV sintaksė yra groupId:artifactId:version

<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.lds.training</groupId>
<artifactId>maven-training</artifactId>
<version>1.0</version>
</project>

POM - supakavimas

  • Darinio tipas identifikuojamas naudojant packaging elementą.
  • Nurodo Maven kaip pagaminti projekto darinį.
  • Supakavimo tipai:
    • pom, jar, war, ear, pritaikytas (angl. custom).
    • Tipas pagal nutilėjimą yra jar.

<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>maven-training</artifactId>
<groupId>org.lds.training</groupId>
<version>1.0</version>
<packaging>jar</packaging>
</project>

POM - projekto paveldėjimas

POM bylos gali paveldėti sekančią konfigūraciją: groupId, versiją, projekto konfigūraciją, priklausomybes, papildinius, profilius ir t.t.

<?xml version="1.0" encoding="UTF-8"?>
<project>
<parent>
<artifactId>maven-training-parent</artifactId>
<groupId>com.eisgroup.training</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>maven-training</artifactId>
<packaging>jar</packaging>
</project>

POM - moduliai
  • Maven turi puikų daugėlio modulių palaikymą.
  • Kiekvienas Maven projektas sukuria 1 pagrindinį artefaktą.
  • Tėvo (angl. parent) POM naudojamas modulių grupavimui.

<project>
...
<packaging>pom</packaging>
<modules>
<module>maven-training</module>
<module>maven-training-web</module>
</modules>
</project>

Maven priklausomybės

  • Maven pakeitė Java priklausomybių valdymą - nebereikia saugoti bibliotekų išeities kodo valdymo sistemoje (SCM) ar panašiai.
  • Pasiūlyta Maven repozitorijos (angl. repository) sąvoka. Sukurta Maven Central bendruomenės repozitorija.
  • Pasiūlyta tranzityvios priklausomybės (angl. transitive dependency) sąvoka.
  • Dažnai įtraukiami išeities kodo ir javadoc artefaktai.
Pridėti priklausomybę

Priklausomybės aprašą sudaro:
  • GAV (groupId, artifactId, version).
  • Galiojimo sritis (angl. scope) - compile, test, provided. Pagal nutylėjimą naudojama compile.
  • Tipas - jar, pom, war, ear, zip ir t.t. Pagal nutylėjimą naudojamas jar.

<project>
...
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

Maven repozitorija
  • Priklausomybės yra parsiunčiamos iš repozitorijų naudojant http protokolą.
  • Parsiųstos priklausomybės yra išsaugomos lokalioje repozitorijoje (pvz. ${user.home}/.m2/repository)
  • Repozitorijoje naudojama {groupId}/{artifactId}/{version}/{artifactId}-{version}.jar katalogų
  • struktūra. groupId ‘.’ yra pakeičiamas ‘/’.
  • Maven Central yra pagrindinė Maven bendruomenes repozitorija http://repo1.maven.org/maven2
Pridėti repozitoriją

  • Repozitorijos aprašomos POM.
  • Repozitorijos gali būti paveldėtos iš tėvo POM.
  • Momentinių kopijų (angl. snapshot) parsiuntimas gali būti kontroliuojamas.

<project>
...
<repositories>
<repository>
<id>lds-main</id>
<name>LDS Main Repo</name>
<url>http://code.eisgroup.com/nexus/content/groups/main-repo</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>

Tranzityvios priklausomybės
  • Tranzityvi priklausomybė yra tokia priklausomybė, kuri turi būti įtraukta, kai priklausomybę deklaruojantis projektas yra pats kito projekto priklausomybė:
    • ProjectA priklauso nuo ProjectB
    • Jei ProjectC priklauso nuo ProjectA, tai ProjectB yra automatiškai įtraukiamas.
  • Tik compile ir runtime galiojimo sritys yra tranzityvios.
  • Tranzityvios galiojimo sritys yra valdomos naudojant:
    • Pašalinimus (angl. exclusions),
    • Neprivalomą (angl. optional) deklaraciją.
Priklausomybės pašalinimas

Tranzityvi priklausomybė pašalinama naudojant exclusions elementą:

<project>
...
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.0.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>

Neprivaloma priklausomybė

Neskleidžia tranzityviai priklausomybės:
  • ProjectA turi neprivalomą priklausomybę nuo ProjectB.
  • Jei ProjectC priklauso nuo ProjectA tai ProjectB nebus automatiškai įtraukiamas.

<project>
...
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.0.5.RELEASE</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>

Priklausomybių valdymas
  • Java neleidžia naudoti kelių versijų vienu metu.
  • Ką daryti jei versijos persikerta?
    • Leisti Maven nuspręsti, kuria versiją naudoti - sunkiau nuspėjamas rezultatas.
    • Valdyti versijas rankiniu būdu.
  • Priklausomybių versijos valdomos naudojant dependencyManagement elementą.
  • Kiti panaudojimai:
    • Leisti tėvo POM valdyti versijas,
    • Suvienodinti pašalinimus.
Maven papildiniai

  • Išplečia Maven funkcionalumą.
  • Identifikacijai naudojamas GAV (groupId, artifactId, version).
  • Papildinio naudojimo būdai:
    • Prikabinti prie darinio kūrimo gyvavimo ciklo,
    • Iškviesti autonomiškai (angl. standalone).

Prikabinimas prie gyvavimo ciklo
  • Leidžia papildinį įvykdyti kaip Maven darinio kūrimo dalį.
  • Papildinio aprašymo elementai naudojami vykdymo konfigūravimui:
    • Phase
    • Goal
    • Configuration

<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0</version>
<configuration>
...
</configuration>
<executions>
<execution>
<id>execute</id>
<phase>validate</phase>
<goals><goal>enforce</goal></goals>
<configuration>
...
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

Papildinio valdymas

  • Leidžia sukonfigūruoti sekančius papildinio elementus, jo nevykdant:
    • Version
    • Configuration
    • Executions
  • Vykdymui naudojamas:
    • įprastas papildinio įrašas,
    • papildinio autonominė komanda.
<project><build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0</version>
<configuration>
...
<ignoreCache>true</ignoreCache>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
</plugin>
</plugins></build></project>


Papildinio paveldėjimas
  • Papildinys paveldi PluginManagement konfigūraciją.
  • Papildinys ir PluginManagement gali paveldėti konfigūracija iš tėvo POM.
  • Taip pat leidžiama pakeisti paveldėtą konfigūraciją.
Papildinio autonominis įvykdymas

Papildinys gali būti išviečiamas naudojant komandinę eilutę:

  • GroupId:ArtifactId:Version:Goal
  • Naudojama PluginManagement konfigūracija.
  • Konfigūracija gali būti nurodyta sisteminėmis savybėmis.

mvn org.apache.maven.plugins:maven-enforcer-plugin:1.0:enforce

Jei papildinys sukonfigūruotas POM arba settings.xml tai iškvietimas gali būti sutrumpintas:

mvn enforcer:enforce

Maven savybės

  • Savybės tai tarsi klijai, kurie suriša konfigūracija.
  • Savybes galima nurodyti sekančiose vietose:
    • <properties/> elementas POM byloje,
    • Sisteminės savybės,
    • POM struktūra.
  • Savybių reikšmę galima panaudoti įvairiausiose vietose:
    • Versijos konfigūravimui,
    • Papildinio konfigūravimui,
    • Resursų filtravimui.
  • Savybėse nurodomos tik primityvios reikšmės.
POM savybės

<project>
...
<properties>
<skipEnforcer>true</skipEnforcer>
<enforcerVersion>1.0</enforcerVersion>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>${enforcerVersion}</version>
<configuration>
<skip>${skipEnforcer}</skip>
</configuration>
</plugin>
</plugins></build></project>

Sisteminės savybės

Nurodomos komandinėje eilutėje panaudojus “-D”:
mvn clean install –Dmaven.test.skip=true

Sisteminės savybės turi viršenybę prieš POM savybės.

POM struktūros savybės

  • Savybės gali būti paveldėtos iš POM struktūros.
  • POM elementai yra savybių raktai:
    • Išraiška ${project.version} yra elementas
      <project><version/></project>.
    • Išraiška ${project.artifactId} yra elementas
      <project><artifactId/></project>.
    • Išraiška ${project.build.sourceDirectory} yra elementas
      <project><build><sourceDirectory/></build></project>.
  • Specialios savybės:
    • ${basedir} - einamojo projekto katalogas.
    • ${maven.build.timestamp} - darinio kūrimo pradžios laikas.
<project>
...
<properties>
<skipTests>true</skipTests>
<skipEnforcer>${skipTests}</skipEnforcer>
</properties>
</project>

<project>
<parent>
...
</parent>
<properties>
<skipTests>false</skipTests>
</properties>
</project>

Resursų filtravimas
  • Projekto resursai gali naudoti savybes.
  • Resursai filtruojami process-resources fazėje.
  • Filtravimas gali buti išjungtas nurodytiems resursų katalogams.

<project>
...
<properties>
<someProperty>SomeValue</someProperty>
</properties>
</project>

Maven profiliai

  • Leidžia aktyvuoti rinkinį alternatyvių konfigūracijų.
  • Gali būti naudojami nurodyti:
    • savybes,
    • priklausomybes,
    • papildinius,
    • kita.
  • Paveldi ir išplėčia bazinę konfigūraciją.
Profilio pavyzdys 1

<project>
...
<profiles>
<profile>
<id>enforcer</id>
<activation/>
<properties>
<enforcer.skip>false</enforcer.skip>
</properties>
</profile>
</profiles>
</project>

Profilio pavyzdys 2

  • mvn exec:exec - vykdo Java programa atskirame procese.
  • mvn exec:java - vykdo Java programa toje pačioje VM, kaip ir Maven.
  • mvn exec:java -Dexec.mainClass="com.example.Main" [-Dexec.args="argument1"] ...

<profiles>
<profile>
<id>run</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<goals><goal>java</goal></goals>
<phase>runtime</phase>
</execution></executions>
<configuration>
<mainClass>ClassWithTheMain</mainClass>
</configuration>
</plugin></plugins></build></profile></profiles>


Profilio aktyvavimas

Profilis gali būti aktyvuotas:
  • pagal nutylėjimą,
  • tiesiogiai pagal profilio vardą,
  • priklausomai nuo savybės,
  • priklausomai nuo operacinės sistemos,
  • priklausomai nuo bylos egzistavimo.
Aktyvavimas komandinėje eilutėje

mvn clean install –P enforcer

Keletas profilio identifikatorių yra atskiriami kableliu.

Archetipas

  • Archetipas yra Maven projektų šablonų priemonių komplektas.
  • Bendresnis archetipo apibrėžimas būtų autentiškas šablonas ar modelis, kurį naudojant yra gaminami kiti tos pačios rūšies dalykai.
Maven projekto sukūrimas

Paprasto projekto sukūrimas:
mvn archetype:generate -DgroupId= com.mycompany.app -DartifactId= my-app -
DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Eclipse IDE projekto failų sukūrimas:
mvn eclipse:eclipse

Idea IDE projekto failų sukūrimas:
mvn idea:idea

2017 m. lapkričio 8 d., trečiadienis

XML ir xHTML

  • Panašus į HTML
  • Turi žymes - tačiau žymes galime susikurti patys
  • XML failo atvaizdavimui naudojamos XSLT transformacijos
  • HTML taip pat gali būti XML failas
  • Dažniausiai HTML, kuris yra XML failas, vadinamas XHTML ir naudojamas XHTML standartas


Galimi įvairūs variantai:

<?xml version="1.0" encoding="UTF-8"?>
<saknis/>

<?xml version="1.0" encoding="UTF-8"?>
<saknis></saknis>

<saknis/>

Validavimas kelių lygių:
  • geras suformavimas (well formedness)
  • validacija pagal schemą
  • XML taisyklės (žodynas), o ir validavimas - kelių tipų:
    • pagal DTD (Doctype)
    •  HTML yra XML, gali būti suvaliduotas pagal DTD
    • pagal XSD (XML Scema)
XML vardų zonos

Jeigu norėtume sudaryti dokumentą pagal keletą taisyklių
rinkinių (ir vėliau jį validuoti, patikrinti) - pagal HTML ir
mūsų žymes:

<?xml version="1.0" encoding="UTF-8"?>
<html>
<manoHtml></manoHtml>
</html>

XML vardų zonos

O jeigu formuotumėme dokumentą taip, kad turinys būtų
body žymėje?

<?xml version="1.0" encoding="UTF-8"?>
<html><body>
html turinys
<manoHtml>
<body>
mano turinys
</body>
</manoHtml>
</body></html>


O jeigu formuotumėme dokumentą taip, kad turinys būtų
body žymėje? Kaip nurodyti, iš kurios vardų zonos?

<?xml version="1.0" encoding="UTF-8"?>
<html>
<body>
html turinys
<manoHtml>
<body>
mano turinys
</body>
</manoHtml>
</body>
</html>

Naudojame atributą xmlns be prefikso:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns=”http://www.w3.org/TR/html4/”>
<body>
html turinys
<manoHtml>
<body>
mano turinys
</body>
</manoHtml>
</body>
</html>


Pridedame ir asmeninę vardų zoną kitu prefiksu:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns=”http://www.w3.org/TR/html4/ ” xmlns:prefiksas=”http://mano.lt”>
<body>
html turinys
<prefiksas:manoHtml>
<prefiksas:body>
mano turinys
</prefiksas:body>
</prefiksas:manoHtml>
</body>
</html>

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)

Etiketės