typeAliasesPackage 默認只能掃描某一個路徑下,或以逗號等分割的 幾個路徑下的內容,不支持通配符和正則,採用重寫的方式解決java
package com.xxxx.xxx.util.common; import com.xxxx.xxx.util.LogUtil; import org.apache.commons.lang3.StringUtils; //注意:不必定非得是lang3包 lang包也能夠 import org.mybatis.spring.SqlSessionFactoryBean; import org.slf4j.Logger; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.core.type.classreading.CachingMetadataReaderFactory; import org.springframework.core.type.classreading.MetadataReader; import org.springframework.core.type.classreading.MetadataReaderFactory; import org.springframework.util.ClassUtils; import java.io.IOException; import java.util.ArrayList; import java.util.List;
/**
* @ClassName: PackagesSqlSessionFactoryBean
* @Description: mybatis自動掃描別名路徑(新增通配符匹配功能)
* @author wzf
* @date 2019年1月21日
*/ spring
public class PackagesSqlSessionFactoryBean extends SqlSessionFactoryBean { // org.mybatis.spring包中的類 static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; private static Logger logger = LogUtil.get(); @Override public void setTypeAliasesPackage(String typeAliasesPackage) { ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver(); MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver); typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/" + DEFAULT_RESOURCE_PATTERN; //將加載多個絕對匹配的全部Resource //將首先經過ClassLoader.getResource("META-INF")加載非模式路徑部分 //而後進行遍歷模式匹配 try { List<String> result = new ArrayList<String>(); Resource[] resources = resolver.getResources(typeAliasesPackage); if(resources != null && resources.length > 0){ MetadataReader metadataReader = null; for(Resource resource : resources){ if(resource.isReadable()){ metadataReader = metadataReaderFactory.getMetadataReader(resource); try { result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } } if(result.size() > 0) { super.setTypeAliasesPackage(StringUtils.join(result.toArray(), ",")); }else{ logger.warn("參數typeAliasesPackage:"+typeAliasesPackage+",未找到任何包"); } //logger.info("d"); } catch (IOException e) { e.printStackTrace(); } } }
而後在spring-mybatis的配置文件中修改
改造前:spring-mybatis.xml配置:綠色爲修改前關鍵部分
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:/SqlMapConfig.xml"></property> <property name="mapperLocations" value="classpath*:/sqlmaps/**/*-sql.xml"></property> <property name="typeAliasesPackage" value="com.demo.domain" /> </bean>
改造後:spring-mybatis.xml配置:黃色爲修改前關鍵部分sql
<bean id="sqlSessionFactory" class="com.demo.core.mybatis.PackagesSqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:/SqlMapConfig.xml"></property> <property name="mapperLocations" value="classpath*:/sqlmaps/**/*-sql.xml"></property>
<!--默認別名爲對應報下的類名首字母小寫 如需自定義可用註解:@Alias("別名") [必須在對應包歷使用註解才生效]-->
<property name="typeAliasesPackage" value="com.demo.**.domain" />
</bean>
參考自:https://blog.csdn.net/bian1729183741/article/details/52193882apache