Skip to content

Commit e7b0572

Browse files
committed
#23 - Address review comments.
1 parent 76f7a5a commit e7b0572

File tree

9 files changed

+36
-34
lines changed

9 files changed

+36
-34
lines changed

src/main/asciidoc/reference/r2dbc-repositories.adoc

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,4 @@ The annotated query uses native bind markers, which are Postgres bind markers in
120120

121121
NOTE: R2DBC repositories do not support query derivation.
122122

123-
NOTE: R2DBC repositories bind parameters to placeholders by index.
123+
NOTE: R2DBC repositories bind internally parameters to placeholders via `Statement.bind(…)` by index.

src/main/asciidoc/reference/r2dbc.adoc

+9-6
Original file line numberDiff line numberDiff line change
@@ -459,13 +459,16 @@ db.execute()
459459

460460
.R2DBC Native Bind Markers
461461
****
462-
R2DBC uses database-native bind markers that depend on the actual database.
463-
If you are familiar with JDBC, then you're also familiar with `?` (question mark) bind markers.
464-
JDBC drivers translate question mark bind markers to database-native markers as part of statement execution.
462+
R2DBC uses database-native bind markers that depend on the actual database vendor.
463+
As an example, Postgres uses indexed markers such as `$1`, `$2`, `$n`.
464+
Another example is SQL Server that uses named bind markers prefixed with `@` (at).
465465
466-
Postgres uses indexed markers (`$1`, `$2`), SQL Server uses named bind markers prefixed with `@` as its native bind marker syntax.
467-
Spring Data R2DBC leverages `Dialect` implementations to expand named parameters to native bind markers at the time of query execution which gives you a certain degree of query portability across various database vendors.
468-
You can still use native bind markers if you prefer to do so.
466+
This is different from JDBC which requires `?` (question mark) as bind markers.
467+
In JDBC, the actual drivers translate question mark bind markers to database-native markers as part of their statement execution.
468+
469+
Spring Data R2DBC allows you to use native bind markers or named bind markers with the `:name` syntax.
470+
471+
Named parameter support leverages ``Dialect``s to expand named parameters to native bind markers at the time of query execution which gives you a certain degree of query portability across various database vendors.
469472
****
470473

471474
The query-preprocessor unrolls named `Collection` parameters into a series of bind markers to remove the need of dynamic query creation based on the number of arguments.

src/main/java/org/springframework/data/r2dbc/function/DatabaseClient.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,12 @@ interface Builder {
112112
/**
113113
* Configures {@link NamedParameterExpander}.
114114
*
115-
* @param namedParameters must not be {@literal null}.
115+
* @param expander must not be {@literal null}.
116116
* @return {@code this} {@link Builder}.
117117
* @see NamedParameterExpander#enabled()
118118
* @see NamedParameterExpander#disabled()
119119
*/
120-
Builder namedParameters(NamedParameterExpander namedParameters);
120+
Builder namedParameters(NamedParameterExpander expander);
121121

122122
/**
123123
* Configures a {@link Consumer} to configure this builder.

src/main/java/org/springframework/data/r2dbc/function/DefaultDatabaseClient.java

+16-7
Original file line numberDiff line numberDiff line change
@@ -254,21 +254,30 @@ protected DefaultGenericExecuteSpec createGenericExecuteSpec(Supplier<String> sq
254254
private static void doBind(Statement<?> statement, Map<String, SettableValue> byName,
255255
Map<Integer, SettableValue> byIndex) {
256256

257-
byIndex.forEach((i, o) -> {
257+
bindByIndex(statement, byIndex);
258+
bindByName(statement, byName);
259+
}
260+
261+
private static void bindByName(Statement<?> statement, Map<String, SettableValue> byName) {
262+
263+
byName.forEach((name, o) -> {
258264

259265
if (o.getValue() != null) {
260-
statement.bind(i.intValue(), o.getValue());
266+
statement.bind(name, o.getValue());
261267
} else {
262-
statement.bindNull(i.intValue(), o.getType());
268+
statement.bindNull(name, o.getType());
263269
}
264270
});
271+
}
265272

266-
byName.forEach((name, o) -> {
273+
private static void bindByIndex(Statement<?> statement, Map<Integer, SettableValue> byIndex) {
274+
275+
byIndex.forEach((i, o) -> {
267276

268277
if (o.getValue() != null) {
269-
statement.bind(name, o.getValue());
278+
statement.bind(i.intValue(), o.getValue());
270279
} else {
271-
statement.bindNull(name, o.getType());
280+
statement.bindNull(i.intValue(), o.getType());
272281
}
273282
});
274283
}
@@ -340,7 +349,7 @@ <T> FetchSpec<T> exchange(String sql, BiFunction<Row, RowMetadata, T> mappingFun
340349
}
341350
});
342351

343-
doBind(statement, Collections.emptyMap(), byIndex);
352+
bindByIndex(statement, byIndex);
344353

345354
return statement;
346355
};

src/main/java/org/springframework/data/r2dbc/function/DefaultDatabaseClientBuilder.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ public Builder dataAccessStrategy(ReactiveDataAccessStrategy accessStrategy) {
9696
* @see org.springframework.data.r2dbc.function.DatabaseClient.Builder#namedParameters(org.springframework.data.r2dbc.function.NamedParameterExpander)
9797
*/
9898
@Override
99-
public Builder namedParameters(NamedParameterExpander namedParameters) {
99+
public Builder namedParameters(NamedParameterExpander expander) {
100100

101-
Assert.notNull(namedParameters, "NamedParameterExpander must not be null!");
101+
Assert.notNull(expander, "NamedParameterExpander must not be null!");
102102

103-
this.namedParameters = namedParameters;
103+
this.namedParameters = expander;
104104
return this;
105105
}
106106

src/main/java/org/springframework/data/r2dbc/function/DefaultTransactionalDatabaseClientBuilder.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ public TransactionalDatabaseClient.Builder dataAccessStrategy(ReactiveDataAccess
7373
* @see org.springframework.data.r2dbc.function.DefaultDatabaseClientBuilder#dataAccessStrategy(org.springframework.data.r2dbc.function.NamedParameterSupport)
7474
*/
7575
@Override
76-
public TransactionalDatabaseClient.Builder namedParameters(NamedParameterExpander namedParameters) {
77-
super.namedParameters(namedParameters);
76+
public TransactionalDatabaseClient.Builder namedParameters(NamedParameterExpander expander) {
77+
super.namedParameters(expander);
7878
return this;
7979
}
8080

src/main/java/org/springframework/data/r2dbc/function/NamedParameterUtils.java

-10
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,6 @@ public static ParsedSql parseSqlStatement(String sql) {
162162
continue;
163163
}
164164
}
165-
if (c == '?') {
166-
int j = i + 1;
167-
if (j < statement.length && (statement[j] == '?' || statement[j] == '|' || statement[j] == '&')) {
168-
// Postgres-style "??", "?|", "?&" operator should be skipped
169-
i = i + 2;
170-
continue;
171-
}
172-
unnamedParameterCount++;
173-
totalParameterCount++;
174-
}
175165
}
176166
i++;
177167
}

src/main/java/org/springframework/data/r2dbc/function/TransactionalDatabaseClient.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -192,12 +192,12 @@ interface Builder extends DatabaseClient.Builder {
192192
/**
193193
* Configures {@link NamedParameterExpander}.
194194
*
195-
* @param namedParameters must not be {@literal null}.
195+
* @param expander must not be {@literal null}.
196196
* @return {@code this} {@link Builder}.
197197
* @see NamedParameterExpander#enabled()
198198
* @see NamedParameterExpander#disabled()
199199
*/
200-
Builder namedParameters(NamedParameterExpander namedParameters);
200+
Builder namedParameters(NamedParameterExpander expander);
201201

202202
/**
203203
* Configures a {@link Consumer} to configure this builder.

src/test/java/org/springframework/data/r2dbc/function/NamedParameterUtilsUnitTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public void shouldParseSql() {
5050
String sql2 = "xxx &a yyyy ? zzzzz";
5151
ParsedSql psql2 = NamedParameterUtils.parseSqlStatement(sql2);
5252
assertThat(psql2.getParameterNames()).containsExactly("a");
53-
assertThat(psql2.getTotalParameterCount()).isEqualTo(2);
53+
assertThat(psql2.getTotalParameterCount()).isEqualTo(1);
5454
assertThat(psql2.getNamedParameterCount()).isEqualTo(1);
5555

5656
String sql3 = "xxx &ä+:ö" + '\t' + ":ü%10 yyyy ? zzzzz";

0 commit comments

Comments
 (0)