Skip to content

Commit c138132

Browse files
committed
Fix issue with generated "update" statements.
1 parent b653288 commit c138132

File tree

2 files changed

+115
-129
lines changed

2 files changed

+115
-129
lines changed

httprpc-client/src/main/java/org/httprpc/sql/QueryBuilder.java

Lines changed: 107 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,17 @@
1414

1515
package org.httprpc.sql;
1616

17+
import java.util.ArrayList;
1718
import java.util.Map;
1819

1920
/**
2021
* Class for programmatically constructing a SQL query.
2122
*/
2223
public class QueryBuilder {
23-
private StringBuilder sqlBuilder = new StringBuilder();
24+
private StringBuilder sqlBuilder;
2425

25-
private QueryBuilder(String operation) {
26-
sqlBuilder.append(operation);
26+
private QueryBuilder(StringBuilder sqlBuilder) {
27+
this.sqlBuilder = sqlBuilder;
2728
}
2829

2930
/**
@@ -40,107 +41,12 @@ public static QueryBuilder select(String... columns) {
4041
throw new IllegalArgumentException();
4142
}
4243

43-
return new QueryBuilder("select " + String.join(", ", columns));
44-
}
45-
46-
/**
47-
* Creates an "insert into" query.
48-
*
49-
* @param table
50-
* The table name.
51-
*
52-
* @param columns
53-
* The column names.
54-
*
55-
* @return
56-
* The new {@link QueryBuilder} instance.
57-
*/
58-
public static QueryBuilder insertInto(String table, String... columns) {
59-
if (table == null) {
60-
throw new IllegalArgumentException();
61-
}
62-
63-
if (columns == null) {
64-
throw new IllegalArgumentException();
65-
}
66-
67-
return new QueryBuilder("insert into " + table + " (" + String.join(", ", columns) + ")");
68-
}
69-
70-
/**
71-
* Creates an "insert into" query.
72-
*
73-
* @param table
74-
* The table name.
75-
*
76-
* @param row
77-
* The row to insert.
78-
*
79-
* @return
80-
* The new {@link QueryBuilder} instance.
81-
*/
82-
public static QueryBuilder insertInto(String table, Map<String, ?> row) {
83-
if (table == null) {
84-
throw new IllegalArgumentException();
85-
}
86-
87-
if (row == null) {
88-
throw new IllegalArgumentException();
89-
}
44+
StringBuilder sqlBuilder = new StringBuilder();
9045

91-
int n = row.size();
92-
93-
String[] columns = new String[n];
94-
Object[] values = new Object[n];
95-
96-
int i = 0;
97-
98-
for (Map.Entry<String, ?> entry : row.entrySet()) {
99-
columns[i] = entry.getKey();
100-
values[i] = entry.getValue();
101-
102-
i++;
103-
}
104-
105-
QueryBuilder queryBuilder = insertInto(table, columns);
106-
107-
queryBuilder.values(values);
108-
109-
return queryBuilder;
110-
}
111-
112-
/**
113-
* Creates an "update" query.
114-
*
115-
* @param table
116-
* The table name.
117-
*
118-
* @return
119-
* The new {@link QueryBuilder} instance.
120-
*/
121-
public static QueryBuilder update(String table) {
122-
if (table == null) {
123-
throw new IllegalArgumentException();
124-
}
125-
126-
return new QueryBuilder("update " + table);
127-
}
128-
129-
/**
130-
* Creates a "delete from" query.
131-
*
132-
* @param table
133-
* The table name.
134-
*
135-
* @return
136-
* The new {@link QueryBuilder} instance.
137-
*/
138-
public static QueryBuilder deleteFrom(String table) {
139-
if (table == null) {
140-
throw new IllegalArgumentException();
141-
}
46+
sqlBuilder.append("select ");
47+
sqlBuilder.append(String.join(", ", columns));
14248

143-
return new QueryBuilder("delete from " + table);
49+
return new QueryBuilder(sqlBuilder);
14450
}
14551

14652
/**
@@ -296,7 +202,7 @@ public QueryBuilder limit(int count) {
296202
if (count < 0) {
297203
throw new IllegalArgumentException();
298204
}
299-
205+
300206
sqlBuilder.append(" limit ");
301207
sqlBuilder.append(count);
302208

@@ -316,55 +222,136 @@ public QueryBuilder forUpdate() {
316222
}
317223

318224
/**
319-
* Appends a "values" clause to a query.
225+
* Creates an "insert into" query.
226+
*
227+
* @param table
228+
* The table name.
320229
*
321230
* @param values
322-
* The column values.
231+
* The values to insert.
323232
*
324233
* @return
325-
* The {@link QueryBuilder} instance.
234+
* The new {@link QueryBuilder} instance.
326235
*/
327-
public QueryBuilder values(Object... values) {
236+
public static QueryBuilder insertInto(String table, Map<String, ?> values) {
237+
if (table == null) {
238+
throw new IllegalArgumentException();
239+
}
240+
328241
if (values == null) {
329242
throw new IllegalArgumentException();
330243
}
331244

332-
sqlBuilder.append(" values (");
245+
StringBuilder sqlBuilder = new StringBuilder();
246+
247+
sqlBuilder.append("insert into ");
248+
sqlBuilder.append(table);
249+
sqlBuilder.append(" (");
250+
251+
ArrayList<String> columns = new ArrayList<>(values.keySet());
252+
253+
int n = columns.size();
254+
255+
for (int i = 0; i < n; i++) {
256+
if (i > 0) {
257+
sqlBuilder.append(", ");
258+
}
259+
260+
sqlBuilder.append(columns.get(i));
261+
}
262+
263+
sqlBuilder.append(") values (");
333264

334-
for (int i = 0; i < values.length; i++) {
265+
for (int i = 0; i < n; i++) {
335266
if (i > 0) {
336267
sqlBuilder.append(", ");
337268
}
338269

339-
sqlBuilder.append(encode(values[i]));
270+
sqlBuilder.append(encode(values.get(columns.get(i))));
340271
}
341272

342273
sqlBuilder.append(")");
343274

344-
return this;
275+
return new QueryBuilder(sqlBuilder);
345276
}
346277

347278
/**
348-
* Appends a "set" command to a query.
279+
* Creates an "update" query.
349280
*
350-
* @param column
351-
* The column name.
281+
* @param table
282+
* The table name.
352283
*
353-
* @param value
354-
* The column value.
284+
* @return
285+
* The new {@link QueryBuilder} instance.
286+
*/
287+
public static QueryBuilder update(String table) {
288+
if (table == null) {
289+
throw new IllegalArgumentException();
290+
}
291+
292+
StringBuilder sqlBuilder = new StringBuilder();
293+
294+
sqlBuilder.append("update ");
295+
sqlBuilder.append(table);
296+
297+
return new QueryBuilder(sqlBuilder);
298+
}
299+
300+
/**
301+
* Appends a "set" command to a query.
302+
*
303+
* @param values
304+
* The values to update.
355305
*
356306
* @return
357307
* The {@link QueryBuilder} instance.
358308
*/
359-
public QueryBuilder set(String column, Object value) {
309+
public QueryBuilder set(Map<String, ?> values) {
310+
if (values == null) {
311+
throw new IllegalArgumentException();
312+
}
313+
360314
sqlBuilder.append(" set ");
361-
sqlBuilder.append(column);
362-
sqlBuilder.append(" = ");
363-
sqlBuilder.append(encode(value));
315+
316+
int i = 0;
317+
318+
for (Map.Entry<String, ?> entry : values.entrySet()) {
319+
if (i > 0) {
320+
sqlBuilder.append(", ");
321+
}
322+
323+
sqlBuilder.append(entry.getKey());
324+
sqlBuilder.append(" = ");
325+
sqlBuilder.append(encode(entry.getValue()));
326+
327+
i++;
328+
}
364329

365330
return this;
366331
}
367332

333+
/**
334+
* Creates a "delete from" query.
335+
*
336+
* @param table
337+
* The table name.
338+
*
339+
* @return
340+
* The new {@link QueryBuilder} instance.
341+
*/
342+
public static QueryBuilder deleteFrom(String table) {
343+
if (table == null) {
344+
throw new IllegalArgumentException();
345+
}
346+
347+
StringBuilder sqlBuilder = new StringBuilder();
348+
349+
sqlBuilder.append("delete from ");
350+
sqlBuilder.append(table);
351+
352+
return new QueryBuilder(sqlBuilder);
353+
}
354+
368355
@Override
369356
public String toString() {
370357
return sqlBuilder.toString();

httprpc-client/src/test/java/org/httprpc/sql/QueryBuilderTest.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,15 @@ public void testInsertInto() {
5858

5959
@Test
6060
public void testUpdate() {
61-
String sql = QueryBuilder.update("A")
62-
.set("a", 1)
63-
.set("b", true)
64-
.set("c", "hello")
65-
.set("d", ":d")
66-
.set("e", "?")
67-
.where("a is not null")
68-
.toString();
61+
String sql = QueryBuilder.update("A").set(mapOf(
62+
entry("a", 1),
63+
entry("b", true),
64+
entry("c", "hello"),
65+
entry("d", ":d"),
66+
entry("e", "?")
67+
)).where("a is not null").toString();
6968

70-
assertEquals("update A set a = 1 set b = true set c = 'hello' set d = :d set e = ? where a is not null", sql);
69+
assertEquals("update A set a = 1, b = true, c = 'hello', d = :d, e = ? where a is not null", sql);
7170
}
7271

7372
@Test

0 commit comments

Comments
 (0)