• 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

  • 相关阅读:
    10.并发包阻塞队列之ArrayBlockingQueue
    【PHP】最详细PHP从入门到精通(三)——PHP中的数组
    新随笔222
    新随笔
    iOS常用加密算法介绍和代码实践
    5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
    Directx11学习笔记【二十】 使用DirectX Tool Kit加载mesh
    什么是Dagger2
    嗯嗯

  • 原文地址:https://www.cnblogs.com/awzf/p/10298870.html
Copyright © 2020-2023  润新知