All your base are belong to us Pristup bazama podataka na Groovy način Dinko Srkoč, Helix d.o.o.
Jan 13, 2015
All your base are belong to usPristup bazama podataka na Groovy način
Dinko Srkoč, Helix d.o.o.
Groovy● jezik s dinamičkim tipovima
● mogućnost statičke provjere tipova
● jednostavna integracija s Javom
● meta programiranje
● lagana izrada domenskih jezika (DSL)
● skripte
[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.)
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 ?
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.
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) { // ... } }}
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.
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(); }
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 !
Groovy
groovy.sql.Sql
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.
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}
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 !!
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 ]
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 !!
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 ]
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.
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]
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 !!
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 / ...]
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.
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
Groovy
groovy.sql.DataSet
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.
Groovy
hr.helix.sqlstream.StreamingResultSet
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
Hvala!For great justice.
QA&