溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何解決Mybatis實體別名支持通配符掃描問題

發(fā)布時間:2022-01-21 09:42:50 來源:億速云 閱讀:175 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下如何解決Mybatis實體別名支持通配符掃描問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

Mybatis簡介

MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。

MyBatis 避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集。

MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄

問題

Spring集成Mybatis的項目中,可以為指定包下的實體取別名,這樣在Mapper xml文件中可以省略實體類的全路徑名稱,只寫類名稱即可;但是在多模塊項目中,可能需要將實體放在不同的模塊下,此時需要配置多路徑掃描;

方式一:配置多個路徑,逗號分隔符隔開

	<!-- sqlSessionFactory spring 整合 mybatis -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<property name="dataSource" ref="dataSource" />
    	<!-- mybatis 核心配置 -->
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
        <!-- mapper xml -->
        <property name="mapperLocations">
        	<array>
        		<value>classpath*:mybatis/mapper/*.xml</value>
        	</array>
        </property>
        <!-- 實體類別名 多個路徑掃描 -->
        <property name="typeAliasesPackage" value="com.dongzz.cms.modules.a.entity,com.dongzz.cms.modules.b.entity" />
    </bean>

方式二:采用通配符的方式配置,默認(rèn)不支持此方式,需要對 SqlSessionFactoryBean 進行重寫,使其支持通配符掃描

package com.dongzz.cms.common.plugin.mybatis;

import org.apache.commons.lang3.StringUtils;
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;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

/**
 * 自定義 SqlSessionFactoryBean
 */
public class SqlSessionFactoryBean extends org.mybatis.spring.SqlSessionFactoryBean {

    public static final Logger logger = LoggerFactory.getLogger(SqlSessionFactoryBean.class);

    public static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; //  別名通配符

    /**
     * 重寫 實體別名擴展 支持通配符
     *
     * @param typeAliasesPackage 格式: com.dongzz.cms.modules.**.entity
     */
    @Override
    public void setTypeAliasesPackage(String typeAliasesPackage) {
        // 資源路徑解析器
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        // 元數(shù)據(jù)讀取
        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
        // 解析路徑
        typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/" + DEFAULT_RESOURCE_PATTERN;
        logger.debug("別名包通配符:" + typeAliasesPackage);
        try {
            Set<String> result = new HashSet<>(); // 別名包路徑集合
            Resource[] resources = resolver.getResources(typeAliasesPackage); // 根據(jù)路徑 讀取所有的類資源
            if (resources != null && resources.length > 0) {
                MetadataReader metadataReader = null;
                for (Resource resource : resources) {
                    if (resource.isReadable()) {
                        metadataReader = metadataReaderFactory.getMetadataReader(resource); // 讀取類的信息,每個 Resource 都是一個類資源
                        try {
                            result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); // 存儲類對應(yīng)的包路徑
                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            if (result.size() > 0) {
                logger.debug("別名包路徑集合:" + StringUtils.join(result.toArray(), ","));
                super.setTypeAliasesPackage(StringUtils.join(result.toArray(), ","));
            } else {
                logger.warn("Parameter typeAliasesPackage:" + typeAliasesPackage + ", not found any packages.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Xml配置:

	<!-- sqlSessionFactory 采用自定義的 -->
	<bean id="sqlSessionFactory" class="com.dongzz.cms.common.plugin.mybatis.SqlSessionFactoryBean">
    	<property name="dataSource" ref="dataSource" />
    	<!-- mybatis 核心配置 -->
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
        <!-- mapper xml -->
        <property name="mapperLocations">
        	<array>
        		<value>classpath*:mybatis/mapper/*.xml</value>
        	</array>
        </property>
        <!-- 實體類別名 通配符掃描 -->
        <property name="typeAliasesPackage" value="com.dongzz.cms.modules.**.entity" />
    </bean>

通過自定義 SqlSessionFactoryBean 使得mybatis支持通配符別名掃描,這樣在多模塊項目中,掃描路徑僅需要配置一次即可;

以上是“如何解決Mybatis實體別名支持通配符掃描問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI