Mybatis 不支持通配符掃包起別名問題


typeAliasesPackage 默認只能掃描某一個路徑下,或以逗號等分割的 幾個路徑下的內容,不支持通配符和正則,采用重寫的方式解決

 

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日
*/

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配置:黃色為修改前關鍵部分

<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/52193882


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM