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&