關(guān)于Mybatis實體別名支持通配符掃描問題小結(jié)
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>
方式二:采用通配符的方式配置,默認不支持此方式,需要對 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()); // 存儲類對應的包路徑
} 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支持通配符別名掃描,這樣在多模塊項目中,掃描路徑僅需要配置一次即可;
到此這篇關(guān)于Mybatis實體別名支持通配符掃描的文章就介紹到這了,更多相關(guān)Mybatis通配符掃描內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java lambda表達式實現(xiàn)Flink WordCount過程解析
這篇文章主要介紹了Java lambda表達式實現(xiàn)Flink WordCount過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-02-02
Java實現(xiàn)bmp和jpeg圖片格式互轉(zhuǎn)
本文主要介紹了Java實現(xiàn)bmp和jpeg圖片格式互轉(zhuǎn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04
win11?idea?shift+F6快捷鍵失效問題解決方案
這篇文章主要介紹了win11?idea?shift+F6快捷鍵失效問題,本文給大家分享最新解決方案,需要的朋友可以參考下2023-08-08

