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

摘要:
类的完全限定名需要写入mybatis的xml文件中,这很麻烦。您可以配置自动扫描包路径以配置类的别名。有两种配置方法。

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();
        }
    }    
}

免责声明:文章转载自《配置typeAliasesPackage支持通配符包路径扫描》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Salesforce中Managed Package的使用论文笔记:(2021CVPR)PAConv: Position Adaptive Convolution with Dynamic Kernel Assembling on Point Clouds下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL 通配符学习小结

MySQL 通配符 SQL的模式匹配同意你使用“_”匹配不论什么单个字符,而“%”匹配随意数目字符(包含零个字符)。在 MySQL中,SQL的模式缺省是忽略大写和小写的。以下显示一些样例。 注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比較操作符。 为了找出以“b”开头的名字: mysql>...

11-linux基础八-正则表达式

1. 正则表达式的概念及特点:   正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。规定一些特殊语法表示字符类、数量限定符和位置关系,然后用这些特殊语法和普通字符一起表示一个模式,这就是正则表达式(Regular Expression)。...

MySQL快速回顾:高级查询操作

8.1 排序数据 检索出的数据并不是以纯粹的随机顺序显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响。因此,如果不明确控制的话,不能依赖该排序顺序。 关系数据库设计理论认为,如果不明确规定排序顺序,则不应该假定检索出的数据的顺序...

通配符的匹配很全面, 但无法找到元素 'context:component-scan' 的声明

一. 异常描述在配置SpringMVC的时候,spring.xml文件中配置了<context:component-scan/>,结果提示如下异常: Caused by: org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 71; cvc-complex-type.2.4.c:...

查找文件命令

查找文件命令 学习目标 能够说出查找文件使用的命令 1. find命令及选项的使用 命令 说明 find 在指定目录下查找文件(包括目录) find命令选项: 选项 说明 -name 根据文件名(包括目录名)字查找 find命令及选项的效果图: 2. find命令结合通配符的使用 通配符: 是一种特殊语句,主要有星号(*)和问号...

使用shiro路径通配符配置访问权限

简述: shiro框架通过拦截功能来实现对用户访问权限的控制和拦截,shiro里面支持Ant风格的通配符。 ?:匹配任意的一个字符,例如:"/admin?"可以匹配“/admin1”,"/admin2"。 *:匹配一个或者多个任意的字符。 **:匹配零个或者多个目录。 设置路径通配符: [main] #如果现在认证失败,则跳转到loginUrl配置的路径...