Springboot+Mybatis中typeAliasesPackage正則掃描實現(xiàn)方式
Mybatis typeAliasesPackage正則掃描
mybatis默認配置typeAliasesPackage是不支持正則掃描package的,因此需要手動繼承org.mybatis.spring.SqlSessionFactoryBean,自己實現(xiàn)正則掃描,方法和傳統(tǒng)的spring+mybatis沒什么區(qū)別,不同的是一個需要繼承類一個是使用的掃描實現(xiàn)。
對于兩個或多個掃描路徑,例:
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實現(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 路徑掃描錯誤, 參數(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 默認只能掃描某一個路徑下,或以逗號等分割的 幾個路徑下的內(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;
//將加載多個絕對匹配的所有Resource
//將首先通過ClassLoader.getResource("META-INF")加載非模式路徑部分
//然后進行遍歷模式匹配
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>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot-application.yml多環(huán)境配置詳解
本文主要介紹了SpringBoot-application.yml多環(huán)境配置詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07
Spring?Data?JPA?在?@Query?中使用投影的方法示例詳解
這篇文章主要介紹了Spring?Data?JPA?在?@Query?中使用投影的方法,大家需要注意如果要在 @Query 中使用投影,必須要主動聲明要查詢的字段,并且主動寫明字段的別名才行,本文通過sql代碼給大家介紹的非常詳細,需要的朋友參考下吧2022-07-07
Java如何將String轉(zhuǎn)換成json對象或json數(shù)組
這篇文章主要介紹了Java如何將String轉(zhuǎn)換成json對象或json數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02

