Skip to content

Commit 1365cfc

Browse files
lunch2000koichi.ko
andauthored
Add params and literals methods to InsertBuilder, UpdateBuilder and DeleteBuilder (#683)
* #679 Add params and literals methods to InsertBuilder, UpdateBuilder and DeleteBuilder * #679 Correcting mistakes(UpdateBuilder -> DeleteBuilder) * #679 format code * #679 fix the unnecessary changes by code completion Co-authored-by: lunch2000 <[email protected]> Co-authored-by: koichi.ko <[email protected]>
1 parent 2aa38c7 commit 1365cfc

File tree

6 files changed

+495
-0
lines changed

6 files changed

+495
-0
lines changed

doma-core/src/main/java/org/seasar/doma/jdbc/builder/DeleteBuilder.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.seasar.doma.jdbc.builder;
22

33
import java.sql.Statement;
4+
import java.util.List;
45
import org.seasar.doma.DomaNullPointerException;
56
import org.seasar.doma.jdbc.Config;
67
import org.seasar.doma.jdbc.JdbcException;
@@ -116,6 +117,27 @@ public <P> DeleteBuilder param(Class<P> paramClass, P param) {
116117
return appendParam(paramClass, param, false);
117118
}
118119

120+
/**
121+
* Appends a parameter list.
122+
*
123+
* <p>The element type of the list must be one of basic types or holder types.
124+
*
125+
* @param <E> the element type of the list
126+
* @param elementClass the element class of the list
127+
* @param params the parameter list
128+
* @return a builder
129+
* @throws DomaNullPointerException if {@code elementClass} or {@code params} is {@code null}
130+
*/
131+
public <E> DeleteBuilder params(Class<E> elementClass, List<E> params) {
132+
if (elementClass == null) {
133+
throw new DomaNullPointerException("elementClass");
134+
}
135+
if (params == null) {
136+
throw new DomaNullPointerException("params");
137+
}
138+
return appendParams(elementClass, params, false);
139+
}
140+
119141
/**
120142
* Appends a parameter as literal.
121143
*
@@ -134,12 +156,48 @@ public <P> DeleteBuilder literal(Class<P> paramClass, P param) {
134156
return appendParam(paramClass, param, true);
135157
}
136158

159+
/**
160+
* Appends a parameter list as literal.
161+
*
162+
* <p>The element type of the list must be one of basic types or holder types.
163+
*
164+
* @param <E> the element type of the list
165+
* @param elementClass the element class of the list
166+
* @param params the parameter list
167+
* @return a builder
168+
* @throws DomaNullPointerException if {@code elementClass} or {@code params} is {@code null}
169+
*/
170+
public <E> DeleteBuilder literals(Class<E> elementClass, List<E> params) {
171+
if (elementClass == null) {
172+
throw new DomaNullPointerException("elementClass");
173+
}
174+
if (params == null) {
175+
throw new DomaNullPointerException("params");
176+
}
177+
return appendParams(elementClass, params, true);
178+
}
179+
137180
private <P> DeleteBuilder appendParam(Class<P> paramClass, P param, boolean literal) {
138181
helper.appendParam(new Param(paramClass, param, paramIndex, literal));
139182
paramIndex.increment();
140183
return new SubsequentDeleteBuilder(helper, query, paramIndex);
141184
}
142185

186+
private <E> DeleteBuilder appendParams(Class<E> elementClass, List<E> params, boolean literal) {
187+
DeleteBuilder builder = this;
188+
int index = 0;
189+
for (E param : params) {
190+
builder = builder.appendParam(elementClass, param, literal).sql(", ");
191+
index++;
192+
}
193+
if (index == 0) {
194+
builder = builder.sql("null");
195+
} else {
196+
builder = builder.removeLast();
197+
}
198+
return builder;
199+
}
200+
143201
/**
144202
* Executes an SQL DELETE statement.
145203
*

doma-core/src/main/java/org/seasar/doma/jdbc/builder/InsertBuilder.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.seasar.doma.jdbc.builder;
22

33
import java.sql.Statement;
4+
import java.util.List;
45
import org.seasar.doma.DomaNullPointerException;
56
import org.seasar.doma.jdbc.Config;
67
import org.seasar.doma.jdbc.JdbcException;
@@ -115,6 +116,27 @@ public <P> InsertBuilder param(Class<P> paramClass, P param) {
115116
return appendParam(paramClass, param, false);
116117
}
117118

119+
/**
120+
* Appends a parameter list.
121+
*
122+
* <p>The element type of the list must be one of basic types or holder types.
123+
*
124+
* @param <E> the element type of the list
125+
* @param elementClass the element class of the list
126+
* @param params the parameter list
127+
* @return a builder
128+
* @throws DomaNullPointerException if {@code elementClass} or {@code params} is {@code null}
129+
*/
130+
public <E> InsertBuilder params(Class<E> elementClass, List<E> params) {
131+
if (elementClass == null) {
132+
throw new DomaNullPointerException("elementClass");
133+
}
134+
if (params == null) {
135+
throw new DomaNullPointerException("params");
136+
}
137+
return appendParams(elementClass, params, false);
138+
}
139+
118140
/**
119141
* Appends a parameter as literal.
120142
*
@@ -133,12 +155,48 @@ public <P> InsertBuilder literal(Class<P> paramClass, P param) {
133155
return appendParam(paramClass, param, true);
134156
}
135157

158+
/**
159+
* Appends a parameter list as literal.
160+
*
161+
* <p>The element type of the list must be one of basic types or holder types.
162+
*
163+
* @param <E> the element type of the list
164+
* @param elementClass the element class of the list
165+
* @param params the parameter list
166+
* @return a builder
167+
* @throws DomaNullPointerException if {@code elementClass} or {@code params} is {@code null}
168+
*/
169+
public <E> InsertBuilder literals(Class<E> elementClass, List<E> params) {
170+
if (elementClass == null) {
171+
throw new DomaNullPointerException("elementClass");
172+
}
173+
if (params == null) {
174+
throw new DomaNullPointerException("params");
175+
}
176+
return appendParams(elementClass, params, true);
177+
}
178+
136179
private <P> InsertBuilder appendParam(Class<P> paramClass, P param, boolean literal) {
137180
helper.appendParam(new Param(paramClass, param, paramIndex, literal));
138181
paramIndex.increment();
139182
return new SubsequentInsertBuilder(helper, query, paramIndex);
140183
}
141184

185+
private <E> InsertBuilder appendParams(Class<E> elementClass, List<E> params, boolean literal) {
186+
InsertBuilder builder = this;
187+
int index = 0;
188+
for (E param : params) {
189+
builder = builder.appendParam(elementClass, param, literal).sql(", ");
190+
index++;
191+
}
192+
if (index == 0) {
193+
builder = builder.sql("null");
194+
} else {
195+
builder = builder.removeLast();
196+
}
197+
return builder;
198+
}
199+
142200
/**
143201
* Executes an SQL INSERT statement.
144202
*

doma-core/src/main/java/org/seasar/doma/jdbc/builder/UpdateBuilder.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.seasar.doma.jdbc.builder;
22

33
import java.sql.Statement;
4+
import java.util.List;
45
import org.seasar.doma.DomaNullPointerException;
56
import org.seasar.doma.jdbc.Config;
67
import org.seasar.doma.jdbc.JdbcException;
@@ -119,6 +120,27 @@ public <P> UpdateBuilder param(Class<P> paramClass, P param) {
119120
return appendParam(paramClass, param, false);
120121
}
121122

123+
/**
124+
* Appends a parameter list.
125+
*
126+
* <p>The element type of the list must be one of basic types or holder types.
127+
*
128+
* @param <E> the element type of the list
129+
* @param elementClass the element class of the list
130+
* @param params the parameter list
131+
* @return a builder
132+
* @throws DomaNullPointerException if {@code elementClass} or {@code params} is {@code null}
133+
*/
134+
public <E> UpdateBuilder params(Class<E> elementClass, List<E> params) {
135+
if (elementClass == null) {
136+
throw new DomaNullPointerException("elementClass");
137+
}
138+
if (params == null) {
139+
throw new DomaNullPointerException("params");
140+
}
141+
return appendParams(elementClass, params, false);
142+
}
143+
122144
/**
123145
* Appends a parameter as literal.
124146
*
@@ -137,12 +159,48 @@ public <P> UpdateBuilder literal(Class<P> paramClass, P param) {
137159
return appendParam(paramClass, param, true);
138160
}
139161

162+
/**
163+
* Appends a parameter list as literal.
164+
*
165+
* <p>The element type of the list must be one of basic types or holder types.
166+
*
167+
* @param <E> the element type of the list
168+
* @param elementClass the element class of the list
169+
* @param params the parameter list
170+
* @return a builder
171+
* @throws DomaNullPointerException if {@code elementClass} or {@code params} is {@code null}
172+
*/
173+
public <E> UpdateBuilder literals(Class<E> elementClass, List<E> params) {
174+
if (elementClass == null) {
175+
throw new DomaNullPointerException("elementClass");
176+
}
177+
if (params == null) {
178+
throw new DomaNullPointerException("params");
179+
}
180+
return appendParams(elementClass, params, true);
181+
}
182+
140183
private <P> UpdateBuilder appendParam(Class<P> paramClass, P param, boolean literal) {
141184
helper.appendParam(new Param(paramClass, param, paramIndex, literal));
142185
paramIndex.increment();
143186
return new SubsequentUpdateBuilder(helper, query, paramIndex);
144187
}
145188

189+
private <E> UpdateBuilder appendParams(Class<E> elementClass, List<E> params, boolean literal) {
190+
UpdateBuilder builder = this;
191+
int index = 0;
192+
for (E param : params) {
193+
builder = builder.appendParam(elementClass, param, literal).sql(", ");
194+
index++;
195+
}
196+
if (index == 0) {
197+
builder = builder.sql("null");
198+
} else {
199+
builder = builder.removeLast();
200+
}
201+
return builder;
202+
}
203+
146204
/**
147205
* Executes an SQL UPDATE statement.
148206
*

doma-core/src/test/java/org/seasar/doma/jdbc/builder/DeleteBuilderTest.java

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
44

5+
import java.util.Arrays;
6+
import java.util.Collections;
7+
import java.util.List;
58
import org.junit.jupiter.api.Test;
69
import org.seasar.doma.internal.jdbc.mock.MockConfig;
10+
import org.seasar.doma.jdbc.Sql;
11+
import org.seasar.doma.jdbc.SqlParameter;
712

813
public class DeleteBuilderTest {
914

@@ -49,4 +54,90 @@ public void testLiteral() {
4954

5055
builder.execute();
5156
}
57+
58+
@Test
59+
public void testParams() throws Exception {
60+
DeleteBuilder builder = DeleteBuilder.newInstance(new MockConfig());
61+
builder.sql("delete from Emp");
62+
builder.sql("where");
63+
builder.sql("name in (").params(String.class, Arrays.asList("x", "y", "z")).sql(")");
64+
builder.sql("and");
65+
builder.sql("salary in (").params(int.class, Arrays.asList(10, 20, 30)).sql(")");
66+
Sql<?> sql = builder.getSql();
67+
String rawSql =
68+
String.format(
69+
"delete from Emp%n"
70+
+ "where%n"
71+
+ "name in (?, ?, ?)%n"
72+
+ "and%n"
73+
+ "salary in (?, ?, ?)");
74+
assertEquals(rawSql, sql.getRawSql());
75+
76+
List<? extends SqlParameter> params = sql.getParameters();
77+
assertEquals(6, params.size());
78+
assertEquals("x", params.get(0).getValue());
79+
assertEquals("y", params.get(1).getValue());
80+
assertEquals("z", params.get(2).getValue());
81+
assertEquals(10, params.get(3).getValue());
82+
assertEquals(20, params.get(4).getValue());
83+
assertEquals(30, params.get(5).getValue());
84+
}
85+
86+
@Test
87+
public void testParams_empty() throws Exception {
88+
DeleteBuilder builder = DeleteBuilder.newInstance(new MockConfig());
89+
builder.sql("delete from Emp");
90+
builder.sql("where");
91+
builder.sql("name in (").params(String.class, Collections.emptyList()).sql(")");
92+
builder.sql("and");
93+
builder.sql("salary in (").params(int.class, Collections.emptyList()).sql(")");
94+
Sql<?> sql = builder.getSql();
95+
String rawSql =
96+
String.format(
97+
"delete from Emp%n" + "where%n" + "name in (null)%n" + "and%n" + "salary in (null)");
98+
assertEquals(rawSql, sql.getRawSql());
99+
100+
List<? extends SqlParameter> params = sql.getParameters();
101+
assertEquals(0, params.size());
102+
}
103+
104+
@Test
105+
public void testLiterals() throws Exception {
106+
DeleteBuilder builder = DeleteBuilder.newInstance(new MockConfig());
107+
builder.sql("delete from Emp");
108+
builder.sql("where");
109+
builder.sql("name in (").literals(String.class, Arrays.asList("x", "y", "z")).sql(")");
110+
builder.sql("and");
111+
builder.sql("salary in (").literals(int.class, Arrays.asList(10, 20, 30)).sql(")");
112+
Sql<?> sql = builder.getSql();
113+
String rawSql =
114+
String.format(
115+
"delete from Emp%n"
116+
+ "where%n"
117+
+ "name in ('x', 'y', 'z')%n"
118+
+ "and%n"
119+
+ "salary in (10, 20, 30)");
120+
assertEquals(rawSql, sql.getRawSql());
121+
122+
List<? extends SqlParameter> params = sql.getParameters();
123+
assertEquals(0, params.size());
124+
}
125+
126+
@Test
127+
public void testLiterals_empty() throws Exception {
128+
DeleteBuilder builder = DeleteBuilder.newInstance(new MockConfig());
129+
builder.sql("delete from Emp");
130+
builder.sql("where");
131+
builder.sql("name in (").literals(String.class, Collections.emptyList()).sql(")");
132+
builder.sql("and");
133+
builder.sql("salary in (").literals(int.class, Collections.emptyList()).sql(")");
134+
Sql<?> sql = builder.getSql();
135+
String rawSql =
136+
String.format(
137+
"delete from Emp%n" + "where%n" + "name in (null)%n" + "and%n" + "salary in (null)");
138+
assertEquals(rawSql, sql.getRawSql());
139+
140+
List<? extends SqlParameter> params = sql.getParameters();
141+
assertEquals(0, params.size());
142+
}
52143
}

0 commit comments

Comments
 (0)