MyBatis怎么配置多个别名typeAliasesPackage

MyBatis怎么配置多个别名typeAliasesPackage

本文小编为大家详细介绍“MyBatis怎么配置多个别名typeAliasesPackage”,内容详细,步骤清晰,细节处理妥当,希望这篇“MyBatis怎么配置多个别名typeAliasesPackage”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

配置多个别名 typeAliasesPackage

<propertyname="typeAliasesPackage"value="com.ivan.edu.model,com.ivan.edu.vo"></property>

只需要用逗号“,”隔开就行,当然上面是以 XML 为例,YML 或 Properties 文件配置同理可得~

MyBatis怎么配置多个别名typeAliasesPackage

设置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”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注恰卡编程网行业资讯频道。

发布于 2022-01-17 22:03:07
收藏
分享
海报
0 条评论
46
上一篇:SQL基础查询和LINQ集成化查询是怎样的 下一篇:Python基于决策树算法的分类预测怎么实现
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码