我们知道,可以通过mybatis-config.xml配置typehandlers来实现自定义数据类型转换,尤其是枚举类型是最常见的,然而如果项目越来越大,枚举类型越来越多,一行行配置typehandler势必是很恼人的,网上查阅了大神的一种方案,修改mybatis源码(http://blog.csdn.net/fighterandknight/article/details/51600997),然而最新版的源码在本地无论如何都无法打包,很是恼火,索性放弃了这种方案,改为通过SqlSessionFactory自己注册typehandler
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource(
// 扫描mybatis的配置文件
"mybatis-config.xml"));
org.springframework.core.io.Resource[] mapperResources = new PathMatchingResourcePatternResolver()
// 扫描mapper
.getResources("classpath*:/mapper/*.xml");
sqlSessionFactoryBean.setMapperLocations(mapperResources);
sqlSessionFactoryBean.setTypeAliasesPackage("classpath*:/com/tongzhi/server/mapper/*");
ResolverUtil<Class<?>> resolverUtil = new ResolverUtil<Class<?>>();
resolverUtil.find(new ResolverUtil.IsA(BaseEnum.class), "com.tongzhi.server.common.enums");
Set<Class<? extends Class<?>>> handlerSet = resolverUtil.getClasses();
for (Class<?> clazz : handlerSet) {
if (BaseEnum.class.isAssignableFrom(clazz) && !BaseEnum.class.equals(clazz)) {
sqlSessionFactoryBean.getObject().getConfiguration().getTypeHandlerRegistry().register(clazz, EnumTypeHandler.class);
}
}
return sqlSessionFactoryBean.getObject();
}