Skip to content

Commit d6a3ccb

Browse files
committed
Add some minimal support for ARRAY types. Still need a custom type handler for now.
1 parent 1f09e0a commit d6a3ccb

File tree

6 files changed

+122
-16
lines changed

6 files changed

+122
-16
lines changed

src/main/java/org/apache/ibatis/type/JdbcType.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@
44
import java.util.*;
55

66
public enum JdbcType {
7-
7+
/**
8+
* This is added to enable basic support for the
9+
* ARRAY data type - but a custom type handler is still required
10+
*/
11+
ARRAY(Types.ARRAY),
812
BIT(Types.BIT),
913
TINYINT(Types.TINYINT),
1014
SMALLINT(Types.SMALLINT),
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.apache.ibatis.submitted.sptests;
2+
3+
import java.sql.Array;
4+
import java.sql.CallableStatement;
5+
import java.sql.PreparedStatement;
6+
import java.sql.ResultSet;
7+
import java.sql.SQLException;
8+
9+
import org.apache.ibatis.type.JdbcType;
10+
import org.apache.ibatis.type.TypeHandler;
11+
12+
public class ArrayTypeHandler implements TypeHandler {
13+
14+
public ArrayTypeHandler() {
15+
super();
16+
}
17+
18+
public void setParameter(PreparedStatement ps, int i, Object parameter,
19+
JdbcType jdbcType) throws SQLException {
20+
ps.setArray(i, (Array) parameter);
21+
}
22+
23+
public Object getResult(ResultSet rs, String columnName)
24+
throws SQLException {
25+
Array array = rs.getArray(columnName);
26+
return array.getArray();
27+
}
28+
29+
public Object getResult(CallableStatement cs, int columnIndex)
30+
throws SQLException {
31+
Array array = cs.getArray(columnIndex);
32+
return array.getArray();
33+
}
34+
}
Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,49 @@
1-
drop procedure sptest.getnames if exists]
2-
drop procedure sptest.getname if exists]
3-
drop procedure sptest.adder if exists]
4-
drop table sptest.names if exists]
5-
drop schema sptest if exists]
1+
drop procedure sptest.getnames if exists
2+
go
63

7-
create schema sptest]
4+
drop procedure sptest.getname if exists
5+
go
6+
7+
drop procedure sptest.adder if exists
8+
go
9+
10+
drop procedure sptest.arraytest if exists
11+
go
12+
13+
drop table sptest.names if exists
14+
go
15+
16+
drop schema sptest if exists
17+
go
18+
19+
create schema sptest
20+
go
821

922
create procedure sptest.adder(in addend1 integer, in addend2 integer, out theSum integer)
1023
begin atomic
1124
set theSum = addend1 + addend2;
12-
end]
25+
end
26+
go
1327

1428
create table sptest.names (
1529
id integer generated by default as identity not null,
1630
first_name varchar(20),
1731
last_name varchar(20),
1832
primary key(id)
19-
)]
33+
)
34+
go
35+
36+
insert into sptest.names (first_name, last_name) values('Fred', 'Flintstone')
37+
go
38+
39+
insert into sptest.names (first_name, last_name) values('Wilma', 'Flintstone')
40+
go
2041

21-
insert into sptest.names (first_name, last_name) values('Fred', 'Flintstone')]
22-
insert into sptest.names (first_name, last_name) values('Wilma', 'Flintstone')]
23-
insert into sptest.names (first_name, last_name) values('Barney', 'Rubble')]
24-
insert into sptest.names (first_name, last_name) values('Betty', 'Rubble')]
42+
insert into sptest.names (first_name, last_name) values('Barney', 'Rubble')
43+
go
44+
45+
insert into sptest.names (first_name, last_name) values('Betty', 'Rubble')
46+
go
2547

2648
-- note that these create procedure statements will fail until hsqldb 2.0.1
2749
create procedure sptest.getname(in nameId integer)
@@ -30,7 +52,8 @@ dynamic result sets 1
3052
BEGIN ATOMIC
3153
declare cur cursor for select * from sptest.names where id = nameId;
3254
open cur;
33-
END]
55+
END
56+
go
3457

3558
create procedure sptest.getnames(in lowestId int, out totalrows integer)
3659
reads sql data
@@ -39,4 +62,16 @@ BEGIN ATOMIC
3962
declare cur cursor for select * from sptest.names where id >= lowestId;
4063
select count(*) into totalrows from sptest.names where id >= lowestId;
4164
open cur;
42-
END]
65+
END
66+
go
67+
68+
create procedure sptest.arraytest(in ids int array, out rowsrequested integer, out returnedids int array)
69+
reads sql data
70+
dynamic result sets 1
71+
begin atomic
72+
declare cur cursor for select * from sptest.names where id in (unnest(ids));
73+
set rowsrequested = cardinality(ids);
74+
set returnedids = array [7, 8, 9, 10];
75+
open cur;
76+
end
77+
go

src/test/java/org/apache/ibatis/submitted/sptests/SPMapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ public interface SPMapper {
88
void adder2(Parameter parameter);
99
Name getName(Integer id);
1010
List<Name> getNames(Map<String, Object> parms);
11+
List<Name> getNamesWithArray(Map<String, Object> parms);
1112
}

src/test/java/org/apache/ibatis/submitted/sptests/SPMapper.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,12 @@
4949
#{lowestId,jdbcType=INTEGER,mode=IN},
5050
#{totalRows,jdbcType=INTEGER,mode=OUT})}
5151
</select>
52+
53+
<select id="getNamesWithArray" parameterType="java.util.Map" statementType="CALLABLE"
54+
resultMap="nameResult">
55+
{call sptest.arraytest(
56+
#{ids,mode=IN,jdbcType=ARRAY,typeHandler=org.apache.ibatis.submitted.sptests.ArrayTypeHandler},
57+
#{requestedRows,jdbcType=INTEGER,mode=OUT},
58+
#{returnedIds,mode=OUT,jdbcType=ARRAY,typeHandler=org.apache.ibatis.submitted.sptests.ArrayTypeHandler})}
59+
</select>
5260
</mapper>

src/test/java/org/apache/ibatis/submitted/sptests/SPTest.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
import static junit.framework.Assert.assertNotNull;
55

66
import java.io.Reader;
7+
import java.sql.Array;
78
import java.sql.Connection;
89
import java.sql.DriverManager;
10+
import java.sql.SQLException;
911
import java.util.HashMap;
1012
import java.util.List;
1113
import java.util.Map;
@@ -34,7 +36,7 @@ public static void initDatabase() throws Exception {
3436
Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/sptests/CreateDB.sql");
3537

3638
ScriptRunner runner = new ScriptRunner(conn);
37-
runner.setDelimiter("]");
39+
runner.setDelimiter("go");
3840
runner.setLogWriter(null);
3941
runner.setErrorLogWriter(null);
4042
runner.runScript(reader);
@@ -288,4 +290,26 @@ public void testCallWithResultSet4() {
288290
sqlSession.close();
289291
}
290292
}
293+
294+
@Test
295+
@Ignore("until hsqldb 2.0.1 is released")
296+
public void testGetNamesWithArray() throws SQLException {
297+
SqlSession sqlSession = sqlSessionFactory.openSession();
298+
try {
299+
SPMapper spMapper = sqlSession.getMapper(SPMapper.class);
300+
301+
Array array = sqlSession.getConnection().createArrayOf("int",
302+
new Integer[] {1, 2, 5});
303+
304+
Map<String, Object> parms = new HashMap<String, Object>();
305+
parms.put("ids", array);
306+
List<Name> names = spMapper.getNamesWithArray(parms);
307+
Object[] returnedIds = (Object[])parms.get("returnedIds");
308+
assertEquals(4, returnedIds.length);
309+
assertEquals(3, parms.get("requestedRows"));
310+
assertEquals(2, names.size());
311+
} finally {
312+
sqlSession.close();
313+
}
314+
}
291315
}

0 commit comments

Comments
 (0)