Skip to content

Commit

Permalink
Supporting ResultSet mapper in the JDBC client.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Mar 30, 2017
1 parent 04aaa8f commit e710dcc
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 17 deletions.
10 changes: 10 additions & 0 deletions rapidoid-sql/src/main/java/org/rapidoid/jdbc/JDBC.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
import org.rapidoid.annotation.Since;
import org.rapidoid.collection.Coll;
import org.rapidoid.datamodel.Results;
import org.rapidoid.lambda.Mapper;

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Map;
import java.util.UUID;

Expand Down Expand Up @@ -115,6 +117,14 @@ public static <T> Results<T> query(Class<T> resultType, String sql, Map<String,
return api().query(resultType, sql, namedArgs);
}

public static <T> Results<T> query(Mapper<ResultSet, T> resultMapper, String sql, Object... args) {
return api().query(resultMapper, sql, args);
}

public static <T> Results<T> query(Mapper<ResultSet, T> resultMapper, String sql, Map<String, ?> namedArgs) {
return api().query(resultMapper, sql, namedArgs);
}

public static Results<Map<String, Object>> query(String sql, Object... args) {
return api().query(sql, args);
}
Expand Down
35 changes: 24 additions & 11 deletions rapidoid-sql/src/main/java/org/rapidoid/jdbc/JdbcClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.rapidoid.group.AutoManageable;
import org.rapidoid.group.ManageableBean;
import org.rapidoid.io.Res;
import org.rapidoid.lambda.Mapper;
import org.rapidoid.log.Log;
import org.rapidoid.u.U;
import org.rapidoid.util.Msc;
Expand Down Expand Up @@ -313,21 +314,29 @@ private int doTryToExecute(String sql, Map<String, ?> namedArgs, Object[] args)
return 0;
}

public <T> Results<T> query(Class<T> resultType, String sql, Object... args) {
return doQuery(resultType, null, sql, null, args);
}

public <T> Results<T> query(Class<T> resultType, String sql, Map<String, ?> namedArgs) {
return doQuery(resultType, sql, namedArgs, null);
return doQuery(resultType, null, sql, namedArgs, null);
}

public <T> Results<T> query(Class<T> resultType, String sql, Object... args) {
return doQuery(resultType, sql, null, args);
public <T> Results<T> query(Mapper<ResultSet, T> resultMapper, String sql, Object... args) {
return doQuery(null, resultMapper, sql, null, args);
}

public <T> Results<T> query(Mapper<ResultSet, T> resultMapper, String sql, Map<String, ?> namedArgs) {
return doQuery(null, resultMapper, sql, namedArgs, null);
}

private <T> Results<T> doQuery(Class<T> resultType, String sql, Map<String, ?> namedArgs, Object[] args) {
private <T> Results<T> doQuery(Class<T> resultType, Mapper<ResultSet, T> resultMapper, String sql, Map<String, ?> namedArgs, Object[] args) {
sql = toSql(sql);
JdbcData<T> data = new JdbcData<>(this, resultType, sql, namedArgs, args);
JdbcData<T> data = new JdbcData<>(this, resultType, resultMapper, sql, namedArgs, args);
return new ResultsImpl<>(data);
}

<T> List<T> runQuery(Class<T> resultType, String sql, Map<String, ?> namedArgs, Object[] args, long start, long length) {
<T> List<T> runQuery(Class<T> resultType, Mapper<ResultSet, T> resultMapper, String sql, Map<String, ?> namedArgs, Object[] args, long start, long length) {
ensureIsInitialized();

U.must(start >= 0);
Expand All @@ -346,13 +355,17 @@ <T> List<T> runQuery(Class<T> resultType, String sql, Map<String, ?> namedArgs,
stmt = JDBC.prepare(conn, sql, namedArgs, args);
rs = stmt.executeQuery();

if (resultType.equals(Map.class)) {
return U.cast(JDBC.rows(rs));
if (resultMapper != null) {
return JDBC.rows(resultMapper, rs);
} else {
return JDBC.rows(resultType, rs);
if (resultType.equals(Map.class)) {
return U.cast(JDBC.rows(rs));
} else {
return JDBC.rows(resultType, rs);
}
}

} catch (SQLException e) {
} catch (Exception e) {
throw U.rte(e);

} finally {
Expand Down Expand Up @@ -389,7 +402,7 @@ private Connection provideConnection() {

if (username != null) {
String pass = U.safe(password);
conn = pool.getConnection(url, username, pass);
conn = pool.getConnection(url);

if (conn == null) {
conn = DriverManager.getConnection(url, username, pass);
Expand Down
8 changes: 6 additions & 2 deletions rapidoid-sql/src/main/java/org/rapidoid/jdbc/JdbcData.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@
import org.rapidoid.annotation.Authors;
import org.rapidoid.annotation.Since;
import org.rapidoid.datamodel.PageableData;
import org.rapidoid.lambda.Mapper;

import java.sql.ResultSet;
import java.util.List;
import java.util.Map;

Expand All @@ -34,21 +36,23 @@ public class JdbcData<T> extends RapidoidThing implements PageableData<T> {

private final JdbcClient jdbc;
private final Class<T> resultType;
private final Mapper<ResultSet, T> resultMapper;
private final String sql;
private final Map<String, ?> namedArgs;
private final Object[] args;

public JdbcData(JdbcClient jdbc, Class<T> resultType, String sql, Map<String, ?> namedArgs, Object[] args) {
public JdbcData(JdbcClient jdbc, Class<T> resultType, Mapper<ResultSet, T> resultMapper, String sql, Map<String, ?> namedArgs, Object[] args) {
this.jdbc = jdbc;
this.resultType = resultType;
this.resultMapper = resultMapper;
this.sql = sql;
this.namedArgs = namedArgs;
this.args = args;
}

@Override
public List<T> getPage(long start, long length) {
return jdbc.runQuery(resultType, sql, namedArgs, args, start, length);
return jdbc.runQuery(resultType, resultMapper, sql, namedArgs, args, start, length);
}

@Override
Expand Down
17 changes: 13 additions & 4 deletions rapidoid-sql/src/main/java/org/rapidoid/jdbc/JdbcUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import org.rapidoid.annotation.Since;
import org.rapidoid.beany.Beany;
import org.rapidoid.beany.Prop;
import org.rapidoid.cls.Cls;
import org.rapidoid.commons.StringRewriter;
import org.rapidoid.lambda.Mapper;
import org.rapidoid.u.U;
Expand Down Expand Up @@ -55,7 +54,7 @@ public static PreparedStatement prepare(Connection conn, String sql, final Map<S
args = arguments.toArray();
}

PreparedStatement stmt = conn.prepareStatement(sql);
PreparedStatement stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
bind(stmt, args);

return stmt;
Expand Down Expand Up @@ -111,7 +110,17 @@ public static void bind(PreparedStatement stmt, Object[] args) throws SQLExcepti
}
}

public static <T> List<T> rows(Class<T> resultType, ResultSet rs) throws SQLException {
public static <T> List<T> rows(Mapper<ResultSet, T> resultMapper, ResultSet rs) throws Exception {
List<T> rows = U.list();

while (rs.next()) {
rows.add(resultMapper.map(rs));
}

return rows;
}

public static <T> List<T> rows(Class<T> resultType, ResultSet rs) throws Exception {
List<T> rows = U.list();

ResultSetMetaData meta = rs.getMetaData();
Expand All @@ -124,7 +133,7 @@ public static <T> List<T> rows(Class<T> resultType, ResultSet rs) throws SQLExce
}

while (rs.next()) {
T row = Cls.newInstance(resultType);
T row = resultType.newInstance();

for (int i = 0; i < columnsN; i++) {
if (props[i] != null) {
Expand Down

0 comments on commit e710dcc

Please sign in to comment.