Archetyp quickstart

Maven archetype je předdefinovaný vzor (forma, šablona) projektu a může být použit pro vygenerování nového projektu. Projekty vygenerované podle jednoho archetypu mají stejnou strukturu. V Mavenu je celá řada připravených šablon (archetypů). Jednou z nich je archetyp quickstart.

Parametry
groupId: vitfo.cz
artifactId: quickstart_project
version: 1.0-SNAPSHOT

Vygenerovaná struktura

quickstart_project
│   pom.xml
│
└───src
    ├───main
    │   └───java
    │       └───cz
    │           └───vitfo
    │                   App.java
    │
    └───test
        └───java
            └───cz
                └───vitfo
                        AppTest.java

Komentáře v SQL Developer

V SQL se pro komentování bloku kódu používá /* */ a pro komentování řádku -- (dvě pomlčky). V Oracle SQL Developer existuje pro řádkové komentáře klávesová zkratka Ctrl + / (také je možné přes pravé tlačítko myši a volbu Toggle Line Comments). V tomto případě se před řádku, ve které se nachází kurzor (a nebo před všechny označené řádky) doplní --. V případě, že používáte českou klávesnici, tato klávesová zkratka nebude fungovat. Řešením je přiřadit dané akci jinou klávesovou zkratku. Tools -> Preferences -> Shortcut Keys. Do vyhledávání napiště comment a označte vyhledaný řádek.

oracle_sql_developer_line_comments

Do textového pole New Shortcut zadejte klávesovou zkratku dle vlastní libosti. V tomto případě jsem si vybral Ctrl + / (na numerické klávesnici). Klikněte na Assign a OK:

oracle_sql_developer_line_comments_02

Přidání názvů sloupců do selectu v SQL Developer

Do SQL selektu je někdy nutné (místo *) nadefinovat sloupce, které se mají vracet. Těchto sloupců může být docela hodně a jejich vypisování je zdlouhavé a náchylné na chyby. Oracle SQL Developer tuto práci zjednodušuje. Napište si select.

select * from SYS.ALL_TAB_COLUMNS where column_name like 'ID'

Kurzor umístěte do názvu tabulky (v tomto případě ALL_TAB_COLUMNS). Klikněte Shift + F4 (nebo pravým tlačítkem myši a „Popup Describe“). Chvíli počkejte a otevře se vám okno. V záložce „Columns“ vyberte požadované sloupce (pomocí Shift nebo Ctrl).

oracle_sql_developer_adding_column_names

Hvězdičku ze selektu smažte a na její místo myší přetáhněte označené sloupce. Názvy sloupců, oddělené čárkami, se vloží do selektu.

select TABLE_NAME,COLUMN_NAME,DATA_TYPE,COLUMN_ID from SYS.ALL_TAB_COLUMNS where column_name like 'ID'

Zdroj: thatjeffsmith.com/…/more-column-copy-tricks-in-oracle-sql-developer/

Nastavení zobrazování okna s doplňováním kódu v SQL Developer

Oracle SQL Developer umožňuje zobrazování vyskakovacího okna s možnostmi pro doplňování kódu při psaní SQL. Stručně řečeno umožňuje zobrazování nápovědy při psaní. Okno se může zobrazovat hned při psaní nebo po stisknutí Ctrl + mezerník.

oracle_sql_developer_popup_window_with_code_completion

To, zda se má okno zobrazovat, rychlost jeho zobrazení nebo pro kolik záznamů maximálně se má zobrazit, se nastaví v Tools -> Preferences -> Code Editor -> Completion Insight.

oracle_sql_developer_popup_window_with_code_completion_02

Pokud vás vyskakovací okno obtěžuje, můžete Auto-Popup vypnout a nápovědu si zobrazit pomocí Ctrl + mezerník jen když budete potřebovat.

Testování error kódu výjimky v TestNG

Testovací framework TestNG umožňuje testovat nejen to, že metoda vrací výjimku a zároveň typ (třídu) vracené výjimky, ale též umožňuje otestovat zprávu, kterou tato výjimka obsahuje. To je vhodné například u vlastní výjimky, která vrací nějaký chybový kód. Otestujeme tedy nejen, že metoda v určitých případech vyhazuje chybu, ale také, zda vrací správný chybový kód.

Enum obsahující chybové kódy

public enum ErrorCode {

	X_IS_TO_BIG("X1111"),
	Y_IS_TO_BIG("Y1122"),
	Y_IS_BIGGER_THAN_X("Y1133");
	
	private final String code;
	
	private ErrorCode(String code) {
		this.code = code;
	}
	
	public String getCode() {
		return this.code;
	}
}

Třída představující naši chybu (exception)

public class MyException extends RuntimeException {

	public MyException(String errorCode) {
		super(errorCode);
	}
}

Třída, jejíž metodu budeme testovat

public class MyObject {
	
	private static final int X_MAX_VALUE = 100;
	private static final int Y_MAX_VALUE = 50;

	public int count(int x, int y) {
		
		if (x > X_MAX_VALUE) {
			throw new MyException(ErrorCode.X_IS_TO_BIG.getCode());
		}
		
		if (y >= Y_MAX_VALUE) {
			throw new MyException(ErrorCode.Y_IS_TO_BIG.getCode());
		}
		
		if (y > x) {
			throw new MyException(ErrorCode.Y_IS_BIGGER_THAN_X.getCode());
		}
		
		return (x + y) / (x + y);
	}
}

Budeme testovat, zda metoda správně vrací výsledek (public void countOk()) a zda vyhazuje chybu se správných kódem v případě, že zadané číslo x nebo y je příliš velké (public void countXToBig(), public void countYToBig()), nebo když je y větší než x (public void countYBiggerThanX()).

import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;

public class MyObjectTest {

	@Test(expectedExceptions = {MyException.class}, expectedExceptionsMessageRegExp = ".*X111.*")
	public void countXToBig() {
		int result = new MyObject().count(10_000, 12);
	}
	
	@Test(expectedExceptions = {MyException.class}, expectedExceptionsMessageRegExp = "Y.*22")
	public void countYToBig() {
		int result = new MyObject().count(9, 5_000);
	}
	
	@Test(expectedExceptions = {MyException.class}, expectedExceptionsMessageRegExp = "Y1133")
	public void countYBiggerThanX() {
		int result = new MyObject().count(22, 27);
	}
	
	@Test()
	public void countOk() {
		int result = new MyObject().count(8, 5);
		assertEquals(result, 1);
	}
}

ROWNUM v Oracle

ROWNUM není skutečný sloupec, ale pseudo sloupec, který je k dispozici v dotazu. ROWNUM je číslo od jedničky po N, kde N je počet záznamů vrácených dotazem a toto číslo je přidáno záznamu ještě předtím, než proběhne část ORDER BY. ROWNUM je pouze dočasné číslo. ROWNUM je navýšeno teprve poté, co je přiřazeno záznamu a vyhodnocena podmínka v WHERE části.

select * from table_name where rownum > 1

Nevrátí žádný záznam. První zázname má ROWNUM 1. Vyhodnocení WHERE ROWNUM > 1 je tedy false. ROWNUM se nenavýší a tím pádem tato podmínka nebude nikdy splněna.

select * from table_name where rownum >= 1

Vrátí všechny záznamy.

select * from table_name where rownum < 5

Vrátí první 4 záznamy.

select t.*, rownum from table_name t order by t.column_name

Nejdříve přiřadí ROWNUM jednotlivým řádkům a teprve poté seřadí výstup. Je pravděpodobné, že ROWNUM budou rozházená a případná podmínka WHERE ROWNUM < cislo by vrátila sice správný počet záznamů, ale neseřazeně. Řešením je následující select.

select rownum, t.* from (
 select * from table_name order by column_name) t
where rownum <= 5

Vrátí prvních pět výsledků dle řazení.

Pomocí ROWNUM je možné výsledek dotazu stránkovat, avšak je třeba použít ještě jeden select.

select * from (
  select rownum as cisla_radku, t.* from (
    select * from table_name order by column_name) t
  )
where cisla_radku between 10 and 15;

Vrátí desátý až patnáctý záznam (dle řazení) včetně. Podmínku WHERE je možné samozřejmě použít i ve vnořeném selectu.

select * from (
  select rownum as cisla_radku, t.* from (
    select * 
    from table_name
    where nejaka_podminka 
    order by column_name) t
  )
where cisla_radku between 10 and 15;

Zdroje:

Minimální pom.xml

Minimální pom.xml musí být uvozen tagem <project> a musí obsahovat tagy <modelVersion>, <groupId>, <artifactId> a <version>.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>cz.vitfo</groupId>
    <artifactId>projekt</artifactId>
    <version>0.0.1-SNAPSHOT</version>

</project>

<modelVersion>4.0.0</modelVersion>
Určuje verzi modelu pom. Aktuálně je podporována pouze verze 4.0.0. Tento tag je povinný.

<groupId>cz.vitfo</groupId>
Identifikuje firmu, skupinu, nebo vývojáře, který tento projekt vytvořil. Nejčastěji se používá se url (psaná od domény nejvyšího řádu), kterou má daná firma, skupina, vývojář zaregistrovánu, protože se jedná o jedinečný identifikátor.

<artifactId>projekt</artifactId>
Identifikuje projekt. Musí být jedinečný v rámci groupId. Společnost (vývojář) mohou vytvořit více projektů (stejné groupId), ale tyto projekty musí mít jedinečné artifactId.

<version>0.0.1-SNAPSHOT</version>
Určuje verzi projektu. Slovo SNAPSHOT se používá v případě, že projekt je ve vývoji.

Tagy groupId, artifactId a version se zazývají GAV souřadnice a jednoznačně určují soubor projektu.

Pole v PostgreSQL

PostgreSQL umožňuje nastavit sloupec jako několika rozměrné pole. V tomto příspěvku ukážu vytvoření sloupců, které budou obsahovat jednorozměrné pole.

Vytvoření tabulky favorite a naplnění daty.

create table favorite (
	id serial not null,
	person_id int not null,
	favorite_names varchar(15)[],
	favorite_numbers int[],

	primary key(id)
);

insert into favorite (person_id, favorite_names, favorite_numbers) values
	(4, '{"Petr", "Anna"}', '{7, 11, 23, 999}'),
	(5, array['Alena'], '{1}'),
	(7, '{"Marie", "Aneta", "Petr"}', array[17, 24]),
	(9, array['Pankrác', 'Servác', 'Bonifác'], array[111, 13, 9, 2]);

Třetí sloupec obsahuje pole řetězců a čtvrtý sloupec pole celých čísel. Pole je možné vytvořit pomocí složených závorek a nebo pomocí konstruktoru ARRAY.


Zobrazení tabulky favorite.

select * from favorite;

postgresql_arrays_01


Vypsání záznamů, které mají první záznam v poli favorite_numbers větší, než druhý záznam.

select * from favorite where favorite_numbers[1] > favorite_numbers[2];

Vypíše třetí oblíbené jméno a druhé oblíbené číslo pro každý záznam.

select favorite_names[3] as "Třetí oblíbené jméno", favorite_numbers[2] as "Druhé oblíbené číslo" from favorite;

postgresql_arrays_02


Zobrazí pro každý záznam počet položek v poli favorite_names (počet oblíbených jmen).

select array_length(favorite_names, 1) as pocet_oblibenych_jmen from favorite;

Zdroje:

View tables v PostgreSQL

Databáze v PostgreSQL obsahuje informační schéma (information_schema) ve kterém jsou různé pohledy (view), ze kterých lze získat informace o objektech v databázi. View information_schema.tables obsahuje informace o všech tabulkách (tables) a pohledech (views) v aktuální databázi.

select * from information_schema.tables;

Výpis celého pohledu information_schema.tables.

select * from information_schema.tables where table_schema = 'public';

Výpis všech informací o tabulkách a pohledech ve schématu public.

select * from information_schema.tables where table_schema = 'nazev_schematu';

Výpis všech informací o tabulkách a pohledech ve schématu s názvem nazev_schematu.

select table_name from information_schema.tables where table_type = 'VIEW';

Výpis všech pohledů (názvů pohledů) v aktuální databázi.

select table_name from information_schema.tables where table_type = 'BASE TABLE';

Výpis všech tabulek (názvů tabulek) v aktuální databázi.

Jak najít tabulky obsahující určité sloupce v PostgreSQL

Může se stát, že víte název sloupce, ale nevíte, v jaké tabulce se tento sloupec nachází. Informace o objektech databáze lze v PostgreSQL nalézt ve schématu information_schema.

Informační schéma (information schema) je množina pohledů (views), které obsahují informace o objektech v databázi. Informace o sloupcích lze nalézt v information_schema.columns view. Zdroj: postgresql.org/…/information-schema.html

Následující select vrátí názvy tabulek, které obsahují sloupce s názvem nazev_sloupce.

select table_name from information_schema.columns where column_name like 'nazev_sloupce'

Daný pohled (information_schema.columns) obsahuje řadu dalších informací např. datový typ sloupce.