Skip to content

Commit b94908c

Browse files
committed
Update QueryBuilder and associated tests.
1 parent 95b4335 commit b94908c

File tree

4 files changed

+93
-19
lines changed

4 files changed

+93
-19
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ Classes provided by the HTTP-RPC framework include:
3232
* [TemplateEncoder](#templateencoder) - encodes an object hierarchy using a [template document](template-reference.md)
3333
* [BeanAdapter](#beanadapter) - map adapter for Java beans
3434
* [ResultSetAdapter and Parameters](#resultsetadapter-and-parameters) - iterable adapter for JDBC result sets/applies named parameter values to prepared statements
35+
* [QueryBuilder](#querybuilder) - programmatically constructs a SQL query
3536
* [ElementAdapter](#elementadapter) - map adapter for XML elements
3637
* [ResourceBundleAdapter](#resourcebundleadapter) - map adapter for resource bundles
3738
* [StreamAdapter](#streamadapter) - iterable adapter for streams
@@ -786,6 +787,9 @@ Once applied, the statement can be executed:
786787
ResultSetAdapter resultSetAdapter = new ResultSetAdapter(statement.executeQuery());
787788
```
788789

790+
## QueryBuilder
791+
TODO
792+
789793
## ElementAdapter
790794
The `ElementAdapter` class provides access to the contents of an XML DOM `Element` via the `Map` interface. The resulting map can then be transformed to another representation via a template document or accessed via a strongly typed interface proxy, as described earlier.
791795

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

Lines changed: 82 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
package org.httprpc.sql;
1616

1717
/**
18-
* Class for dynamically constructing a SQL query.
18+
* Class for programmatically constructing a SQL query.
1919
*/
2020
public class QueryBuilder {
2121
private StringBuilder sqlBuilder = new StringBuilder();
@@ -25,9 +25,13 @@ private QueryBuilder(String operation) {
2525
}
2626

2727
/**
28-
* TODO
28+
* Creates a "select" query.
29+
*
2930
* @param columns
31+
* The column names.
32+
*
3033
* @return
34+
* The new {@link QueryBuilder} instance.
3135
*/
3236
public static QueryBuilder select(String... columns) {
3337
if (columns == null) {
@@ -38,10 +42,16 @@ public static QueryBuilder select(String... columns) {
3842
}
3943

4044
/**
41-
* TODO
45+
* Creates an "insert into" query.
46+
*
4247
* @param table
48+
* The table name.
49+
*
4350
* @param columns
51+
* The column names.
52+
*
4453
* @return
54+
* The new {@link QueryBuilder} instance.
4555
*/
4656
public static QueryBuilder insertInto(String table, String... columns) {
4757
if (table == null) {
@@ -56,9 +66,13 @@ public static QueryBuilder insertInto(String table, String... columns) {
5666
}
5767

5868
/**
59-
* TODO
69+
* Creates an "update" query.
70+
*
6071
* @param table
72+
* The table name.
73+
*
6174
* @return
75+
* The new {@link QueryBuilder} instance.
6276
*/
6377
public static QueryBuilder update(String table) {
6478
if (table == null) {
@@ -69,9 +83,13 @@ public static QueryBuilder update(String table) {
6983
}
7084

7185
/**
72-
* TODO
86+
* Creates a "delete from" query.
87+
*
7388
* @param table
89+
* The table name.
90+
*
7491
* @return
92+
* The new {@link QueryBuilder} instance.
7593
*/
7694
public static QueryBuilder deleteFrom(String table) {
7795
if (table == null) {
@@ -81,10 +99,34 @@ public static QueryBuilder deleteFrom(String table) {
8199
return new QueryBuilder("delete from " + table);
82100
}
83101

102+
private static String encode(Object value) {
103+
if (value instanceof String) {
104+
String string = (String)value;
105+
106+
if (string.startsWith(":") || string.equals("?")) {
107+
return string;
108+
} else {
109+
StringBuilder stringBuilder = new StringBuilder();
110+
111+
stringBuilder.append("'");
112+
stringBuilder.append(string.replace("'", "''"));
113+
stringBuilder.append("'");
114+
115+
return stringBuilder.toString();
116+
}
117+
118+
} else {
119+
return String.valueOf(value);
120+
}
121+
}
122+
84123
/**
85-
* TODO
124+
* Appends a "from" clause to a query.
125+
*
86126
* @param tables
127+
*
87128
* @return
129+
* The {@link QueryBuilder} instance.
88130
*/
89131
public QueryBuilder from(String... tables) {
90132
if (tables == null) {
@@ -98,9 +140,13 @@ public QueryBuilder from(String... tables) {
98140
}
99141

100142
/**
101-
* TODO
143+
* Appends a "join" clause to a query.
144+
*
102145
* @param table
146+
* The table name.
147+
*
103148
* @return
149+
* The {@link QueryBuilder} instance.
104150
*/
105151
public QueryBuilder join(String table) {
106152
if (table == null) {
@@ -114,9 +160,13 @@ public QueryBuilder join(String table) {
114160
}
115161

116162
/**
117-
* TODO
163+
* Appends an "on" clause to a query.
164+
*
118165
* @param predicate
166+
* The predicate.
167+
*
119168
* @return
169+
* The {@link QueryBuilder} instance.
120170
*/
121171
public QueryBuilder on(String predicate) {
122172
if (predicate == null) {
@@ -130,9 +180,13 @@ public QueryBuilder on(String predicate) {
130180
}
131181

132182
/**
133-
* TODO
183+
* Appends a "where" clause to a query.
184+
*
134185
* @param predicate
186+
* The predicate.
187+
*
135188
* @return
189+
* The {@link QueryBuilder} instance.
136190
*/
137191
public QueryBuilder where(String predicate) {
138192
if (predicate == null) {
@@ -146,9 +200,13 @@ public QueryBuilder where(String predicate) {
146200
}
147201

148202
/**
149-
* TODO
203+
* Appends an "order by" clause to a query.
204+
*
150205
* @param columns
206+
* The column names.
207+
*
151208
* @return
209+
* The {@link QueryBuilder} instance.
152210
*/
153211
public QueryBuilder orderBy(String... columns) {
154212
if (columns == null) {
@@ -162,9 +220,13 @@ public QueryBuilder orderBy(String... columns) {
162220
}
163221

164222
/**
165-
* TODO
223+
* Appends a "values" clause to a query.
224+
*
166225
* @param values
226+
* The column values.
227+
*
167228
* @return
229+
* The {@link QueryBuilder} instance.
168230
*/
169231
public QueryBuilder values(Object... values) {
170232
if (values == null) {
@@ -178,7 +240,7 @@ public QueryBuilder values(Object... values) {
178240
sqlBuilder.append(", ");
179241
}
180242

181-
sqlBuilder.append(values[i]);
243+
sqlBuilder.append(encode(values[i]));
182244
}
183245

184246
sqlBuilder.append(")");
@@ -187,16 +249,22 @@ public QueryBuilder values(Object... values) {
187249
}
188250

189251
/**
190-
* TODO
252+
* Appends a "set" command to a query.
253+
*
191254
* @param column
255+
* The column name.
256+
*
192257
* @param value
258+
* The column value.
259+
*
193260
* @return
261+
* The {@link QueryBuilder} instance.
194262
*/
195263
public QueryBuilder set(String column, Object value) {
196264
sqlBuilder.append(" set ");
197265
sqlBuilder.append(column);
198266
sqlBuilder.append(" = ");
199-
sqlBuilder.append(value);
267+
sqlBuilder.append(encode(value));
200268

201269
return this;
202270
}

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ public void testSelect() {
3737

3838
@Test
3939
public void testInsertInto() {
40-
String sql = QueryBuilder.insertInto("A", "a", "b", "c")
41-
.values(1, true, "hello")
40+
String sql = QueryBuilder.insertInto("A", "a", "b", "c", "d", "e")
41+
.values(1, true, "hello", ":a", "?")
4242
.toString();
4343

44-
System.out.println(sql);
44+
assertEquals("insert into A (a, b, c, d, e) values (1, true, 'hello', :a, ?)", sql);
4545
}
4646

4747
@Test
@@ -50,10 +50,12 @@ public void testUpdate() {
5050
.set("a", 1)
5151
.set("b", true)
5252
.set("c", "hello")
53+
.set("d", ":d")
54+
.set("e", "?")
5355
.where("a is not null")
5456
.toString();
5557

56-
System.out.println(sql);
58+
assertEquals("update A set a = 1 set b = true set c = 'hello' set d = :d set e = ? where a is not null", sql);
5759
}
5860

5961
@Test

httprpc-test/src/main/java/org/httprpc/test/PetService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public double getAverageAge() throws SQLException {
116116
double averageAge;
117117
try (Connection connection = dataSource.getConnection();
118118
Statement statement = connection.createStatement();
119-
ResultSetAdapter resultSetAdapter = new ResultSetAdapter(statement.executeQuery("SELECT birth FROM pet"))) {
119+
ResultSetAdapter resultSetAdapter = new ResultSetAdapter(statement.executeQuery("select birth from pet"))) {
120120
Date now = new Date();
121121

122122
Stream<Pet> pets = resultSetAdapter.stream().map(result -> BeanAdapter.adapt(result, Pet.class));

0 commit comments

Comments
 (0)