關(guān)于Mybatis實(shí)體別名支持通配符掃描問(wèn)題小結(jié)
Mybatis簡(jiǎn)介
MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射。
MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。
MyBatis 可以使用簡(jiǎn)單的 XML 或注解來(lái)配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄
問(wèn)題
Spring集成Mybatis的項(xiàng)目中,可以為指定包下的實(shí)體取別名,這樣在Mapper xml文件中可以省略實(shí)體類的全路徑名稱,只寫類名稱即可;但是在多模塊項(xiàng)目中,可能需要將實(shí)體放在不同的模塊下,此時(shí)需要配置多路徑掃描;
方式一:配置多個(gè)路徑,逗號(hào)分隔符隔開(kāi)
<!-- 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> <!-- 實(shí)體類別名 多個(gè)路徑掃描 --> <property name="typeAliasesPackage" value="com.dongzz.cms.modules.a.entity,com.dongzz.cms.modules.b.entity" /> </bean>
方式二:采用通配符的方式配置,默認(rèn)不支持此方式,需要對(duì) SqlSessionFactoryBean
進(jìn)行重寫,使其支持通配符掃描
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"; // 別名通配符 /** * 重寫 實(shí)體別名擴(kuò)展 支持通配符 * * @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); // 讀取類的信息,每個(gè) Resource 都是一個(gè)類資源 try { result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); // 存儲(chǔ)類對(duì)應(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> <!-- 實(shí)體類別名 通配符掃描 --> <property name="typeAliasesPackage" value="com.dongzz.cms.modules.**.entity" /> </bean>
通過(guò)自定義 SqlSessionFactoryBean
使得mybatis支持通配符別名掃描,這樣在多模塊項(xiàng)目中,掃描路徑僅需要配置一次即可;
到此這篇關(guān)于Mybatis實(shí)體別名支持通配符掃描的文章就介紹到這了,更多相關(guān)Mybatis通配符掃描內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java lambda表達(dá)式實(shí)現(xiàn)Flink WordCount過(guò)程解析
這篇文章主要介紹了Java lambda表達(dá)式實(shí)現(xiàn)Flink WordCount過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02分享java打印簡(jiǎn)單圖形的實(shí)現(xiàn)代碼
這篇文章主要分享給大家運(yùn)用java打印簡(jiǎn)單圖形:三角形,菱形,四邊形,需要的朋友可以參考下2015-07-07mybatis源碼解讀之executor包語(yǔ)句處理功能
這篇文章主要介紹了executor包語(yǔ)句處理功能,mybatis中支持三種語(yǔ)句類型,不同語(yǔ)句類型支持的變量符號(hào)不同,下文詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-02-02Java實(shí)現(xiàn)bmp和jpeg圖片格式互轉(zhuǎn)
本文主要介紹了Java實(shí)現(xiàn)bmp和jpeg圖片格式互轉(zhuǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn)
本文主要介紹了JAVA區(qū)間值判斷[10,20)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09詳解Java實(shí)現(xiàn)設(shè)計(jì)模式之責(zé)任鏈模式
責(zé)任鏈模式是一種行為設(shè)計(jì)模式,允許你將請(qǐng)求沿著處理鏈發(fā)送,然后處理者都可對(duì)其進(jìn)行處理,完成后可以再將其傳遞給下一個(gè)處理者。下面將會(huì)舉例說(shuō)明什么是責(zé)任鏈模式,責(zé)任鏈模式該如何使用2021-06-06win11?idea?shift+F6快捷鍵失效問(wèn)題解決方案
這篇文章主要介紹了win11?idea?shift+F6快捷鍵失效問(wèn)題,本文給大家分享最新解決方案,需要的朋友可以參考下2023-08-08Java如何導(dǎo)入Jsoup庫(kù)做一個(gè)有趣的爬蟲(chóng)項(xiàng)目
Jsoup庫(kù)是一款Java的HTML解析器,可用于從網(wǎng)絡(luò)或本地文件中獲取HTML文檔并解析其中的數(shù)據(jù),這篇文章給大家介紹Java導(dǎo)入Jsoup庫(kù)做一個(gè)有趣的爬蟲(chóng)項(xiàng)目,感興趣的朋友跟隨小編一起看看吧2023-11-11