8000 Let's do it cleaner and use several DynamicParameter implementations · utPLSQL/utPLSQL-java-api@e6f3a57 · GitHub
[go: up one dir, main page]

Skip to content
10000

Commit e6f3a57

Browse files
committed
Let's do it cleaner and use several DynamicParameter implementations
1 parent d329e8e commit e6f3a57

File tree

4 files changed

+110
-22
lines changed

4 files changed

+110
-22
lines changed

build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ repositories {
3838
}
3939
}
4040
mavenCentral()
41+
jcenter()
4142
}
4243

4344
dependencies {
@@ -55,6 +56,9 @@ dependencies {
5556
testImplementation("org.junit.jupiter:junit-jupiter:$junitVersion")
5657
testImplementation("org.hamcrest:hamcrest:2.1")
5758

59+
// Mockito
60+
testCompile("org.mockito:mockito-core:2.+")
61+
5862
// deployer for packagecloud
5963
deployerJars("io.packagecloud.maven.wagon:maven-packagecloud-wagon:0.0.6")
6064
}

src/main/java/org/utplsql/api/db/DynamicParameterList.java

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,77 @@
11
package org.utplsql.api.db;
22

3+
import oracle.jdbc.OracleConnection;
4+
5+
import java.sql.CallableStatement;
6+
import java.sql.SQLException;
7+
import java.sql.Types;
38
import java.util.LinkedHashMap;
4-
import java.util.function.Consumer;
59
import java.util.stream.Collectors;
610

711
public class DynamicParameterList {
812

9-
LinkedHashMap<String, Consumer<Integer>> params;
13+
LinkedHashMap<String, DynamicParameter> params;
14+
15+
interface DynamicParameter {
16+
void setParam( CallableStatement statement, int index ) throws SQLException;
17+
}
18+
19+
static class DynamicStringParameter implements DynamicParameter {
20+
private final String value;
21+
22+
DynamicStringParameter( String value ) {
23+
this.value = value;
24+
}
25+
26+
@Override
27+
public void setParam(CallableStatement statement, int index) throws SQLException {
28+
if ( value == null ) {
29+
statement.setNull(index, Types.VARCHAR);
30+
} else {
31+
statement.setString(index, value);
32+
}
33+
}
34+
}
35+
static class DynamicIntegerParameter implements DynamicParameter {
36+
private final Integer value;
37+
38+
DynamicIntegerParameter( Integer value ) {
39+
this.value = value;
40+
}
41+
42+
@Override
43+
public void setParam(CallableStatement statement, int index) throws SQLException {
44+
if ( value == null ) {
45+
statement.setNull(index, Types.INTEGER);
46+
} else {
47+
statement.setInt(index, value);
48+
}
49+
}
50+
}
51+
static class DynamicArrayParameter implements DynamicParameter {
52+
private final Object[] value;
53+
private final String customTypeName;
54+
private final OracleConnection oraConnection;
55+
56+
DynamicArrayParameter( Object[] value, String customTypeName, OracleConnection oraConnection ) {
57+
this.value = value;
58+
this.customTypeName = customTypeName;
59+
this.oraConnection = oraConnection;
60+
}
61+
62+
@Override
63+
public void setParam(CallableStatement statement, int index) throws SQLException {
64+
if ( value == null ) {
65+
statement.setNull(index, Types.ARRAY, customTypeName);
66+
} else {
67+
statement.setArray(
68+
index, oraConnection.createOracleArray(customTypeName, value)
69+
);
70+
}
71+
}
72+
}
1073

11-
DynamicParameterList(LinkedHashMap<String, Consumer<Integer>> params) {
74+
DynamicParameterList(LinkedHashMap<String, DynamicParameter> params) {
1275
this.params = params;
1376
}
1477

@@ -18,10 +81,10 @@ public String getSql() {
1881
.collect(Collectors.joining(", "));
1982
}
2083

21-
public void applyFromIndex( int startIndex ) {
84+
public void setParamsStartWithIndex(CallableStatement statement, int startIndex ) throws SQLException {
2285
int index = startIndex;
23-
for ( Consumer<Integer> function : params.values() ) {
24-
function.accept(index++);
86+
for ( DynamicParameter param : params.values() ) {
87+
param.setParam(statement, index++);
2588
}
2689
}
2790

src/main/java/org/utplsql/api/db/DynamicParameterListBuilder.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,33 @@
11
package org.utplsql.api.db;
22

3+
import oracle.jdbc.OracleConnection;
4+
35
import java.util.LinkedHashMap;
4-
import java.util.function.Consumer;
56

67
public class DynamicParameterListBuilder {
78

8-
private LinkedHashMap<String, Consumer<Integer>> params = new LinkedHashMap<>();
9+
private LinkedHashMap<String, DynamicParameterList.DynamicParameter> params = new LinkedHashMap<>();
10+
private boolean addIfNullOrEmpty = true;
911

1012
private DynamicParameterListBuilder() {
1113

1214
}
1315

14-
public DynamicParameterListBuilder addParameter(String identifier, Consumer<Integer> function) {
15-
16-
params.put(identifier, function);
16+
public DynamicParameterListBuilder onlyAddIfNotEmpty() {
17+
addIfNullOrEmpty = false;
18+
return this;
19+
}
1720

21+
public DynamicParameterListBuilder add( String identifier, String value ) {
22+
params.put(identifier, new DynamicParameterList.DynamicStringParameter(value));
23+
return this;
24+
}
25+
public DynamicParameterListBuilder add( String identifier, Integer value ) {
26+
params.put(identifier, new DynamicParameterList.DynamicIntegerParameter(value));
27+
return this;
28+
}
29+
public DynamicParameterListBuilder add(String identifier, Object[] value, String customTypeName, OracleConnection oraConnection ) {
30+
params.put(identifier, new DynamicParameterList.DynamicArrayParameter(value, customTypeName, oraConnection));
1831
return this;
1932
}
2033

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,37 @@
11
package org.utplsql.api.db;
22

3+
import oracle.jdbc.OracleConnection;
34
import org.junit.jupiter.api.Test;
45

5-
import java.util.ArrayList;
6+
import java.sql.CallableStatement;
7+
import java.sql.SQLException;
68

79
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
import static org.mockito.Mockito.mock;
11+
import static org.mockito.Mockito.verify;
812

913
public class DynamicParameterListTest {
1014

1115
@Test
12-
void firstTest() {
16+
void callWithThreeDifferentTypes() throws SQLException {
1317

14-
final ArrayList<Object> resultArray = new ArrayList<>();
18+
CallableStatement mockedStatement = mock(CallableStatement.class);
19+
OracleConnection mockedConn = mock(OracleConnection.class);
20+
21+
Object[] numArr = new Object[]{1, 2};
1522

1623
DynamicParameterList parameterList = DynamicParameterListBuilder.create()
17-
.addParameter("a_object_owner", i -> resultArray.add(i + ": MyOwner"))
18-
.addParameter("a_num_param", i -> resultArray.add( i + ": 123"))
24+
.add("a_object_owner", "MyOwner")
25+
.add("a_num_param", 123)
26+
.add("a_num_array", numArr, "MY_NUM_ARR", mockedConn)
1927
.build();
2028

21-
parameterList.applyFromIndex(5);
22-
assertEquals("a_object_owner = ?, a_num_param = ?", parameterList.getSql());
29+
assertEquals("a_object_owner = ?, a_num_param = ?, a_num_array = ?", parameterList.getSql());
2330

24-
ArrayList<Object> expectedList = new ArrayList<>();
25-
expectedList.add("5: MyOwner");
26-
expectedList.add("6: 123");
27-
assertEquals( expectedList, resultArray);
31+
parameterList.setParamsStartWithIndex(mockedStatement, 5);
32+
verify(mockedStatement).setString(5, "MyOwner");
33+
verify(mockedStatement).setInt(6, 123);
34+
verify(mockedConn).createOracleArray("MY_NUM_ARR", numArr);
35+
verify(mockedStatement).setArray(7, null);
2836
}
2937
}

0 commit comments

Comments
 (0)
0