Skip to content

Commit e40b3a6

Browse files
authored
Merge pull request #19 from Borzoo/feature/proper-null-support
Add proper null support to parameterised queries
2 parents 638fb8f + 3a5257d commit e40b3a6

File tree

4 files changed

+40
-24
lines changed

4 files changed

+40
-24
lines changed

DatabaseConnector.mpr

16 KB
Binary file not shown.

javasource/databaseconnector/impl/PreparedStatementCreatorImpl.java

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@
55
import databaseconnector.interfaces.PreparedStatementCreator;
66

77
import java.math.BigDecimal;
8-
import java.sql.Connection;
9-
import java.sql.PreparedStatement;
10-
import java.sql.SQLException;
11-
import java.sql.Timestamp;
8+
import java.sql.*;
129
import java.util.ArrayList;
1310
import java.util.List;
1411

@@ -37,26 +34,40 @@ public PreparedStatement create(IStringTemplate sql, Connection connection) thro
3734
private void addPreparedStatementParameters(List<ITemplateParameter> queryParameters, PreparedStatement preparedStatement) throws SQLException, IllegalArgumentException {
3835
for (int i = 0; i < queryParameters.size(); i++) {
3936
ITemplateParameter parameter = queryParameters.get(i);
37+
Object parameterValue = parameter.getValue();
4038

4139
switch (parameter.getParameterType()) {
4240
case INTEGER:
43-
preparedStatement.setLong(i + 1, (long) parameter.getValue());
41+
if (parameterValue == null)
42+
preparedStatement.setNull(i + 1, Types.BIGINT);
43+
else
44+
preparedStatement.setLong(i + 1, (long) parameter.getValue());
4445
break;
4546
case STRING:
46-
preparedStatement.setString(i + 1, (String) parameter.getValue());
47+
if (parameterValue == null)
48+
preparedStatement.setNull(i + 1, Types.VARCHAR);
49+
else
50+
preparedStatement.setString(i + 1, (String) parameter.getValue());
4751
break;
4852
case BOOLEAN:
49-
preparedStatement.setBoolean(i + 1, (Boolean) parameter.getValue());
53+
if (parameterValue == null)
54+
preparedStatement.setNull(i + 1, Types.BOOLEAN);
55+
else
56+
preparedStatement.setBoolean(i + 1, (Boolean) parameter.getValue());
5057
break;
5158
case DECIMAL:
52-
preparedStatement.setBigDecimal(i + 1, (BigDecimal) parameter.getValue());
59+
if (parameterValue == null)
60+
preparedStatement.setNull(i + 1, Types.DECIMAL);
61+
else
62+
preparedStatement.setBigDecimal(i + 1, (BigDecimal) parameter.getValue());
5363
break;
5464
case DATETIME:
55-
java.util.Date date = ((java.util.Date) parameter.getValue());
56-
if (date == null)
57-
preparedStatement.setTimestamp(i + 1, null);
58-
else
65+
if (parameterValue == null)
66+
preparedStatement.setNull(i + 1, Types.TIMESTAMP);
67+
else {
68+
java.util.Date date = ((java.util.Date) parameter.getValue());
5969
preparedStatement.setTimestamp(i + 1, new Timestamp(date.getTime()));
70+
}
6071
break;
6172
default:
6273
throw new IllegalArgumentException("Invalid parameter type: " + parameter.getParameterType());

javasource/databaseconnectortest/test/JdbcConnectorTest.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ private SimpleEntry<String, IMetaPrimitive.PrimitiveType> entry(String name, IMe
7878
return new SimpleEntry<>(name, type);
7979
}
8080

81-
@Test public void testStatementCreationException() throws SQLException {
81+
@Test(expected = SQLException.class)
82+
public void testStatementCreationException() throws SQLException {
8283
Exception testException = new SQLException("Test Exception Text");
8384

8485
when(connectionManager.getConnection(anyString(), anyString(), anyString())).thenReturn(connection);
@@ -87,10 +88,11 @@ private SimpleEntry<String, IMetaPrimitive.PrimitiveType> entry(String name, IMe
8788
try {
8889
jdbcConnector.executeQuery(jdbcUrl, userName, password, mockIMetaObject(), sqlQuery, context);
8990
fail("An exception should occur!");
90-
} catch(SQLException sqlException) {}
91-
92-
verify(connection).close();
93-
verify(preparedStatement, never()).close();
91+
}
92+
finally {
93+
verify(connection).close();
94+
verify(preparedStatement, never()).close();
95+
}
9496
}
9597

9698
@Test public void testObjectInstantiatorException() throws SQLException {

javasource/databaseconnectortest/test/PreparedStatementCreatorTest.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.mendix.systemwideinterfaces.javaactions.parameters.IStringTemplate;
55
import com.mendix.systemwideinterfaces.javaactions.parameters.ITemplateParameter;
66
import com.mendix.systemwideinterfaces.javaactions.parameters.TemplateParameterType;
7-
import com.sap.db.jdbcext.wrapper.PreparedStatement;
87
import databaseconnector.impl.PreparedStatementCreatorImpl;
98
import org.junit.Before;
109
import org.junit.Rule;
@@ -14,9 +13,7 @@
1413
import org.mockito.junit.MockitoRule;
1514

1615
import java.math.BigDecimal;
17-
import java.sql.Connection;
18-
import java.sql.SQLException;
19-
import java.sql.Timestamp;
16+
import java.sql.*;
2017
import java.util.ArrayList;
2118
import java.util.Date;
2219
import java.util.List;
@@ -71,8 +68,11 @@ public void testParameterTypes() throws SQLException {
7168
builder.addParameter(true, TemplateParameterType.BOOLEAN);
7269
builder.addParameter("Hello", TemplateParameterType.STRING);
7370
builder.addParameter(new BigDecimal(45.5), TemplateParameterType.DECIMAL);
74-
builder.addParameter(null, TemplateParameterType.DATETIME);
7571
builder.addParameter(null, TemplateParameterType.STRING);
72+
builder.addParameter(null, TemplateParameterType.DATETIME);
73+
builder.addParameter(null, TemplateParameterType.DECIMAL);
74+
builder.addParameter(null, TemplateParameterType.BOOLEAN);
75+
builder.addParameter(null, TemplateParameterType.INTEGER);
7676

7777
sut.create(builder.build(), connection);
7878

@@ -81,8 +81,11 @@ public void testParameterTypes() throws SQLException {
8181
verify(preparedStatement).setBoolean(3, true);
8282
verify(preparedStatement).setString(4, "Hello");
8383
verify(preparedStatement).setBigDecimal(5, new BigDecimal(45.5));
84-
verify(preparedStatement).setTimestamp(6, null);
85-
verify(preparedStatement).setString(7, null);
84+
verify(preparedStatement).setNull(6, Types.VARCHAR);
85+
verify(preparedStatement).setNull(7, Types.TIMESTAMP);
86+
verify(preparedStatement).setNull(8, Types.DECIMAL);
87+
verify(preparedStatement).setNull(9, Types.BOOLEAN);
88+
verify(preparedStatement).setNull(10, Types.BIGINT);
8689
}
8790

8891
@Test

0 commit comments

Comments
 (0)