Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

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

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.

Transcript of Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

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&