千家信息网

MyBatis怎么配置多个别名typeAliasesPackage

发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,本文小编为大家详细介绍"MyBatis怎么配置多个别名typeAliasesPackage",内容详细,步骤清晰,细节处理妥当,希望这篇"MyBatis怎么配置多个别名typeAliasesPacka
千家信息网最后更新 2024年11月20日MyBatis怎么配置多个别名typeAliasesPackage

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

配置多个别名 typeAliasesPackage

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

设置typeAliasesPackage支持**通配符匹配

mybatis的typeAliasesPackage属性的作用是,搜索指定包别名。

配置了以后xml文件中的resultType和parameterType就不需要指定全类名com.example.system.domain.SysUser,我们只需要写SysUser,会到我们配置的typeAliasesPackage包下搜索。

转到MybatisProperties文件中,发现typeAliasesPackage是String类型。

@ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)public class MybatisProperties {    /**   * Packages to search type aliases. (Package delimiters are ",; \t\n")   */  private String typeAliasesPackage;

如果有多个包的话,只能以逗号分隔的形式赋值,如下:

mybatis:    typeAliasesPackage: com.example.system.domain,com.example.common.domain

秉着"不想多敲一点代码"的做法,

我不想每次多一个包,就在typeAliasesPackage后面多加一个包名,

我想要的是可不可以配置一个通配符,就算加再多的包,也不用重新给typeAliasesPackage赋值。

mybatis:    # 规则是,新加的包的名字必须是 com.example.xxx.domain    typeAliasesPackage: com.example.**.domain

如果想要实现上述想法,我们需要自定义SqlSessionFactory,以代码的方式找到匹配com.example.**.domain的所有包名,然后赋值给typeAliasesPackage。

代码实现方式如下:

import java.io.IOException;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import javax.sql.DataSource;import org.apache.ibatis.io.VFS;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.env.Environment;import org.springframework.core.io.DefaultResourceLoader;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;/** * Mybatis支持*匹配扫描包 * * @author ruoyi */@Configurationpublic class MyBatisConfig {    @Autowired    private Environment env;    static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";    /**     * 自定义typeAliasesPackage     * 在application.yml中typeAliasesPackage的值等于com.ruoyi.**.domain     * 但是mybatis是无法识别**通配符的     * 需要我们自己实现通过**通配符匹配到所有的domain包     *     * @param typeAliasesPackage     * @return     */    public static String setTypeAliasesPackage(String typeAliasesPackage) {        ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);        List allResult = new ArrayList();        try {            for (String aliasesPackage : typeAliasesPackage.split(",")) {                List result = new ArrayList();                aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX                        + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;                Resource[] resources = resolver.getResources(aliasesPackage);                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) {                    HashSet hashResult = new HashSet(result);                    allResult.addAll(hashResult);                }            }            if (allResult.size() > 0) {                typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0]));            } else {                throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");            }        } catch (IOException e) {            e.printStackTrace();        }        return typeAliasesPackage;    }    @Bean    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {        // 获取配置文件中定义的 mybatis.typeAliasesPackage 的值        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");        // 获取配置文件中定义的 mybatis.mapperLocations 的值        String mapperLocations = env.getProperty("mybatis.mapperLocations");        // 获取配置文件中定义的 mybatis.configLocation 的值        String configLocation = env.getProperty("mybatis.configLocation");        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);        VFS.addImplClass(SpringBootVFS.class);        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();        sessionFactory.setDataSource(dataSource);        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);        // 在所有jar包的classpath下查找所有以Mapper.xml结尾的xml文件        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));        return sessionFactory.getObject();    }}

读到这里,这篇"MyBatis怎么配置多个别名typeAliasesPackage"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

配置 文件 别名 多个 通配符 代码 文章 内容 方式 逗号 搜索 支持 妥当 可不 不用 作用 做法 参数 名字 属性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 ms软件开发工程师 无限法则怎么找到连接到服务器 江苏正规服务器生产商虚拟主机 香港网络安全局 丰台区一站式网络技术售后服务 简单的网络安全靠大家手抄报 重庆纬创资通软件开发面试 河北数据网络技术 网络安全红黑天鹅事件有哪些 选择北京服务器供应商虚拟主机 我的世界服务器关服开服指令 中银软件开发合肥待遇很差吗 腐烂国度是哪个服务器的 小学网络安全班会主题大字幕 不同物种基因表达数据库 网络技术核心思想 浪潮服务器江西云主机 政务网络安全信息平台架构设计 阿里软件开发标注注释写法 缺少网络安全专业技术人才 homd数据库 清华大学 图数据库 电子系 网络安全风险及隐患 php异步请求 数据库 数据库删除后 怎么再还原 中国国家网络安全机构 经典云服务器 华为笔试网络安全 应用软件开发学习心得 宝山区什么是网络技术转让产品
0