Skip to content

Commit b2f1812

Browse files
committed
Update README and MySQL examples.
1 parent b94908c commit b2f1812

File tree

5 files changed

+46
-24
lines changed

5 files changed

+46
-24
lines changed

.idea/codeStyles/codeStyleConfig.xml

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/inspectionProfiles/Project_Default.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,17 @@ ResultSetAdapter resultSetAdapter = new ResultSetAdapter(statement.executeQuery(
788788
```
789789

790790
## QueryBuilder
791-
TODO
791+
The `QueryBuilder` class provides a fluent API for programmatically constructing SQL queries.
792+
793+
For example, the query from the previous section could be created as follows using `QueryBuilder`:
794+
795+
```java
796+
String sql = QueryBuilder.select("name", "species", "sex", "birth")
797+
.from("pet")
798+
.where("owner = :owner").toString();
799+
```
800+
801+
Insert, update, and delete operations are also supported. In general, string values provided to insert and update statements via the `values()` and `set()` methods are wrapped in single quotes, and any embdedded single quotes are replaced with two successive single quotes. However, any string that starts with ":" or is equal to "?" is assumed to be a parameter reference and is not escaped.
792802

793803
## ElementAdapter
794804
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.

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

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -99,31 +99,11 @@ public static QueryBuilder deleteFrom(String table) {
9999
return new QueryBuilder("delete from " + table);
100100
}
101101

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-
123102
/**
124103
* Appends a "from" clause to a query.
125104
*
126105
* @param tables
106+
* The table names.
127107
*
128108
* @return
129109
* The {@link QueryBuilder} instance.
@@ -273,4 +253,25 @@ public QueryBuilder set(String column, Object value) {
273253
public String toString() {
274254
return sqlBuilder.toString();
275255
}
256+
257+
private static String encode(Object value) {
258+
if (value instanceof String) {
259+
String string = (String)value;
260+
261+
if (string.startsWith(":") || string.equals("?")) {
262+
return string;
263+
} else {
264+
StringBuilder stringBuilder = new StringBuilder();
265+
266+
stringBuilder.append("'");
267+
stringBuilder.append(string.replace("'", "''"));
268+
stringBuilder.append("'");
269+
270+
return stringBuilder.toString();
271+
}
272+
273+
} else {
274+
return String.valueOf(value);
275+
}
276+
}
276277
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.httprpc.io.JSONEncoder;
2323
import org.httprpc.io.TemplateEncoder;
2424
import org.httprpc.sql.Parameters;
25+
import org.httprpc.sql.QueryBuilder;
2526
import org.httprpc.sql.ResultSetAdapter;
2627
import org.httprpc.util.ResourceBundleAdapter;
2728

@@ -71,7 +72,9 @@ public void init() throws ServletException {
7172

7273
@RequestMethod("GET")
7374
public void getPets(String owner, String format) throws SQLException, IOException {
74-
Parameters parameters = Parameters.parse("select name, species, sex, birth from pet where owner = :owner");
75+
Parameters parameters = Parameters.parse(QueryBuilder.select("name", "species", "sex", "birth")
76+
.from("pet")
77+
.where("owner = :owner").toString());
7578

7679
try (Connection connection = dataSource.getConnection();
7780
PreparedStatement statement = connection.prepareStatement(parameters.getSQL())) {
@@ -113,10 +116,12 @@ public void getPets(String owner, String format) throws SQLException, IOExceptio
113116
@RequestMethod("GET")
114117
@ResourcePath("average-age")
115118
public double getAverageAge() throws SQLException {
119+
String sql = QueryBuilder.select("birth").from("pet").toString();
120+
116121
double averageAge;
117122
try (Connection connection = dataSource.getConnection();
118123
Statement statement = connection.createStatement();
119-
ResultSetAdapter resultSetAdapter = new ResultSetAdapter(statement.executeQuery("select birth from pet"))) {
124+
ResultSetAdapter resultSetAdapter = new ResultSetAdapter(statement.executeQuery(sql))) {
120125
Date now = new Date();
121126

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

0 commit comments

Comments
 (0)