MyBatis怎么配置多个别名typeAliasesPackage
MyBatis怎么配置多个别名typeAliasesPackage
本文小编为大家详细介绍“MyBatis怎么配置多个别名typeAliasesPackage”,内容详细,步骤清晰,细节处理妥当,希望这篇“MyBatis怎么配置多个别名typeAliasesPackage”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
配置多个别名 typeAliasesPackage
<propertyname="typeAliasesPackage"value="com.ivan.edu.model,com.ivan.edu.vo"></property>
只需要用逗号“,”隔开就行,当然上面是以 XML 为例,YML 或 Properties 文件配置同理可得~
设置typeAliasesPackage支持**通配符匹配
mybatis的typeAliasesPackage属性的作用是,搜索指定包别名。
配置了以后xml文件中的resultType和parameterType就不需要指定全类名com.example.system.domain.SysUser,我们只需要写SysUser,会到我们配置的typeAliasesPackage包下搜索。
转到MybatisProperties文件中,发现typeAliasesPackage是String类型。
@ConfigurationProperties(prefix=MybatisProperties.MYBATIS_PREFIX)publicclassMybatisProperties{/***Packagestosearchtypealiases.(Packagedelimitersare",;\t\n")*/privateStringtypeAliasesPackage;
如果有多个包的话,只能以逗号分隔的形式赋值,如下:
mybatis:typeAliasesPackage:com.example.system.domain,com.example.common.domain
秉着“不想多敲一点代码”的做法,
我不想每次多一个包,就在typeAliasesPackage后面多加一个包名,
我想要的是可不可以配置一个通配符,就算加再多的包,也不用重新给typeAliasesPackage赋值。
mybatis:#规则是,新加的包的名字必须是com.example.xxx.domaintypeAliasesPackage:com.example.**.domain
如果想要实现上述想法,我们需要自定义SqlSessionFactory,以代码的方式找到匹配com.example.**.domain的所有包名,然后赋值给typeAliasesPackage。
代码实现方式如下:
importjava.io.IOException;importjava.util.ArrayList;importjava.util.HashSet;importjava.util.List;importjavax.sql.DataSource;importorg.apache.ibatis.io.VFS;importorg.apache.ibatis.session.SqlSessionFactory;importorg.mybatis.spring.SqlSessionFactoryBean;importorg.mybatis.spring.boot.autoconfigure.SpringBootVFS;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.core.env.Environment;importorg.springframework.core.io.DefaultResourceLoader;importorg.springframework.core.io.Resource;importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;importorg.springframework.core.io.support.ResourcePatternResolver;importorg.springframework.core.type.classreading.CachingMetadataReaderFactory;importorg.springframework.core.type.classreading.MetadataReader;importorg.springframework.core.type.classreading.MetadataReaderFactory;importorg.springframework.util.ClassUtils;/***Mybatis支持*匹配扫描包**@authorruoyi*/@ConfigurationpublicclassMyBatisConfig{@AutowiredprivateEnvironmentenv;staticfinalStringDEFAULT_RESOURCE_PATTERN="**/*.class";/***自定义typeAliasesPackage*在application.yml中typeAliasesPackage的值等于com.ruoyi.**.domain*但是mybatis是无法识别**通配符的*需要我们自己实现通过**通配符匹配到所有的domain包**@paramtypeAliasesPackage*@return*/publicstaticStringsetTypeAliasesPackage(StringtypeAliasesPackage){ResourcePatternResolverresolver=(ResourcePatternResolver)newPathMatchingResourcePatternResolver();MetadataReaderFactorymetadataReaderFactory=newCachingMetadataReaderFactory(resolver);List<String>allResult=newArrayList<String>();try{for(StringaliasesPackage:typeAliasesPackage.split(",")){List<String>result=newArrayList<String>();aliasesPackage=ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX+ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim())+"/"+DEFAULT_RESOURCE_PATTERN;Resource[]resources=resolver.getResources(aliasesPackage);if(resources!=null&&resources.length>0){MetadataReadermetadataReader=null;for(Resourceresource:resources){if(resource.isReadable()){metadataReader=metadataReaderFactory.getMetadataReader(resource);try{result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());}catch(ClassNotFoundExceptione){e.printStackTrace();}}}}if(result.size()>0){HashSet<String>hashResult=newHashSet<String>(result);allResult.addAll(hashResult);}}if(allResult.size()>0){typeAliasesPackage=String.join(",",(String[])allResult.toArray(newString[0]));}else{thrownewRuntimeException("mybatistypeAliasesPackage路径扫描错误,参数typeAliasesPackage:"+typeAliasesPackage+"未找到任何包");}}catch(IOExceptione){e.printStackTrace();}returntypeAliasesPackage;}@BeanpublicSqlSessionFactorysqlSessionFactory(DataSourcedataSource)throwsException{//获取配置文件中定义的mybatis.typeAliasesPackage的值StringtypeAliasesPackage=env.getProperty("mybatis.typeAliasesPackage");//获取配置文件中定义的mybatis.mapperLocations的值StringmapperLocations=env.getProperty("mybatis.mapperLocations");//获取配置文件中定义的mybatis.configLocation的值StringconfigLocation=env.getProperty("mybatis.configLocation");typeAliasesPackage=setTypeAliasesPackage(typeAliasesPackage);VFS.addImplClass(SpringBootVFS.class);finalSqlSessionFactoryBeansessionFactory=newSqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);sessionFactory.setTypeAliasesPackage(typeAliasesPackage);//在所有jar包的classpath下查找所有以Mapper.xml结尾的xml文件sessionFactory.setMapperLocations(newPathMatchingResourcePatternResolver().getResources(mapperLocations));sessionFactory.setConfigLocation(newDefaultResourceLoader().getResource(configLocation));returnsessionFactory.getObject();}}
读到这里,这篇“MyBatis怎么配置多个别名typeAliasesPackage”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
mybatis如何编写一个自定义插件(mybatis plus优点)
mybatisplus优点?Mybatis-Plus是一个Mybatis的增强工具,只是在Mybatis的基础上做了增强却不做改...
-
MyBatis和jeesite多表查询的方法
MyBatis和jeesite多表查询的方法这篇文章主要介绍了My...
-
Mybatis怎么实现ResultMap结果集
-
SpringBoot MyBatis怎么快速入门
-
怎么用springboot+mybatis plus实现树形结构查询
怎么用springboot+mybatisplus实现树形结构查询...
-
springboot中怎么实现mybatis多数据源动态切换
springboot中怎么实现mybatis多数据源动态切换这篇“...
-
基于SpringBoot加载Mybatis的TypeAlias问题怎么解决
基于SpringBoot加载Mybatis的TypeAlias问题怎么解决...
-
怎么用Springboot+mybatis-plus+注解实现数据权限隔离
怎么用Springboot+mybatis-plus+注解实现数据权限隔离...
-
Springboot+Mybatis中怎么实现typeAliasesPackage正则扫描
Springboot+Mybatis中怎么实现typeAliasesPackage正则扫描...
-
springBoot mybatis包扫描问题怎么解决
springBootmybatis包扫描问题怎么解决这篇文章主要...