28
All your base are belong to us Pristup bazama podataka na Groovy način Dinko Srkoč, Helix d.o.o.

Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

Embed Size (px)

DESCRIPTION

Konferencija Javantura Zagreb 2014 by HUJAK All your base are belong to us – pristup bazama podataka na Groovy način by Dinko Srkoč Službeni Oracleov JDBC tutorijal počinje riječima: “JDBC API je osmišljen kako bi držao jednostavne stvari jednostavnim. To znači da JDBC čini svakodnevni rad s bazama podataka laganim”. Je li moguće taj lagani rad još malo olakšati? Na predavanju ćemo vidjeti kakvu podršku radu s bazama podataka pruža Groovy (groovy.codehaus.org), popularni programski jezik za JVM.

Citation preview

Page 1: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

All your base are belong to usPristup bazama podataka na Groovy način

Dinko Srkoč, Helix d.o.o.

Page 2: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč
Page 3: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

Groovy● jezik s dinamičkim tipovima

● mogućnost statičke provjere tipova

● jednostavna integracija s Javom

● meta programiranje

● lagana izrada domenskih jezika (DSL)

● skripte

Page 4: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

[email protected] Osoba { def ime def prezime}

def lista = 1..10

def osobe = lista.collect { i -> new Osoba(ime: "Pero", prezime: "Perić the ${i}.")}

println osobe[1] // ispis: Osoba(Pero, Perić the 2.)

Page 5: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

http://docs.oracle.com/javase/tutorial/jdbc/

The JDBC™ API was designed to keep simple things simple. This means that the JDBC makes everyday database tasks easy.

”What happen ?

Page 6: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

JDBC Java Database Connectivity

● komunikacija s bazom podataka ili drugim

tabličnim izvorom podataka

● neovisan o konkretnom sustavu za

upravljanje bazama podataka

● API za pristup bazi koristeći SQL

Somebody set us up the bomb.

Page 7: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

JDBC spajanje na bazu

import java.sql.DriverManager;import java.sql.Connection;import java.sql.SQLException;

public class Foo { public static void main (String [] args) { try { Class.forName("org.h2.Driver"); Connection conn = DriverManager.getConnection("jdbc:h2:mem"); // ... } catch (SQLException e) { // ... } catch (ClassNotFoundException e) { // ... } }}

Page 8: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

JDBC spajanje na bazu

import javax.sql.DataSource;import java.sql.Connection;import java.sql.SQLException;

// … try { Connection conn = dataSource.getConnection(); // ... } catch (SQLException e) { // ... }

We get signal.

Page 9: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

JDBC dohvat podataka

import java.sql.Statement;import java.sql.ResultSet;import java.sql.SQLException;

Statement stmt = conn.createStatement(); try { ResultSet rs = stmt.executeQuery("SELECT col_a, col_b FROM a_table"); while (rs.next()) { String colA = rs.getString("col_a"); int colB = rs.getInt("col_b"); // napraviti nešto s colA i colB ... } } catch (SQLException e) { // ... } finally { stmt.close(); }

Page 10: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

Ostalo (ORM, …)● rješava problem upravljanja resursima● nije potrebno pisati SQL za jednostavnije

slučajeve● automatska pretvorba: ResultSet →POJO

ali● izrada domain modela● konfiguracija (XML, anotacije)● često vlastiti jezik za složene upite● dohvat više podataka nego što je potrebno

What !

Page 11: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

Groovy

groovy.sql.Sql

Page 12: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.Sql spajanje na bazu

import groovy.sql.Sql

def sql = Sql.newInstance('jdbc:h2:mem', 'org.h2.Driver')

// ili

def sql = new Sql(dataSource)

Main screen turn on.

Page 13: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.Sql dohvat podataka

def sql = ...

sql.eachRow('SELECT col_a, col_b FROM a_table') { row -> // GroovyResultSet row.col_a // napraviti nešto s col_a row.col_b // i col_b}

Page 14: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.Sqldef sql = ...

def printColNames = { meta -> // ResultSetMetaData (1..meta.columnCount).each { print meta.getColumnLabel(it).padRight(20) } println()}

sql.eachRow('SELECT * FROM a_table', printColNames) { row -> row.toRowResult().values().each { print it.toString().padRight(20) } println()}

dohvat podataka[ meta-podaci ]

It’s you !!

Page 15: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.Sql

def sql = ...

def limit = Date.from('yyyy-MM-dd', '2014-02-22')sql.eachRow("SELECT * FROM a_table WHERE col_c < ?", [limit]) { row -> // ...}

dohvat podataka[ parametarski upit ]

Page 16: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.Sql

def sql = ...

def namedParam = [limit: Date.from('yyyy-MM-dd', '2014-02-22')]sql.eachRow("SELECT * FROM a_table WHERE col_a < :limit", namedParam) { // ...}

dohvat podataka[ parametarski upit ]

How are you gentlemen !!

Page 17: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.Sql

def sql = ...

def limit = Date.from('yyyy-MM-dd', '2014-02-22')sql.eachRow("SELECT * FROM a_table WHERE col_a < ${limit}") { row -> // ...}

dohvat podataka[ parametarski upit ]

Page 18: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.Sql

def sql = ...

class LimitMe { def limit // ...}

def limitObj = new LimitMe(limit: Date.from('yyyy-MM-dd', '2014-02-22'))sql.eachRow("SELECT * FROM a_table WHERE col_a < :limit", limitObj) { row -> // ...}

dohvat podataka[ parametarski upit ]

You are on the way to destruction.

Page 19: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.Sql

def sql = ...

def obj = sql.firstRow('SELECT * FROM a_table WHERE col_a = 1')

println obj.col_a + obj.col_b

dohvat podataka[dohvat jednog sloga]

Page 20: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.Sqlclass Osoba { def ime def prezime def mjesto_rodjenja def god_rodjenja}

sql.rows('SELECT mjesto_rodjenja, god_rodjenja FROM osobe').collect { row -> new Osoba(row)}.findAll { osoba -> osoba.god_rodjenja > 1986 // zadnji prolaz Halleyevog kometa}.groupBy { osoba -> osoba.mjesto_rodjenja}.collectEntries { mjesto, osobe -> [mjesto, osobe.size()]}

dohvat podataka[ lista slogova ]

What you say !!

Page 21: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.Sql

def sql = ...

sql.execute ''' INSERT INTO a_table (col_a, col_b, col_c) VALUES (?, ?, ?)''', [42, 'foo', 'bar']

mijenjanje podataka[ insert / update / ...]

Page 22: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.Sql

def sql = ...

sql.withTransaction { (1..100).each { sql.execute("UPDATE a_table SET col_b = ${calc(it)} WHERE col_a = ${it}") }}

transakcije

You have no chance to survive make your time.

Page 23: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.Sql

def sql = ...

sql.withTransaction { sql.withBatch(30, 'INSERT INTO a_table VALUES (?, ?, ?)') { pstmt -> sql.eachRow('SELECT * FROM b_table') { bTable -> pstmt.addBatch(bTable.foo, bTable.bar, bTable.baz) } }}

batch operacije

Page 24: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

Groovy

groovy.sql.DataSet

Page 25: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

groovy.sql.DataSet

sql.rows ''' SELECT * FROM osobe WHERE godinarodjenja > 1986 AND mjestorodjenja = 'Zagreb' ORDER BY prezime DESC '''

class Osoba { String ime String prezime String mjestoRodjenja Integer godinaRodjenja}

def osobe = new DataSet(sql, Osoba)

osobe.findAll { it.godinaRodjenja > 1986}.findAll { it.mjestoRodjenja == 'Zagreb'}.sort { it.prezime}.revert().rows()

You know what you doing.

Page 26: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

Groovy

hr.helix.sqlstream.StreamingResultSet

Page 27: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

StreamingResultSet

def sql = ...

sql.withStream('SELECT * FROM the_world') { stream -> stream.collect { row -> new Osoba(row) }.findAll { osoba -> osoba.god_rodjenja > 1986 }.take(1000) .toList()}

veliki skup podataka

Page 28: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

Hvala!For great justice.

QA&