Skip to content

Commit c15b066

Browse files
committed
optimize TypeHandlerRegistry
1 parent fdbd5e5 commit c15b066

File tree

1 file changed

+104
-82
lines changed

1 file changed

+104
-82
lines changed

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

Lines changed: 104 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -81,82 +81,100 @@ public TypeHandlerRegistry() {
8181
public TypeHandlerRegistry(Configuration configuration) {
8282
this.unknownTypeHandler = new UnknownTypeHandler(configuration);
8383

84-
register(Boolean.class, new BooleanTypeHandler());
85-
register(boolean.class, new BooleanTypeHandler());
86-
register(JdbcType.BOOLEAN, new BooleanTypeHandler());
87-
register(JdbcType.BIT, new BooleanTypeHandler());
88-
89-
register(Byte.class, new ByteTypeHandler());
90-
register(byte.class, new ByteTypeHandler());
91-
register(JdbcType.TINYINT, new ByteTypeHandler());
92-
93-
register(Short.class, new ShortTypeHandler());
94-
register(short.class, new ShortTypeHandler());
95-
register(JdbcType.SMALLINT, new ShortTypeHandler());
96-
97-
register(Integer.class, new IntegerTypeHandler());
98-
register(int.class, new IntegerTypeHandler());
99-
register(JdbcType.INTEGER, new IntegerTypeHandler());
100-
101-
register(Long.class, new LongTypeHandler());
102-
register(long.class, new LongTypeHandler());
103-
104-
register(Float.class, new FloatTypeHandler());
105-
register(float.class, new FloatTypeHandler());
106-
register(JdbcType.FLOAT, new FloatTypeHandler());
107-
108-
register(Double.class, new DoubleTypeHandler());
109-
register(double.class, new DoubleTypeHandler());
110-
register(JdbcType.DOUBLE, new DoubleTypeHandler());
84+
BooleanTypeHandler booleanTypeHandler = new BooleanTypeHandler();
85+
register(Boolean.class, booleanTypeHandler);
86+
register(boolean.class, booleanTypeHandler);
87+
register(JdbcType.BOOLEAN, booleanTypeHandler);
88+
register(JdbcType.BIT, booleanTypeHandler);
89+
90+
ByteTypeHandler byteTypeHandler = new ByteTypeHandler();
91+
register(Byte.class, byteTypeHandler);
92+
register(byte.class, byteTypeHandler);
93+
register(JdbcType.TINYINT, byteTypeHandler);
94+
95+
ShortTypeHandler shortTypeHandler = new ShortTypeHandler();
96+
register(Short.class, shortTypeHandler);
97+
register(short.class, shortTypeHandler);
98+
register(JdbcType.SMALLINT, shortTypeHandler);
99+
100+
IntegerTypeHandler integerTypeHandler = new IntegerTypeHandler();
101+
register(Integer.class, integerTypeHandler);
102+
register(int.class, integerTypeHandler);
103+
register(JdbcType.INTEGER, integerTypeHandler);
104+
105+
LongTypeHandler longTypeHandler = new LongTypeHandler();
106+
register(Long.class, longTypeHandler);
107+
register(long.class, longTypeHandler);
108+
109+
FloatTypeHandler floatTypeHandler = new FloatTypeHandler();
110+
register(Float.class, floatTypeHandler);
111+
register(float.class, floatTypeHandler);
112+
register(JdbcType.FLOAT, floatTypeHandler);
113+
114+
DoubleTypeHandler doubleTypeHandler = new DoubleTypeHandler();
115+
register(Double.class, doubleTypeHandler);
116+
register(double.class, doubleTypeHandler);
117+
register(JdbcType.DOUBLE, doubleTypeHandler);
111118

112119
register(Reader.class, new ClobReaderTypeHandler());
113-
register(String.class, new StringTypeHandler());
114-
register(String.class, JdbcType.CHAR, new StringTypeHandler());
115-
register(String.class, JdbcType.CLOB, new ClobTypeHandler());
116-
register(String.class, JdbcType.VARCHAR, new StringTypeHandler());
117-
register(String.class, JdbcType.LONGVARCHAR, new StringTypeHandler());
118-
register(String.class, JdbcType.NVARCHAR, new NStringTypeHandler());
119-
register(String.class, JdbcType.NCHAR, new NStringTypeHandler());
120-
register(String.class, JdbcType.NCLOB, new NClobTypeHandler());
121-
register(JdbcType.CHAR, new StringTypeHandler());
122-
register(JdbcType.VARCHAR, new StringTypeHandler());
123-
register(JdbcType.CLOB, new ClobTypeHandler());
124-
register(JdbcType.LONGVARCHAR, new StringTypeHandler());
125-
register(JdbcType.NVARCHAR, new NStringTypeHandler());
126-
register(JdbcType.NCHAR, new NStringTypeHandler());
127-
register(JdbcType.NCLOB, new NClobTypeHandler());
128-
129-
register(Object.class, JdbcType.ARRAY, new ArrayTypeHandler());
130-
register(JdbcType.ARRAY, new ArrayTypeHandler());
120+
StringTypeHandler stringTypeHandler = new StringTypeHandler();
121+
register(String.class, stringTypeHandler);
122+
register(String.class, JdbcType.CHAR, stringTypeHandler);
123+
ClobTypeHandler clobTypeHandler = new ClobTypeHandler();
124+
register(String.class, JdbcType.CLOB, clobTypeHandler);
125+
register(String.class, JdbcType.VARCHAR, stringTypeHandler);
126+
register(String.class, JdbcType.LONGVARCHAR, stringTypeHandler);
127+
NStringTypeHandler nStringTypeHandler = new NStringTypeHandler();
128+
register(String.class, JdbcType.NVARCHAR, nStringTypeHandler);
129+
register(String.class, JdbcType.NCHAR, nStringTypeHandler);
130+
NClobTypeHandler nClobTypeHandler = new NClobTypeHandler();
131+
register(String.class, JdbcType.NCLOB, nClobTypeHandler);
132+
register(JdbcType.CHAR, stringTypeHandler);
133+
register(JdbcType.VARCHAR, stringTypeHandler);
134+
register(JdbcType.CLOB, clobTypeHandler);
135+
register(JdbcType.LONGVARCHAR, stringTypeHandler);
136+
register(JdbcType.NVARCHAR, nStringTypeHandler);
137+
register(JdbcType.NCHAR, nStringTypeHandler);
138+
register(JdbcType.NCLOB, nClobTypeHandler);
139+
140+
ArrayTypeHandler arrayTypeHandler = new ArrayTypeHandler();
141+
register(Object.class, JdbcType.ARRAY, arrayTypeHandler);
142+
register(JdbcType.ARRAY, arrayTypeHandler);
131143

132144
register(BigInteger.class, new BigIntegerTypeHandler());
133-
register(JdbcType.BIGINT, new LongTypeHandler());
145+
register(JdbcType.BIGINT, longTypeHandler);
134146

135-
register(BigDecimal.class, new BigDecimalTypeHandler());
136-
register(JdbcType.REAL, new BigDecimalTypeHandler());
137-
register(JdbcType.DECIMAL, new BigDecimalTypeHandler());
138-
register(JdbcType.NUMERIC, new BigDecimalTypeHandler());
147+
BigDecimalTypeHandler bigDecimalTypeHandler = new BigDecimalTypeHandler();
148+
register(BigDecimal.class, bigDecimalTypeHandler);
149+
register(JdbcType.REAL, bigDecimalTypeHandler);
150+
register(JdbcType.DECIMAL, bigDecimalTypeHandler);
151+
register(JdbcType.NUMERIC, bigDecimalTypeHandler);
139152

140153
register(InputStream.class, new BlobInputStreamTypeHandler());
141154
register(Byte[].class, new ByteObjectArrayTypeHandler());
142-
register(Byte[].class, JdbcType.BLOB, new BlobByteObjectArrayTypeHandler());
143-
register(Byte[].class, JdbcType.LONGVARBINARY, new BlobByteObjectArrayTypeHandler());
155+
BlobByteObjectArrayTypeHandler blobByteObjectArrayTypeHandler = new BlobByteObjectArrayTypeHandler();
156+
register(Byte[].class, JdbcType.BLOB, blobByteObjectArrayTypeHandler);
157+
register(Byte[].class, JdbcType.LONGVARBINARY, blobByteObjectArrayTypeHandler);
144158
register(byte[].class, new ByteArrayTypeHandler());
145-
register(byte[].class, JdbcType.BLOB, new BlobTypeHandler());
146-
register(byte[].class, JdbcType.LONGVARBINARY, new BlobTypeHandler());
147-
register(JdbcType.LONGVARBINARY, new BlobTypeHandler());
148-
register(JdbcType.BLOB, new BlobTypeHandler());
159+
BlobTypeHandler blobTypeHandler = new BlobTypeHandler();
160+
register(byte[].class, JdbcType.BLOB, blobTypeHandler);
161+
register(byte[].class, JdbcType.LONGVARBINARY, blobTypeHandler);
162+
register(JdbcType.LONGVARBINARY, blobTypeHandler);
163+
register(JdbcType.BLOB, blobTypeHandler);
149164

150165
register(Object.class, unknownTypeHandler);
151166
register(Object.class, JdbcType.OTHER, unknownTypeHandler);
152167
register(JdbcType.OTHER, unknownTypeHandler);
153168

154-
register(Date.class, new DateTypeHandler());
155-
register(Date.class, JdbcType.DATE, new DateOnlyTypeHandler());
156-
register(Date.class, JdbcType.TIME, new TimeOnlyTypeHandler());
157-
register(JdbcType.TIMESTAMP, new DateTypeHandler());
158-
register(JdbcType.DATE, new DateOnlyTypeHandler());
159-
register(JdbcType.TIME, new TimeOnlyTypeHandler());
169+
DateTypeHandler dateTypeHandler = new DateTypeHandler();
170+
register(Date.class, dateTypeHandler);
171+
DateOnlyTypeHandler dateOnlyTypeHandler = new DateOnlyTypeHandler();
172+
register(Date.class, JdbcType.DATE, dateOnlyTypeHandler);
173+
TimeOnlyTypeHandler timeOnlyTypeHandler = new TimeOnlyTypeHandler();
174+
register(Date.class, JdbcType.TIME, timeOnlyTypeHandler);
175+
register(JdbcType.TIMESTAMP, dateTypeHandler);
176+
register(JdbcType.DATE, dateOnlyTypeHandler);
177+
register(JdbcType.TIME, timeOnlyTypeHandler);
160178

161179
register(java.sql.Date.class, new SqlDateTypeHandler());
162180
register(java.sql.Time.class, new SqlTimeTypeHandler());
@@ -177,8 +195,9 @@ public TypeHandlerRegistry(Configuration configuration) {
177195
register(JapaneseDate.class, new JapaneseDateTypeHandler());
178196

179197
// issue #273
180-
register(Character.class, new CharacterTypeHandler());
181-
register(char.class, new CharacterTypeHandler());
198+
CharacterTypeHandler characterTypeHandler = new CharacterTypeHandler();
199+
register(Character.class, characterTypeHandler);
200+
register(char.class, characterTypeHandler);
182201
}
183202

184203
/**
@@ -245,10 +264,10 @@ private <T> TypeHandler<T> getTypeHandler(Type type, JdbcType jdbcType) {
245264
handler = jdbcHandlerMap.get(jdbcType);
246265
if (handler == null) {
247266
handler = jdbcHandlerMap.get(null);
248-
}
249-
if (handler == null) {
250-
// #591
251-
handler = pickSoleHandler(jdbcHandlerMap);
267+
if (handler == null) {
268+
// #591
269+
handler = pickSoleHandler(jdbcHandlerMap);
270+
}
252271
}
253272
}
254273
// type drives generics here
@@ -280,9 +299,6 @@ private Map<JdbcType, TypeHandler<?>> getJdbcHandlerMap(Type type) {
280299
private Map<JdbcType, TypeHandler<?>> getJdbcHandlerMapForEnumInterfaces(Class<?> clazz, Class<?> enumClazz) {
281300
for (Class<?> iface : clazz.getInterfaces()) {
282301
Map<JdbcType, TypeHandler<?>> jdbcHandlerMap = typeHandlerMap.get(iface);
283-
if (jdbcHandlerMap == null) {
284-
jdbcHandlerMap = getJdbcHandlerMapForEnumInterfaces(iface, enumClazz);
285-
}
286302
if (jdbcHandlerMap != null) {
287303
// Found a type handler registered to a super interface
288304
HashMap<JdbcType, TypeHandler<?>> newMap = new HashMap<>();
@@ -292,6 +308,10 @@ private Map<JdbcType, TypeHandler<?>> getJdbcHandlerMapForEnumInterfaces(Class<?
292308
}
293309
return newMap;
294310
}
311+
jdbcHandlerMap = getJdbcHandlerMapForEnumInterfaces(iface, enumClazz);
312+
if (jdbcHandlerMap != null) {
313+
return jdbcHandlerMap;
314+
}
295315
}
296316
return null;
297317
}
@@ -345,18 +365,20 @@ public <T> void register(TypeHandler<T> typeHandler) {
345365
mappedTypeFound = true;
346366
}
347367
}
348-
// @since 3.1.0 - try to auto-discover the mapped type
349-
if (!mappedTypeFound && typeHandler instanceof TypeReference) {
350-
try {
351-
TypeReference<T> typeReference = (TypeReference<T>) typeHandler;
352-
register(typeReference.getRawType(), typeHandler);
353-
mappedTypeFound = true;
354-
} catch (Throwable t) {
355-
// maybe users define the TypeReference with a different type and are not assignable, so just ignore it
356-
}
357-
}
358368
if (!mappedTypeFound) {
359-
register((Class<T>) null, typeHandler);
369+
// @since 3.1.0 - try to auto-discover the mapped type
370+
if (typeHandler instanceof TypeReference) {
371+
try {
372+
TypeReference<T> typeReference = (TypeReference<T>) typeHandler;
373+
register(typeReference.getRawType(), typeHandler);
374+
mappedTypeFound = true;
375+
} catch (Throwable t) {
376+
// maybe users define the TypeReference with a different type and are not assignable, so just ignore it
377+
}
378+
}
379+
if (!mappedTypeFound) {
380+
register((Class<T>) null, typeHandler);
381+
}
360382
}
361383
}
362384

0 commit comments

Comments
 (0)