tdc2016sp - jooq: sql orientado a objetos

31
jOOQ SQL orientado a objetos The Developers Conference São Paulo - 2016

Upload: tdc-globalcode

Post on 13-Apr-2017

323 views

Category:

Education


2 download

TRANSCRIPT

Page 1: TDC2016SP - JooQ: SQL orientado a objetos

jOOQSQL orientado a objetos

The Developers ConferenceSão Paulo - 2016

Page 2: TDC2016SP - JooQ: SQL orientado a objetos

Gabriel Saraiva Desenvolvedor na

Page 3: TDC2016SP - JooQ: SQL orientado a objetos

SQL ❤

String sql = "SELECT * FROM users WHERE email = ?";

PreparedStatement stmt = conn.prepareStatement(sql);

stmt.setString(1,"[email protected]");

Page 4: TDC2016SP - JooQ: SQL orientado a objetos

SQL ❤ ?

String sql = "UPDATE products" +

"SET name = ?, ..., price = ?" +

"WHERE id = ?";

PreparedStatement stmt = conn.prepareStatement(sql);

stmt.setString(1, "Café");

// 98 campos depois...

stmt.setLong(99, 123L);

(╯°□°)╯︵ ┻━┻

Page 5: TDC2016SP - JooQ: SQL orientado a objetos

String sql = "SELECT avg(age), cityId " +

"FROM users " +

(filter ? "WHERE cityId IN (...) ":"") +

"GROUP BY cityId " +

(order ? "ORDER BY name DESC":"") +

...

;

SQL !!!

Page 6: TDC2016SP - JooQ: SQL orientado a objetos

SQL:

“Stringish Query Langage” ?

SQL = Structured Query Language

Page 7: TDC2016SP - JooQ: SQL orientado a objetos

O problema não é o SQL.

É como escrevemos SQL.

Page 8: TDC2016SP - JooQ: SQL orientado a objetos

SQL ❤ !!!

String sql = select()

.from(USERS)

.where(

USERS.ID.in(ids)

)

.toString();

Page 9: TDC2016SP - JooQ: SQL orientado a objetos

“The easiest way to write SQL in Java”

or in

Scala

Page 10: TDC2016SP - JooQ: SQL orientado a objetos

jOOQ:

Uma DSL para escrever SQL

Page 11: TDC2016SP - JooQ: SQL orientado a objetos

Setup: 1 minuto.

Page 12: TDC2016SP - JooQ: SQL orientado a objetos

Setup: 1 minuto.

<dependency> <groupId>org.jooq</groupId> <artifactId>jooq</artifactId> <version>3.8.2</version></dependency><dependency> <groupId>org.jooq</groupId> <artifactId>jooq-meta</artifactId> <version>3.8.2</version></dependency><dependency> <groupId>org.jooq</groupId> <artifactId>jooq-codegen</artifactId> <version>3.8.2</version></dependency>

Page 13: TDC2016SP - JooQ: SQL orientado a objetos

Setup: 1 minutoou mais!

Page 14: TDC2016SP - JooQ: SQL orientado a objetos

Type Safe

select()

.from(USERS)

.where(

USERS.EMAIL.equal(1234)

)

Page 15: TDC2016SP - JooQ: SQL orientado a objetos

SintaxeFluente

select()

.from(USERS)

.where(

USERS.ID.equal(1234),

USERS.AGE.equal(26)

)

Page 16: TDC2016SP - JooQ: SQL orientado a objetos

SQL InjectionSafe

String name =

"Bob\"); DROP TABLE users; --";

select()

.from(USERS)

.where(

USERS.NAME.eq(name)

)

Page 17: TDC2016SP - JooQ: SQL orientado a objetos

Free:p/ bancosOpen Source

Page 18: TDC2016SP - JooQ: SQL orientado a objetos

$$$:p/ bancosEnterprise

mais informações disponíveis em: http://www.jooq.org/legal/licensing#databases

Page 19: TDC2016SP - JooQ: SQL orientado a objetos

Modelodo Banco:(opcional)Automático!

Page 20: TDC2016SP - JooQ: SQL orientado a objetos

<configuration> <jdbc> <driver>com.mysql.jdbc.Driver</driver> <url>jdbc:mysql://localhost:3306</url> <user>root</user> <password>password</password> </jdbc>

<generator> <database> <name>org.jooq.util.mysql.MySQLDatabase</name> <includes>.*</includes> <excludes/> <inputSchema>example_database</inputSchema> <unsignedTypes>false</unsignedTypes> </database> <target> <packageName>com.example.database</packageName> <directory>src/main/java</directory> </target> </generator></configuration>

Page 21: TDC2016SP - JooQ: SQL orientado a objetos

Usando o jOOQ para escrever SQL

Page 22: TDC2016SP - JooQ: SQL orientado a objetos

1 minuto de setup: Sem modelo do db.

String sql = DSL.using(SQLDialect.MYSQL)

.select(field("name"), field("phone"))

.from("users")

.where(

field("id").equal(1234)

)

.toString();

Page 23: TDC2016SP - JooQ: SQL orientado a objetos

2 minutos de setup: Modelo db automático

String sql = select(USERS.NAME, USERS.PHONE)

.from(USERS)

.where(

USERS.ID.eq(1234L)

)

.toString();

Page 24: TDC2016SP - JooQ: SQL orientado a objetos

Inserts sem ?,?,?,?,?,?,,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? será que faltou um ?

String sql = insertInto(USERS)

.set(USERS.NAME,"Gabriel Saraiva")

.set(USERS.PHONE,"16999666333")

.set(USERS.EMAIL,"[email protected]")

.toString();

Page 25: TDC2016SP - JooQ: SQL orientado a objetos

Filtros

String sql = select()

.from(PRODUCTS)

.where(PRODUCTS.CATEGORY.eq("drinks")

.or(PRODUCTS.CATEGORY.eq("beers"))

.and(PRODUCTS.NAME.contains("coffee"))

)

.toString();

Page 26: TDC2016SP - JooQ: SQL orientado a objetos

Lista de Filtros

List<Condition> filters = Arrays.asList(

PRODUCTS.CATEGORY.equal("drinks"),

PRODUCTS.PRICE.greaterThan(new BigDecimal(25))

);

String sql = select(PRODUCTS.NAME, PRODUCTS.PRICE)

.from(PRODUCTS)

.where(filters)

.orderBy(PRODUCTS.PRICE.desc())

.toString();

Page 27: TDC2016SP - JooQ: SQL orientado a objetos

Joins!

Users u = USERS;

Orders o = ORDERS;

OrdersProducts op = ORDERS_PRODUCTS;

Products p = PRODUCTS;

String sql = select()

.from(u

.innerJoin(o).on(u.ID.eq(o.USER_ID))

.innerJoin(op).on(o.ID.eq(op.ORDER_ID))

.innerJoin(p).on(p.ID.eq(op.ORDER_ID))

)

.toString();

Page 28: TDC2016SP - JooQ: SQL orientado a objetos

Group By!

String sql = DSL.

select(

u.NAME,

o.ID,

sum(op.PRODUCT_SOLD_PRICE)

)

.from(join)

.where(filters)

.groupBy(o.ID)

.toString();

Page 29: TDC2016SP - JooQ: SQL orientado a objetos

Lendo dados do ResultSet

ResultSet rs = stmt.executeQuery();

rs.next();

return new Product(

rs.getLong(PRODUCTS.ID.getName()),

rs.getString(PRODUCTS.NAME.getName()),

rs.getBigDecimal(PRODUCTS.PRICE.getName()),

rs.getString(PRODUCTS.CATEGORY.getName())

);

Page 30: TDC2016SP - JooQ: SQL orientado a objetos

Escrever SQL

pode ser

divertido!

Page 31: TDC2016SP - JooQ: SQL orientado a objetos

Obrigado

Gabriel [email protected]

github.com/gabrsartwitter/gabrielSaraivaAgradecimentos ❤

Igor EscobarGiuliano CaliariDiego Leme