1414
1515package org .httprpc .sql ;
1616
17+ import java .util .ArrayList ;
1718import java .util .Map ;
1819
1920/**
2021 * Class for programmatically constructing a SQL query.
2122 */
2223public 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 ();
0 commit comments