Springboot+Mybatis中typeAliasesPackage正則掃描實(shí)現(xiàn)方式
Mybatis typeAliasesPackage正則掃描
mybatis默認(rèn)配置typeAliasesPackage是不支持正則掃描package的,因此需要手動(dòng)繼承org.mybatis.spring.SqlSessionFactoryBean,自己實(shí)現(xiàn)正則掃描,方法和傳統(tǒng)的spring+mybatis沒(méi)什么區(qū)別,不同的是一個(gè)需要繼承類一個(gè)是使用的掃描實(shí)現(xiàn)。
對(duì)于兩個(gè)或多個(gè)掃描路徑,例:
cn.com.onethird.integration.entity
cn.com.onethird.business.entity
application.properties配置Mybatis 如下
mybatis.typeAliasesPackage=cn.com.onethird.*.*.entity mybatis.mapperLocations=classpath:mapper/*.xml
package cn.com.onethird.nursinghome;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
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 com.Application;
/**
*
* @Title: MyBatisConfig.java *
* @Package
* @Description: mybtis實(shí)現(xiàn)正則掃描java bean包 *
* @author
* @date
* @version V1.0
*/
@Configuration
@PropertySource("classpath:application.properties")
public class MyBatisConfig {
@Autowired
private Environment env;
static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
public static String setTypeAliasesPackage(String typeAliasesPackage) {
ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(
resolver);
typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
+ ClassUtils.convertClassNameToResourcePath(typeAliasesPackage)
+ "/" + DEFAULT_RESOURCE_PATTERN;
try {
List<String> result = new ArrayList<String>();
Resource[] resources = resolver.getResources(typeAliasesPackage);
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<String> h = new HashSet<String>(result);
result.clear();
result.addAll(h);
typeAliasesPackage = String.join("," ,(String[]) result.toArray(new String[0]));
} else {
throw new RuntimeException(
"mybatis typeAliasesPackage 路徑掃描錯(cuò)誤, 參數(shù)typeAliasesPackage:" + typeAliasesPackage + "未找到任何包");
}
} catch (IOException e) {
e.printStackTrace();
}
return typeAliasesPackage;
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource)
throws Exception {
System.out.println(">>>>>>>>>>>配置[typeAliasesPackage,mapperLocations]START>>>>>>>>>>>>>>");
Properties props = new Properties();
String typeAliasesPackage = env
.getProperty("mybatis.typeAliasesPackage");
String mapperLocations = env.getProperty("mybatis.mapperLocations");
typeAliasesPackage=setTypeAliasesPackage(typeAliasesPackage);
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
System.out.println(">>>>>>>>>>>配置[typeAliasesPackage,mapperLocations]END>>>>>>>>>>>>>>");
return sessionFactory.getObject();
}
public static void main(String[] args) throws Exception {
setTypeAliasesPackage("cn.com.onethird.*.*.entity");
}
}
Mybatis 自定義掃描通配符typeAliasesPackage
typeAliasesPackage 默認(rèn)只能掃描某一個(gè)路徑下,或以逗號(hào)等分割的 幾個(gè)路徑下的內(nèi)容,不支持通配符和正則,采用重寫的方式解決
package com.xxxx.xxx.util.common;
import com.xxxx.xxx.util.LogUtil;
import org.apache.commons.lang3.StringUtils;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.slf4j.Logger;
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.ArrayList;
import java.util.List;
/**
* Created by Administrator on 2015/10/6.
*/
public class PackagesSqlSessionFactoryBean extends SqlSessionFactoryBean {
static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
private static Logger logger = LogUtil.get();
@Override
public void setTypeAliasesPackage(String typeAliasesPackage) {
ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/" + DEFAULT_RESOURCE_PATTERN;
//將加載多個(gè)絕對(duì)匹配的所有Resource
//將首先通過(guò)ClassLoader.getResource("META-INF")加載非模式路徑部分
//然后進(jìn)行遍歷模式匹配
try {
List<String> result = new ArrayList<String>();
Resource[] resources = resolver.getResources(typeAliasesPackage);
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) {
super.setTypeAliasesPackage(StringUtils.join(result.toArray(), ","));
}else{
logger.warn("參數(shù)typeAliasesPackage:"+typeAliasesPackage+",未找到任何包");
}
//logger.info("d");
} catch (IOException e) {
e.printStackTrace();
}
}
}
<bean id="sqlSession" class="com.xxxx.xxxx.util.common.PackagesSqlSessionFactoryBean">
<property name="configLocation" value="classpath:config/sqlmap/sqlmap-config.xml" />
<property name="dataSource" ref="dataSource"/>
<!--<property name="mapperLocations"-->
<!--value="classpath*:com/xxxx/xxxx/merchant/**/domain/mapper/*.xml"/>-->
<property name="typeAliasesPackage" value="com.xxxx.xxxx.custom.*.domain"/>
<property name="plugins">
<array>
<ref bean="pageInterceptor"/>
</array>
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xxxx.xxxx.**.dao"/>
</bean>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot整合nacos的入門Demo及Nacos安裝部署
Nacos?提供了一組簡(jiǎn)單易用的特性集,幫助您快速實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理,Nacos?致力于幫助您發(fā)現(xiàn)、配置和管理微服務(wù),這篇文章主要介紹了springboot整合nacos的入門Demo,需要的朋友可以參考下2024-01-01
Springboot使用redisson實(shí)現(xiàn)分布式鎖的代碼示例
在實(shí)際項(xiàng)目中,某些場(chǎng)景下可能需要使用到分布式鎖功能,那么實(shí)現(xiàn)分布式鎖有多種方式,常見(jiàn)的如mysql分布式鎖、zookeeper分布式鎖、redis分布式鎖,本文介紹springboot如何使用redisson實(shí)現(xiàn)分布式鎖,需要的朋友可以參考下2023-06-06
搭建一個(gè)基礎(chǔ)的Resty項(xiàng)目框架
這篇文章主要為大家介紹了如何搭建一個(gè)基礎(chǔ)的Resty項(xiàng)目框架示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
Java使用Spire.XLS for Java實(shí)現(xiàn)Excel的行列凍結(jié)與解除
這篇文章主要為大家詳細(xì)介紹了Java如何使用Spire.XLS for Java實(shí)現(xiàn)Excel的行列凍結(jié)與解除,文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下2025-10-10
Spring?Boot中處理Servlet路徑映射問(wèn)題解決
本文探討了將傳統(tǒng)Servlet框架集成到Spring?Boot應(yīng)用時(shí)出現(xiàn)的路徑映射問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-08-08
基于java SSM springboot實(shí)現(xiàn)景區(qū)行李寄存管理系統(tǒng)
這篇文章主要介紹了基于java SSM springboot實(shí)現(xiàn)的景區(qū)行李寄存管理系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08

