• 配置typeAliasesPackage支持通配符包路径扫描


    mybatis的xml文件中需要写类的全限定名,较繁琐,可以配置自动扫描包路径给类配置别名,两种配置方式。

    方式一:

    mybatis-config.xml中配置

    <typeAliases>
      <package name="com.xiaomu.context.config.model"/>
    </typeAliases>

    此配置不支持多路径配置,不支持通配符配置,不灵活(个人实验不行)

    方式二:

    SqlSessionFactory中配置typeAliasesPackage属性

    <bean id="mybatisSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="typeAliasesPackage" value="com.xiaomu.content.model,com.test.model"/>
        <property name="mapperLocations">
            <list>
                <value>classpath*:sql/**/*.xml</value>
            </list>
        </property>
    </bean>

    此种方式支持多路径,逗号隔开,但是若有新路径新增需要再次配置,不知情情况下容易疏漏,最好是通配符配置,目前不支持,可通过继承重写包路径读取方式来实现支持通配符配置
    配置如下:

    <bean id="mybatisSqlSessionFactory" class="com.xiaomu.jdbc.util.PackagesSqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="typeAliasesPackage" value="com.xiaomu.**.model"/>
        <property name="mapperLocations">
            <list>
                <value>classpath*:sql/**/*.xml</value>
            </list>
        </property>
    </bean>

    java实现类代码:

    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.commons.lang3.StringUtils;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    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;
    
    public class PackagesSqlSessionFactoryBean extends SqlSessionFactoryBean {
    
        private static final Logger logger = LoggerFactory.getLogger(PackagesSqlSessionFactoryBean.class);
        
        static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
        
        @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+",未找到任何包");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }    
    }
  • 相关阅读:
    尾递归
    gcc/g++ 命令
    GCC输出带C源代码的汇编文件
    linux下Ctrl命令组合
    静态链接库(lib)、动态链接库(dll)与动态链接库的导入库(lib)
    VS2010-MFC(菜单:菜单及CMenu类的使用)
    VS2010-MFC(菜单:VS2010菜单资源详解)
    VS2010-MFC(常用控件:标签控件Tab Control 下)
    VS2010-MFC(常用控件:标签控件Tab Control 上)
    VS2010-MFC(常用控件:树形控件Tree Control 下)
  • 原文地址:https://www.cnblogs.com/leskang/p/9776465.html
Copyright © 2020-2023  润新知