One of the examples in the String Template JEPs, and a stated motivating
factor behind its design, is SQL. Template processors are objects so that
use cases like constructing SQL statements aren't injection prone.
The questions I want to pose are:
* Should java.sql provide an implementation of TemplateProcessor
* Where should that implementation live?
* What, exactly, should be the translation strategy.
The reason I think this isn't an obvious yes and ask that last question is
this.
Say this is some user's code.
try (var conn = ds.getConnection();
var stmt = conn.prepareStatement("""
SELECT user.name
WHERE user.height > ? AND user.width < ?
""")) {
stmt.setInt(1, height);
stmt.setInt(2, width);
var rs = stmt.executeQuery();
process(rs);
}
The transliteration to string templates would be something like
try (var conn = ds.getConnection();
var stmt = conn."""
SELECT user.name
WHERE user.height > \{height} AND user.width < \{width}
""")) {
var rs = stmt.executeQuery();
process(rs);
}
Whether Connection implements TemplateProcessor directly or its something
that you wrap a connection with is somewhat immaterial.
How should we handle "partial templating"?
try (var conn = ds.getConnection();
var stmt = conn."""
SELECT user.name
WHERE user.height > ? AND user.width < \{width}
""")) {
var rs = stmt.executeQuery();
rs.setInt(1, height);
process(rs);
}
Or
try (var conn = ds.getConnection();
var stmt = conn."""
SELECT user.name
WHERE user.height > \{height} AND user.width < ?
""")) {
var rs = stmt.executeQuery();
rs.setInt(2, width);
process(rs);
}
Is replacing every substitution with ? and calling set* is enough? How
could it be known, without parsing the specific sql dialect, what index to
use for the parameter?
try (var conn = ds.getConnection();
var stmt = conn."""
SELECT user.name
WHERE user.name <> '???'
AND user.height > ?
AND user.width < \{width}
""")) {
var rs = stmt.executeQuery();
rs.setInt(1, height);
process(rs);
}
(this seems more library design than language design, hence I sent it here.
I can forward to amber-dev if that is better)