javantura zagreb 2014 - groovy-sql - dinko srkoč
Upload: hujak-hrvatska-udruga-java-korisnika-croatian-java-user-association
Post on 13-Jan-2015
821 views
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
![Page 1: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/1.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/2.jpg)
![Page 3: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/3.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/4.jpg)
[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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/5.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/6.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/7.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/8.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/9.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/10.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/11.jpg)
Groovy
groovy.sql.Sql
![Page 12: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/12.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/13.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/14.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/15.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/16.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/17.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/18.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/19.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/20.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/21.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/22.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/23.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/24.jpg)
Groovy
groovy.sql.DataSet
![Page 25: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/25.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/26.jpg)
Groovy
hr.helix.sqlstream.StreamingResultSet
![Page 27: Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/27.jpg)
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č](https://reader034.vdocuments.mx/reader034/viewer/2022051514/54b43a304a7959261f8b45c9/html5/thumbnails/28.jpg)
Hvala!For great justice.
QA&