Browse Source

Dropwizard JDBI update (#4546)

* Update Dropwizard to 1.3.9

* Update JDBI to v3 in Dropwizard test
Fred Deschenes 6 years ago
parent
commit
1bd9b95ec4

+ 0 - 3
frameworks/Java/dropwizard/hello-world-jdbi-postgres.yml

@@ -52,6 +52,3 @@ database:
 
   # disable comments in SQL queries
   autoCommentsEnabled: false
-
-  # disable autocommit in the JDBC driver
-  autoCommitByDefault: false

+ 2 - 2
frameworks/Java/dropwizard/pom.xml

@@ -14,7 +14,7 @@
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<maven.compiler.source>10</maven.compiler.source>
 		<maven.compiler.target>10</maven.compiler.target>
-		<dropwizard.version>1.3.5</dropwizard.version>
+		<dropwizard.version>1.3.9</dropwizard.version>
 		<javax-activation.version>1.1.1</javax-activation.version>
 		<jaxb.version>2.3.0</jaxb.version>
 		<mysql-connector-java.version>5.1.47</mysql-connector-java.version>
@@ -84,7 +84,7 @@
 		</dependency>
 		<dependency>
 			<groupId>io.dropwizard</groupId>
-			<artifactId>dropwizard-jdbi</artifactId>
+			<artifactId>dropwizard-jdbi3</artifactId>
 			<version>${dropwizard.version}</version>
 		</dependency>
 		<dependency>

+ 9 - 9
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/HelloJDBIService.java

@@ -1,16 +1,16 @@
 package com.example.helloworld;
 
+import com.example.helloworld.db.jdbi.FortuneRepository;
 import io.dropwizard.Application;
-import io.dropwizard.jdbi.DBIFactory;
-import io.dropwizard.jdbi.bundles.DBIExceptionsBundle;
+import io.dropwizard.jdbi3.JdbiFactory;
+import io.dropwizard.jdbi3.bundles.JdbiExceptionsBundle;
 import io.dropwizard.setup.Bootstrap;
 import io.dropwizard.setup.Environment;
 import io.dropwizard.views.ViewBundle;
 
-import org.skife.jdbi.v2.DBI;
+import org.jdbi.v3.core.Jdbi;
 
 import com.example.helloworld.config.HelloWorldConfiguration;
-import com.example.helloworld.db.jdbi.FortuneJDBIImpl;
 import com.example.helloworld.db.jdbi.WorldRepository;
 import com.example.helloworld.resources.FortuneResource;
 import com.example.helloworld.resources.WorldResource;
@@ -23,16 +23,16 @@ public class HelloJDBIService extends Application<HelloWorldConfiguration> {
     @Override
     public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {
         bootstrap.addBundle(new ViewBundle<>());
-        bootstrap.addBundle(new DBIExceptionsBundle()); // Provides automatic unwrapping of SQLException and DBIException
+        bootstrap.addBundle(new JdbiExceptionsBundle()); // Provides automatic unwrapping of SQLException and DBIException
     }
 
     @Override
-    public void run(HelloWorldConfiguration config, Environment environment) throws ClassNotFoundException {
-    	final DBIFactory factory = new DBIFactory();
-        final DBI jdbi = factory.build(environment, config.getDatabaseConfiguration(), "RDBMS");
+    public void run(HelloWorldConfiguration config, Environment environment) {
+        final JdbiFactory factory = new JdbiFactory();
+        final Jdbi jdbi = factory.build(environment, config.getDatabaseConfiguration(), "RDBMS");
     	
         // Test type 1: JSON serialization and Test type 6: Plaintext are tested against HelloWorldService class
         environment.jersey().register(new WorldResource(new WorldRepository(jdbi))); // Test types 2, 3 & 5: Single database query, Multiple database queries & Database updates
-        environment.jersey().register(new FortuneResource(jdbi.onDemand(FortuneJDBIImpl.class))); // Test type 4: Fortunes 
+        environment.jersey().register(new FortuneResource(new FortuneRepository(jdbi))); // Test type 4: Fortunes
     }
 }

+ 5 - 8
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/db/jdbi/FortuneJDBIImpl.java

@@ -2,16 +2,13 @@ package com.example.helloworld.db.jdbi;
 
 import java.util.List;
 
-import org.skife.jdbi.v2.sqlobject.SqlQuery;
-import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
-import org.skife.jdbi.v2.sqlobject.mixins.Transactional;
-
-import com.example.helloworld.db.FortuneDAO;
 import com.example.helloworld.db.mappers.FortuneMapper;
 import com.example.helloworld.db.model.Fortune;
+import org.jdbi.v3.sqlobject.config.RegisterRowMapper;
+import org.jdbi.v3.sqlobject.statement.SqlQuery;
 
-public abstract class FortuneJDBIImpl implements Transactional<FortuneJDBIImpl>, FortuneDAO {
+public interface FortuneJDBIImpl {
 	@SqlQuery("select id, message from fortune")
-	@RegisterMapper(FortuneMapper.class)
-	public abstract List<Fortune> list();
+	@RegisterRowMapper(FortuneMapper.class)
+	List<Fortune> list();
 }

+ 20 - 0
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/db/jdbi/FortuneRepository.java

@@ -0,0 +1,20 @@
+package com.example.helloworld.db.jdbi;
+
+import com.example.helloworld.db.FortuneDAO;
+import com.example.helloworld.db.model.Fortune;
+import org.jdbi.v3.core.Jdbi;
+
+import java.util.List;
+
+public class FortuneRepository implements FortuneDAO {
+    private final Jdbi jdbi;
+
+    public FortuneRepository(Jdbi jdbi) {
+        this.jdbi = jdbi;
+    }
+
+    @Override
+    public List<Fortune> list() {
+        return jdbi.withExtension(FortuneJDBIImpl.class, FortuneJDBIImpl::list);
+    }
+}

+ 10 - 11
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/db/jdbi/WorldJDBIImpl.java

@@ -1,20 +1,19 @@
 package com.example.helloworld.db.jdbi;
 
-import org.skife.jdbi.v2.sqlobject.Bind;
-import org.skife.jdbi.v2.sqlobject.BindBean;
-import org.skife.jdbi.v2.sqlobject.SqlQuery;
-import org.skife.jdbi.v2.sqlobject.SqlUpdate;
-import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
-import org.skife.jdbi.v2.sqlobject.mixins.Transactional;
+import org.jdbi.v3.sqlobject.config.RegisterRowMapper;
 
 import com.example.helloworld.db.mappers.WorldMapper;
 import com.example.helloworld.db.model.World;
+import org.jdbi.v3.sqlobject.customizer.Bind;
+import org.jdbi.v3.sqlobject.customizer.BindBean;
+import org.jdbi.v3.sqlobject.statement.SqlBatch;
+import org.jdbi.v3.sqlobject.statement.SqlQuery;
 
-@RegisterMapper(WorldMapper.class)
-public abstract class WorldJDBIImpl implements Transactional<WorldJDBIImpl>, AutoCloseable  {
+@RegisterRowMapper(WorldMapper.class)
+public interface WorldJDBIImpl {
 	@SqlQuery("select id, randomNumber from world where id = :id")
-	public abstract World findById(@Bind("id") int id);
+	World findById(@Bind("id") int id);
 
-	@SqlUpdate("update world set randomNumber = :p.randomNumber where id = :p.id")
-	public abstract long update(@BindBean("p") World world);
+	@SqlBatch("update world set randomNumber = :p.randomNumber where id = :p.id")
+	void update(@BindBean("p") World...worlds);
 }

+ 17 - 37
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/db/jdbi/WorldRepository.java

@@ -1,40 +1,21 @@
 package com.example.helloworld.db.jdbi;
 
-import org.skife.jdbi.v2.DBI;
+import org.jdbi.v3.core.Jdbi;
 
 import com.example.helloworld.db.WorldDAO;
 import com.example.helloworld.db.model.World;
 import com.example.helloworld.resources.Helper;
 
 public class WorldRepository implements WorldDAO {
-	private DBI jdbi;
+	private final Jdbi jdbi;
 
-	public WorldRepository(DBI jdbi) {
-		super();
+	public WorldRepository(Jdbi jdbi) {
 		this.jdbi = jdbi;
 	}
 
 	@Override
 	public World findById(int id) {
-		try (WorldJDBIImpl dao = jdbi.open(WorldJDBIImpl.class)) {
-			return dao.findById(id);
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-	}
-
-	public World[] findById(int[] ids) {
-		final World[] worlds = new World[ids.length];
-		try (WorldJDBIImpl dao = jdbi.open(WorldJDBIImpl.class)) {
-			return dao.inTransaction((conn, status) -> {
-				for (int i = 0; i < ids.length; i++) {
-					worlds[i] = dao.findById(ids[i]);
-				}
-				return worlds;
-			});
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
+		return jdbi.withExtension(WorldJDBIImpl.class, dao -> dao.findById(id));
 	}
 
 	@Override
@@ -44,20 +25,19 @@ public class WorldRepository implements WorldDAO {
 
 	@Override
 	public World[] updatesQueries(int totalQueries) {
-		final World[] updates = new World[totalQueries];
-		try (WorldJDBIImpl dao = jdbi.open(WorldJDBIImpl.class)) {
-				for (int i = 0; i < totalQueries; i++) {
-					updates[i] = dao.inTransaction((conn, status) -> {
-						final World world = dao.findById(Helper.randomWorld());
-						world.setRandomNumber(Helper.randomWorld());
-						dao.update(world);
-						return world;
-					});
-				}
-				return updates;
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
+		return jdbi.withExtension(WorldJDBIImpl.class, dao -> {
+			final World[] updates = new World[totalQueries];
+
+			for (int i = 0; i < totalQueries; i++) {
+				final World world = dao.findById(Helper.randomWorld());
+				world.setRandomNumber(Helper.randomWorld());
+				updates[i] = world;
+			}
+
+			dao.update(updates);
+
+			return updates;
+		});
 	}
 
 }

+ 6 - 6
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/db/mappers/FortuneMapper.java

@@ -3,14 +3,14 @@ package com.example.helloworld.db.mappers;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
-import org.skife.jdbi.v2.StatementContext;
-import org.skife.jdbi.v2.tweak.ResultSetMapper;
+import org.jdbi.v3.core.mapper.RowMapper;
+import org.jdbi.v3.core.statement.StatementContext;
 
 import com.example.helloworld.db.model.Fortune;
 
-public class FortuneMapper implements ResultSetMapper<Fortune> {
-	public Fortune map(int index, ResultSet r, StatementContext ctx)
-			throws SQLException {
-		return new Fortune(r.getInt("id"), r.getString("message"));
+public class FortuneMapper implements RowMapper<Fortune> {
+	@Override
+	public Fortune map(ResultSet rs, StatementContext ctx) throws SQLException {
+		return new Fortune(rs.getInt("id"), rs.getString("message"));
 	}
 }

+ 6 - 7
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/db/mappers/WorldMapper.java

@@ -3,14 +3,13 @@ package com.example.helloworld.db.mappers;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
-import org.skife.jdbi.v2.StatementContext;
-import org.skife.jdbi.v2.tweak.ResultSetMapper;
-
 import com.example.helloworld.db.model.World;
+import org.jdbi.v3.core.mapper.RowMapper;
+import org.jdbi.v3.core.statement.StatementContext;
 
-public class WorldMapper implements ResultSetMapper<World> {
-	public World map(int index, ResultSet r, StatementContext ctx)
-			throws SQLException {
-		return new World(r.getInt("id"), r.getInt("randomNumber"));
+public class WorldMapper implements RowMapper<World> {
+	@Override
+	public World map(ResultSet rs, StatementContext ctx) throws SQLException {
+		return new World(rs.getInt("id"), rs.getInt("randomNumber"));
 	}
 }

+ 3 - 11
frameworks/Java/dropwizard/src/main/java/com/example/helloworld/resources/TextResource.java

@@ -4,23 +4,15 @@ import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+import java.nio.charset.StandardCharsets;
 
 @Path("/plaintext")
 @Produces(MediaType.TEXT_PLAIN)
 public class TextResource {
-	private static final String MESSAGE = "Hello, World!";
-	private static final byte[] buffer;
-
-	static {
-		try {
-			buffer = MESSAGE.getBytes("US-ASCII");
-		} catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-	}
+	private static final byte[] MESSAGE = "Hello, World!".getBytes(StandardCharsets.US_ASCII);
 
 	@GET
 	public byte[] sayHello() {
-		return buffer;
+		return MESSAGE;
 	}
 }