jOOQ at Topconf 2013

Preview:

DESCRIPTION

The slides from Lukas Eder's jOOQ presentation at Topconf 2013. The slides talk about the history of the Java and SQL integration, starting with JDBC, EJB 2.0, Hibernate, JPA, culminating in the claim that SQL is evolving in an entirely different direction than what is covered by Enterprise Java. This is where jOOQ comes in. jOOQ is currently the only platform in the Java market aiming at making SQL a first-class citizen in Java. This website depicts what every CTO / software architect should consider at the beginning of every new Java project: http://www.hibernate-alternative.com This version of the presentation on Slideshare is licensed under the terms of the CC-BY-SA license 3.0: http://creativecommons.org/licenses/by-sa/3.0 The jOOQ name, the jOOQ logo and the picture with the harbour worker are trademarks by Data Geekery GmbH. Please contact us if you want to use our trademarks in a derived presentation of yours. contact@datageekery.com

Citation preview

Copyright (c) 2009-2013 by Data Geekery GmbH.

Get Back in Control of your SQL

SQL and Java could worktogether so much better ifwe only let them.

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

About me

Java, SQL, PL/SQL

2001-2006 MSc Computer Science EPFL

2006-2009 Ergon Informatik AG, Zürich

2009-2013 Crealogix E-Banking AG, Zürich

2013 Adobe Systems Inc, Basel

2013 Data Geekery GmbH, Zürich

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

About my motivation

SQL dominates database systems

SQL seems «low level» and «dusty»

SQL can do so much more

SQL should be «sexy» again

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

About today

History of SQL in Java

Persistence in Java today

jOOQ

jOOQ Examples

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

SQL and Java - never ending story

JDBC

EJB 2.0 with EntityBeans

Hibernate / TopLink

EJB 3.0 with JPA 2.x

iBATIS / JDO / SpringData / 1’000 others

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

JDBC

PreparedStatement stmt = connection.prepareStatement("SELECT text FROM products WHERE cust_id = ? AND value < ?");

stmt.setInt(1, custID);stmt.setBigDecimal(2, BigDecimal.ZERO);ResultSet rs = stmt.executeQuery();

while (rs.next()) {System.out.println(rs.getString("TEXT"));

}

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

JDBC – the naked truth

01: PreparedStatement stmt = connection.prepareStatement(02: "SELECT p.text txt" + 03: (isAccount ? ", NVL(a.type, ?) " : "") + 04: "FROM products p " + 05: (isAccount ? " INNER JOIN accounts a USING (prod_id) " : "") + 06: " WHERE p.cust_id = ? AND p.value < ?" + 07: (isAccount ? " AND a.type LIKE '%" + type + "%'" : "");08: stmt.setInt(1, defaultType);09: stmt.setInt(2, custID);10: stmt.setBigDecimal(3, BigDecimal.ZERO);11: ResultSet rs = stmt.executeQuery();12:13: while (rs.next()) {14: Clob clob = rs.getClob("TEXT");15: System.out.println(clob.getSubString(1, (int) clob.length());16: } 17:18: rs.close();19: stmt.close();

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

JDBC – the naked truth

01: PreparedStatement stmt = connection.prepareStatement( //02: "SELECT p.text txt" + //03: (isAccount ? ", NVL(a.type, ?) " : "") + //04: "FROM products p " + // Syntax error when isAccount == false05: (isAccount ? " INNER JOIN accounts a USING (prod_id) " : "") + //06: " WHERE p.cust_id = ? AND p.value < ?" + //07: (isAccount ? " AND a.type LIKE '%" + type + "%'" : ""); // Syntax error and SQL injection possible08: stmt.setInt(1, defaultType); // Wrong bind index09: stmt.setInt(2, custID); //10: stmt.setBigDecimal(3, BigDecimal.ZERO); //11: ResultSet rs = stmt.executeQuery(); //12:13: while (rs.next()) { //14: Clob clob = rs.getClob("TEXT"); // ojdbc6: clob.free() should be called15: System.out.println(clob.getSubString(1, (int) clob.length()); // 16: } //17:18: rs.close(); // close() not really in finally block19: stmt.close(); //

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

JDBC – pros and cons

JDBC ProsNo restrictions (procedures, UDTs, vendor-specific features)

Simple

Fast

JDBC ConsString-based

No syntax checking

Lots of code, flat / indexed variablesRepetitive

Vendor lock-in

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

EJB 2.0 EntityBeans

public interface CustomerRequest extends EJBObject {BigInteger getId();String getText();void setText(String text);@Overridevoid remove();

}

public interface CustomerRequestHome extends EJBHome {CustomerRequest create(BigInteger id);CustomerRequest find(BigInteger id);

}

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

EJB 2.0 – the naked truth

<weblogic-enterprise-bean><ejb-name>com.example.CustomerRequestHome</ejb-name><entity-descriptor><pool><max-beans-in-free-pool>100</max-beans-in-free-pool>

</pool><entity-cache><max-beans-in-cache>500</max-beans-in-cache><idle-timeout-seconds>10</idle-timeout-seconds><concurrency-strategy>Database</concurrency-strategy>

</entity-cache><persistence><delay-updates-until-end-of-tx>True</delay-updates-until-end-of-tx>

</persistence><entity-clustering><home-is-clusterable>False</home-is-clusterable><home-load-algorithm>round-robin</home-load-algorithm>

</entity-clustering></entity-descriptor><transaction-descriptor/><enable-call-by-reference>True</enable-call-by-reference><jndi-name>com.example.CustomerRequestHome</jndi-name>

</weblogic-enterprise-bean>

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

EJB 2.0 – pros and cons

EJB 2.0 ProsIntuitive client code (create(), remove(), store())

Powerful (transactions, caching, etc.)

EJB 2.0 ConsNot intuitive implementation (Home, conventions)

Lots of configuration

XDoclet

Checked Exceptions (FinderException, CreateException)

Repetitive (except with a code generator)

Domain Model depends on container

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

Hibernate – ORM

Session session = sessionFactory.openSession();session.beginTransaction();

session.save(new Event("Conference", new Date());session.save(new Event("After Party", new Date());

List result = session.createQuery("from Event").list();for (Event event : (List<Event>) result) {System.out.println("Event : " + event.getTitle());

}

session.getTransaction().commit();session.close();

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

Hibernate – «navigation»

List result = session.createQuery("from Event").list();for (Event event : (List<Event>) result) {System.out.println("Participants of " + event);

for (Person person : event.getParticipants()) {Company company = person.getCompany();

System.out.println(person + " (" + company + ")");}

}

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

Hibernate – the naked truth

<hibernate-mapping package="org.hibernate.tutorial.hbm"><class name="Event" table="EVENTS"><id name="id" column="EVENT_ID"><generator class="increment"/>

</id><property name="date" type="timestamp" column="EVENT_DATE"/><property name="title"/><set name="participants" inverse="true"><key column="eventId"/><one-to-many entity-name="Person"/>

</set></class>

</hibernate-mapping>

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

Hibernate – pros and cons

Hibernate ProsVery intuitive client code (POJOs)

POJO code generator

Objects can be «navigated»

Hibernate implements JPA

Hibernate ConsHard to configure

Caching is complex

HQL is limited. SQL can do more.

ORM impedance mismatch

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

JPA and EJB 3.0

EntityManager em = factory.createEntityManager();em.getTransaction().begin();

em.persist(new Event("Conference", new Date());em.persist(new Event("After Party", new Date());

List result = em.createQuery("from Event").getResultList();for (Event event : (List<Event>) result) {System.out.println("Event : " + event.getTitle());

}

em.getTransaction().commit();em.close();

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

EJB 3.0 – the naked truth

@Entity @Table(name = "EVENTS")public class Event {private Long id;private String title;private Date date;

@Id @GeneratedValue(generator = "increment")@GenericGenerator(name = "increment", strategy = "increment")public Long getId() { /* … */ }

@Temporal(TemporalType.TIMESTAMP)@Column(name = "EVENT_DATE")public Date getDate() { /* … */ }

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

Criteria – the naked truth

EntityManager em= ...CriteriaBuilder builder = em.getCriteriaBuilder();CriteriaQuery<Person> criteria = builder.createQuery(Person.class);Root<Person> person = criteria.from(Person.class);Predicate condition = builder.gt(person.get(Person_.age), 20);criteria.where(condition);TypedQuery<Person> query = em.createQuery(query);List<Person> result = query.getResultList();

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

JPA – pros and cons

JPA FactsHibernate HQL => JPQL

Hibernate XML mapping => annotations

Hibernate Sessions => EntityManager

JPA ProsNext standard after EJB 2.0

Good implementations, such as Hibernate, EclipseLink

JPA ConsCriteriaQuery

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

What else is there?

iBATIS / MyBatisXML based. SQL is externalised

Active, but seems to be at the end of its hype cycle

JDOHas JDOQL (similar to HQL, JPQL)

Supports also NoSQL stores

Is pretty dead

Spring JDBC, Apache DbUtils, etcEase *some* of the JDBC pain

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

SQL is so much more

| TEXT | VOTES | RANK | PERCENT ||-------------|-------|------------|---------|| Hibernate | 138 | 1 | 32 % || jOOQ | 102 | 2 | 23 % || EclipseLink | 88 | 3 | 20 % || JDBC | 53 | 4 | 12 % || Spring JDBC | 45 | 5 | 10 % |

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

SQL is so much more

SELECT p.text,p.votes,DENSE_RANK() OVER (ORDER BY p.votes DESC) AS "rank",LPAD((p.votes * 100 / SUM(p.votes) OVER ()) || ' %', 4, ' '

) AS "percent"FROM poll_options pWHERE p.poll_id = 12ORDER BY p.votes DESC

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

The same with jOOQ

select (p.TEXT,p.VOTES,denseRank().over().orderBy(p.VOTES.desc()).as("rank"),lpad(p.VOTES.mul(100).div(sum(p.VOTES).over()).concat(" %"), 4, " "

).as("percent")).from (POLL_OPTIONS.as("p")).where (p.POLL_ID.eq(12)).orderBy(p.VOTES.desc());

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

The same with jOOQ in Scala (!)

select (p.TEXT,p.VOTES,denseRank() over() orderBy(p.VOTES desc) as "rank",lpad((p.VOTES * 100) / (sum(p.VOTES) over()) || " %",4, " "

) as "percent")from (POLL_OPTIONS as "p")where (p.POLL_ID === 12)orderBy (p.VOTES desc)

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

Support

Access MariaDB

CUBRID MySQL

DB2 Oracle

Derby Postgres

Firebird SQL Server

H2 SQLite

HSQLDB Sybase ASE

Ingres Sybase SQL Anywhere

Copyright (c) 2009-2013 by Data Geekery GmbH.

Intro SQL and Java jOOQ Examples

Examples

Recommended