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.
Javantura v6 - Building IoT Middleware with Microservices - Mario Kusek
Javantura Zagreb 2014 - Groovy-SQL - Dinko Srkoč
1. All your base are
belong to us
Pristup bazama podataka na Groovy
način
Dinko Srkoč, Helix d.o.o.
2.
3. Groovy
● jezik s dinamičkim tipovima
● mogućnost statičke provjere tipova
● jednostavna integracija s Javom
● meta programiranje
● lagana izrada domenskih jezika (DSL)
● skripte
4. 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.)
5. “
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/
6. 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.
7. 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) {
// ...
}
}
}
9. 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();
}
10. 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 !
12. 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.
13. 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
}
18. 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.
20. 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 !!
}
22. 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.
25. 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.