В принципе это не может быть сделано с DbUtils
из коробки. Я избавился от QueryRunner
и MapListHandler
, так как обработчик создает ArrayList
. Вместо того, чтобы основываться на pull, я сделал это на основе push, создав очень похожий MyQueryRunner
, который принимает MyRowHandler
, и вместо возврата коллекции просто перебирает ResultSet
и вызывает мою функцию вывода.
Я уверен, что есть более элегантные способы сделать это и вернуть некоторый буфер строк, но это то, что мне нужно 80/20 и работает для больших наборов данных.
RowHandler
public class RowHandler {
private static final RowProcessor ROW_PROCESSOR = new BasicRowProcessor();
private JsonLOutputWriter writer;
public RowHandler(JsonLOutputWriter writer) {
this.writer = writer;
}
int handle(ResultSet rs) throws SQLException {
AtomicInteger counter = new AtomicInteger();
while (rs.next()) {
writer.writeRow(this.handleRow(rs));
counter.getAndIncrement();
}
return counter.intValue();
}
protected Map<String, Object> handleRow(ResultSet rs) throws SQLException {
return this.ROW_PROCESSOR.toMap(rs);
}
}
QueryHandler
class CustomQueryRunner extends AbstractQueryRunner {
private final RowHandler rh;
CustomQueryRunner(DataSource ds, StatementConfiguration stmtConfig, RowHandler rh) {
super(ds, stmtConfig);
this.rh = rh;
}
int query(String sql) throws SQLException {
Connection conn = this.prepareConnection();
return this.query(conn, true, sql);
}
private int query(Connection conn, boolean closeConn, String sql, Object... params)
throws SQLException {
if (conn == null) {
throw new SQLException("Null connection");
}
PreparedStatement stmt = null;
ResultSet rs = null;
int count = 0;
try {
stmt = this.prepareStatement(conn, sql);
this.fillStatement(stmt, params);
rs = this.wrap(stmt.executeQuery());
count = rh.handle(rs);
} catch (SQLException e) {
this.rethrow(e, sql, params);
} finally {
try {
close(rs);
} finally {
close(stmt);
if (closeConn) {
close(conn);
}
}
}
return count;
}
}
Поскольку Вы уже узнали: Скопируйте .sln Файл и удостоверьтесь соответствие путей/гуидов.
Поскольку .sln text/plain
просто используйте свой любимый язык сценариев для сценариев клона.
Возможно, это - хорошее время для изучения Хоста Сценария Python/Ruby/Perl/Windows
Взгляд на Древовидного Хирурга на CodePlex, это создает дерево разработки для Вас.
Я полагаю, что Инструментарий Автоматизации Руководства позволяет Вам делать это, но не может быть "легким" путем.
Я имею ту же проблему как Вы и намереваюсь посмотреть на нее подробно "очень скоро теперь".
Может быть, вам стоит проверить проект с открытым исходным кодом Warmup . Краткое описание можно найти на http://devlicious.com/blogs/rob_reynolds/archive/2010/02/01/warmup-getting-started.aspx .
IMHO, преимущество подхода Warmup в том, что он может клонировать все дерево с решением непосредственно из SVN или GIT.
Примечание! Я не использовал его лично, но планирую попробовать в следующем проекте. Пожалуйста, оставьте комментарий, если вы его используете.