Skip to content

Commit 1e64666

Browse files
committed
optimize TypeHandlerRegistry
1 parent fdbd5e5 commit 1e64666

File tree

1 file changed

+107
-88
lines changed

1 file changed

+107
-88
lines changed

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

+107-88
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
@@ -281,17 +300,15 @@ private Map<JdbcType, TypeHandler<?>> getJdbcHandlerMapForEnumInterfaces(Class<?
281300
for (Class<?> iface : clazz.getInterfaces()) {
282301
Map<JdbcType, TypeHandler<?>> jdbcHandlerMap = typeHandlerMap.get(iface);
283302
if (jdbcHandlerMap == null) {
284-
jdbcHandlerMap = getJdbcHandlerMapForEnumInterfaces(iface, enumClazz);
303+
return getJdbcHandlerMapForEnumInterfaces(iface, enumClazz);
285304
}
286-
if (jdbcHandlerMap != null) {
287-
// Found a type handler registered to a super interface
288-
HashMap<JdbcType, TypeHandler<?>> newMap = new HashMap<>();
289-
for (Entry<JdbcType, TypeHandler<?>> entry : jdbcHandlerMap.entrySet()) {
290-
// Create a type handler instance with enum type as a constructor arg
291-
newMap.put(entry.getKey(), getInstance(enumClazz, entry.getValue().getClass()));
292-
}
293-
return newMap;
305+
// Found a type handler registered to a super interface
306+
HashMap<JdbcType, TypeHandler<?>> newMap = new HashMap<>();
307+
for (Entry<JdbcType, TypeHandler<?>> entry : jdbcHandlerMap.entrySet()) {
308+
// Create a type handler instance with enum type as a constructor arg
309+
newMap.put(entry.getKey(), getInstance(enumClazz, entry.getValue().getClass()));
294310
}
311+
return newMap;
295312
}
296313
return null;
297314
}
@@ -345,18 +362,20 @@ public <T> void register(TypeHandler<T> typeHandler) {
345362
mappedTypeFound = true;
346363
}
347364
}
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-
}
358365
if (!mappedTypeFound) {
359-
register((Class<T>) null, typeHandler);
366+
// @since 3.1.0 - try to auto-discover the mapped type
367+
if (typeHandler instanceof TypeReference) {
368+
try {
369+
TypeReference<T> typeReference = (TypeReference<T>) typeHandler;
370+
register(typeReference.getRawType(), typeHandler);
371+
mappedTypeFound = true;
372+
} catch (Throwable t) {
373+
// maybe users define the TypeReference with a different type and are not assignable, so just ignore it
374+
}
375+
}
376+
if (!mappedTypeFound) {
377+
register((Class<T>) null, typeHandler);
378+
}
360379
}
361380
}
362381

0 commit comments

Comments
 (0)