Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

1,719 views

Published on

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.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,719
On SlideShare
0
From Embeds
0
Number of Embeds
1,389
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč

  1. 1. All your base are belong to us Pristup bazama podataka na Groovy način Dinko Srkoč, Helix d.o.o.
  2. 2. Groovy ● jezik s dinamičkim tipovima ● mogućnost statičke provjere tipova ● jednostavna integracija s Javom ● meta programiranje ● lagana izrada domenskih jezika (DSL) ● skripte
  3. 3. Groovy @groovy.transform.ToString class 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.)
  4. 4. “ The JDBC™ API was designed to keep simple things simple. This means that the JDBC makes everyday database tasks easy. ” What happen ? http://docs.oracle.com/javase/tutorial/jdbc/
  5. 5. 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.
  6. 6. 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) { // ... } } }
  7. 7. 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.
  8. 8. 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(); }
  9. 9. 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 !
  10. 10. Groovy groovy.sql.Sql
  11. 11. 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.
  12. 12. 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 }
  13. 13. groovy.sql.Sql dohvat podataka [ meta-podaci ] def 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() } It’s you !!
  14. 14. groovy.sql.Sql dohvat podataka [ parametarski upit ] def sql = ... def limit = Date.from('yyyy-MM-dd', '2014-02-22') sql.eachRow("SELECT * FROM a_table WHERE col_c < ?", [limit]) { row -> // ... }
  15. 15. groovy.sql.Sql dohvat podataka [ parametarski upit ] def sql = ... def namedParam = [limit: Date.from('yyyy-MM-dd', '2014-02-22')] sql.eachRow("SELECT * FROM a_table WHERE col_a < :limit", namedParam) { // ... } How are you gentlemen !!
  16. 16. groovy.sql.Sql dohvat podataka [ parametarski upit ] def sql = ... def limit = Date.from('yyyy-MM-dd', '2014-02-22') sql.eachRow("SELECT * FROM a_table WHERE col_a < ${limit}") { row -> // ... }
  17. 17. groovy.sql.Sql dohvat podataka [ parametarski upit ] 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 -> // ... } You are on the way to destruction.
  18. 18. groovy.sql.Sql dohvat podataka [dohvat jednog sloga] def sql = ... def obj = sql.firstRow('SELECT * FROM a_table WHERE col_a = 1') println obj.col_a + obj.col_b
  19. 19. groovy.sql.Sql dohvat podataka [ lista slogova ] class 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()] What you say !! }
  20. 20. 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 / ...]
  21. 21. groovy.sql.Sql transakcije def sql = ... sql.withTransaction { (1..100).each { sql.execute("UPDATE a_table SET col_b = ${calc(it)} WHERE col_a = ${it}") } } You have no chance to survive make your time.
  22. 22. groovy.sql.Sql batch operacije 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) } } }
  23. 23. Groovy groovy.sql.DataSet
  24. 24. groovy.sql.DataSet 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() sql.rows ''' SELECT * FROM osobe WHERE godinarodjenja > 1986 AND mjestorodjenja = 'Zagreb' ORDER BY prezime DESC ''' You know what you doing.
  25. 25. Groovy hr.helix.sqlstream.StreamingResultSet
  26. 26. StreamingResultSet veliki skup podataka def sql = ... sql.withStream('SELECT * FROM the_world') { stream -> stream.collect { row -> new Osoba(row) }.findAll { osoba -> osoba.god_rodjenja > 1986 }.take(1000) .toList() }
  27. 27. Q A & Hvala! For great justice.

×