Skip to content

Commit 39175d6

Browse files
authored
Merge pull request #1437 from harawata/offsettimetypehandler-fix
OffsetTimeTypeHandler should use setObject(), getObject()
2 parents 6267204 + f512467 commit 39175d6

File tree

5 files changed

+54
-28
lines changed

5 files changed

+54
-28
lines changed

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

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2009-2018 the original author or authors.
2+
* Copyright 2009-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,7 +19,6 @@
1919
import java.sql.PreparedStatement;
2020
import java.sql.ResultSet;
2121
import java.sql.SQLException;
22-
import java.sql.Time;
2322
import java.time.OffsetTime;
2423

2524
/**
@@ -31,31 +30,22 @@ public class OffsetTimeTypeHandler extends BaseTypeHandler<OffsetTime> {
3130
@Override
3231
public void setNonNullParameter(PreparedStatement ps, int i, OffsetTime parameter, JdbcType jdbcType)
3332
throws SQLException {
34-
ps.setTime(i, Time.valueOf(parameter.toLocalTime()));
33+
ps.setObject(i, parameter);
3534
}
3635

3736
@Override
3837
public OffsetTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
39-
Time time = rs.getTime(columnName);
40-
return getOffsetTime(time);
38+
return rs.getObject(columnName, OffsetTime.class);
4139
}
4240

4341
@Override
4442
public OffsetTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
45-
Time time = rs.getTime(columnIndex);
46-
return getOffsetTime(time);
43+
return rs.getObject(columnIndex, OffsetTime.class);
4744
}
4845

4946
@Override
5047
public OffsetTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
51-
Time time = cs.getTime(columnIndex);
52-
return getOffsetTime(time);
48+
return cs.getObject(columnIndex, OffsetTime.class);
5349
}
5450

55-
private static OffsetTime getOffsetTime(Time time) {
56-
if (time != null) {
57-
return time.toLocalTime().atOffset(OffsetTime.now().getOffset());
58-
}
59-
return null;
60-
}
6151
}

src/test/java/org/apache/ibatis/submitted/timestamp_with_timezone/Mapper.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@
2020

2121
public interface Mapper {
2222

23-
@Select("select id, odt from records where id = #{id}")
23+
@Select("select id, odt, odt ot from records where id = #{id}")
2424
Record selectById(Integer id);
2525

2626
@Insert("insert into records (id, odt) values (#{id}, #{odt})")
2727
int insertOffsetDateTime(Record record);
2828

29+
@Insert("insert into records (id, odt) values (#{id}, #{ot})")
30+
int insertOffsetTime(Record record);
31+
2932
}

src/test/java/org/apache/ibatis/submitted/timestamp_with_timezone/Record.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@
1616
package org.apache.ibatis.submitted.timestamp_with_timezone;
1717

1818
import java.time.OffsetDateTime;
19+
import java.time.OffsetTime;
1920

2021
public class Record {
2122

2223
private Integer id;
2324

2425
private OffsetDateTime odt;
2526

27+
private OffsetTime ot;
28+
2629
public Integer getId() {
2730
return id;
2831
}
@@ -39,4 +42,12 @@ public void setOdt(OffsetDateTime odt) {
3942
this.odt = odt;
4043
}
4144

45+
public OffsetTime getOt() {
46+
return ot;
47+
}
48+
49+
public void setOt(OffsetTime ot) {
50+
this.ot = ot;
51+
}
52+
4253
}

src/test/java/org/apache/ibatis/submitted/timestamp_with_timezone/TimestampWithTimezoneTypeHandlerTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import java.io.Reader;
2121
import java.time.OffsetDateTime;
22+
import java.time.OffsetTime;
2223
import java.time.ZoneOffset;
2324

2425
import org.apache.ibatis.BaseDataTest;
@@ -27,6 +28,7 @@
2728
import org.apache.ibatis.session.SqlSessionFactory;
2829
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
2930
import org.junit.jupiter.api.BeforeAll;
31+
import org.junit.jupiter.api.Disabled;
3032
import org.junit.jupiter.api.Test;
3133

3234
public class TimestampWithTimezoneTypeHandlerTest {
@@ -50,6 +52,8 @@ public void shouldSelectOffsetDateTime() {
5052
Record record = mapper.selectById(1);
5153
assertEquals(OffsetDateTime.of(2018, 1, 2, 11, 22, 33, 123456000, ZoneOffset.ofHoursMinutes(1, 23)),
5254
record.getOdt());
55+
// HSQLDB 2.4.1 truncates nano seconds.
56+
assertEquals(OffsetTime.of(11, 22, 33, 0, ZoneOffset.ofHoursMinutes(1, 23)), record.getOt());
5357
}
5458
}
5559

@@ -72,4 +76,24 @@ public void shouldInsertOffsetDateTime() {
7276
}
7377
}
7478

79+
@Disabled("HSQLDB 2.4.1 does not support this.")
80+
@Test
81+
public void shouldInsertOffsetTime() {
82+
OffsetTime ot = OffsetTime.of(11, 22, 33, 123456000, ZoneOffset.ofHoursMinutes(1, 23));
83+
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
84+
Mapper mapper = sqlSession.getMapper(Mapper.class);
85+
Record record = new Record();
86+
record.setId(3);
87+
record.setOt(ot);
88+
int result = mapper.insertOffsetTime(record);
89+
assertEquals(1, result);
90+
sqlSession.commit();
91+
}
92+
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
93+
Mapper mapper = sqlSession.getMapper(Mapper.class);
94+
Record record = mapper.selectById(3);
95+
assertEquals(ot, record.getOt());
96+
}
97+
}
98+
7599
}

src/test/java/org/apache/ibatis/type/OffsetTimeTypeHandlerTest.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2009-2018 the original author or authors.
2+
* Copyright 2009-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,69 +18,67 @@
1818
import static org.junit.jupiter.api.Assertions.*;
1919
import static org.mockito.Mockito.*;
2020

21-
import java.sql.Time;
2221
import java.time.OffsetTime;
2322

2423
import org.junit.jupiter.api.Test;
2524

2625
public class OffsetTimeTypeHandlerTest extends BaseTypeHandlerTest {
2726

2827
private static final TypeHandler<OffsetTime> TYPE_HANDLER = new OffsetTimeTypeHandler();
29-
// java.sql.Time doesn't contain millis, so set nano to 0
30-
private static final OffsetTime OFFSET_TIME = OffsetTime.now().withNano(0);
31-
private static final Time TIME = Time.valueOf(OFFSET_TIME.toLocalTime());
28+
29+
private static final OffsetTime OFFSET_TIME = OffsetTime.now();
3230

3331
@Override
3432
@Test
3533
public void shouldSetParameter() throws Exception {
3634
TYPE_HANDLER.setParameter(ps, 1, OFFSET_TIME, null);
37-
verify(ps).setTime(1, TIME);
35+
verify(ps).setObject(1, OFFSET_TIME);
3836
}
3937

4038
@Override
4139
@Test
4240
public void shouldGetResultFromResultSetByName() throws Exception {
43-
when(rs.getTime("column")).thenReturn(TIME);
41+
when(rs.getObject("column", OffsetTime.class)).thenReturn(OFFSET_TIME);
4442
assertEquals(OFFSET_TIME, TYPE_HANDLER.getResult(rs, "column"));
4543
verify(rs, never()).wasNull();
4644
}
4745

4846
@Override
4947
@Test
5048
public void shouldGetResultNullFromResultSetByName() throws Exception {
51-
when(rs.getTime("column")).thenReturn(null);
49+
when(rs.getObject("column", OffsetTime.class)).thenReturn(null);
5250
assertNull(TYPE_HANDLER.getResult(rs, "column"));
5351
verify(rs, never()).wasNull();
5452
}
5553

5654
@Override
5755
@Test
5856
public void shouldGetResultFromResultSetByPosition() throws Exception {
59-
when(rs.getTime(1)).thenReturn(TIME);
57+
when(rs.getObject(1, OffsetTime.class)).thenReturn(OFFSET_TIME);
6058
assertEquals(OFFSET_TIME, TYPE_HANDLER.getResult(rs, 1));
6159
verify(rs, never()).wasNull();
6260
}
6361

6462
@Override
6563
@Test
6664
public void shouldGetResultNullFromResultSetByPosition() throws Exception {
67-
when(rs.getTime(1)).thenReturn(null);
65+
when(rs.getObject(1, OffsetTime.class)).thenReturn(null);
6866
assertNull(TYPE_HANDLER.getResult(rs, 1));
6967
verify(rs, never()).wasNull();
7068
}
7169

7270
@Override
7371
@Test
7472
public void shouldGetResultFromCallableStatement() throws Exception {
75-
when(cs.getTime(1)).thenReturn(TIME);
73+
when(cs.getObject(1, OffsetTime.class)).thenReturn(OFFSET_TIME);
7674
assertEquals(OFFSET_TIME, TYPE_HANDLER.getResult(cs, 1));
7775
verify(cs, never()).wasNull();
7876
}
7977

8078
@Override
8179
@Test
8280
public void shouldGetResultNullFromCallableStatement() throws Exception {
83-
when(cs.getTime(1)).thenReturn(null);
81+
when(cs.getObject(1, OffsetTime.class)).thenReturn(null);
8482
assertNull(TYPE_HANDLER.getResult(cs, 1));
8583
verify(cs, never()).wasNull();
8684
}

0 commit comments

Comments
 (0)