You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
5.4 KiB
132 lines
5.4 KiB
package com.ruoyi.framework.config; |
|
|
|
import java.io.IOException; |
|
import java.util.ArrayList; |
|
import java.util.Arrays; |
|
import java.util.HashSet; |
|
import java.util.List; |
|
import javax.sql.DataSource; |
|
import org.apache.ibatis.io.VFS; |
|
import org.apache.ibatis.session.SqlSessionFactory; |
|
import org.mybatis.spring.SqlSessionFactoryBean; |
|
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; |
|
import org.springframework.beans.factory.annotation.Autowired; |
|
import org.springframework.context.annotation.Bean; |
|
import org.springframework.context.annotation.Configuration; |
|
import org.springframework.core.env.Environment; |
|
import org.springframework.core.io.DefaultResourceLoader; |
|
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.ruoyi.common.utils.StringUtils; |
|
|
|
/** |
|
* Mybatis支持*匹配扫描包 |
|
* |
|
* @author ruoyi |
|
*/ |
|
@Configuration |
|
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); |
|
List<String> allResult = new ArrayList<String>(); |
|
try |
|
{ |
|
for (String aliasesPackage : typeAliasesPackage.split(",")) |
|
{ |
|
List<String> result = new ArrayList<String>(); |
|
aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX |
|
+ ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN; |
|
Resource[] resources = resolver.getResources(aliasesPackage); |
|
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> hashResult = new HashSet<String>(result); |
|
allResult.addAll(hashResult); |
|
} |
|
} |
|
if (allResult.size() > 0) |
|
{ |
|
typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0])); |
|
} |
|
else |
|
{ |
|
throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包"); |
|
} |
|
} |
|
catch (IOException e) |
|
{ |
|
e.printStackTrace(); |
|
} |
|
return typeAliasesPackage; |
|
} |
|
|
|
public Resource[] resolveMapperLocations(String[] mapperLocations) |
|
{ |
|
ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(); |
|
List<Resource> resources = new ArrayList<Resource>(); |
|
if (mapperLocations != null) |
|
{ |
|
for (String mapperLocation : mapperLocations) |
|
{ |
|
try |
|
{ |
|
Resource[] mappers = resourceResolver.getResources(mapperLocation); |
|
resources.addAll(Arrays.asList(mappers)); |
|
} |
|
catch (IOException e) |
|
{ |
|
// ignore |
|
} |
|
} |
|
} |
|
return resources.toArray(new Resource[resources.size()]); |
|
} |
|
|
|
@Bean |
|
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception |
|
{ |
|
String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage"); |
|
String mapperLocations = env.getProperty("mybatis.mapperLocations"); |
|
String configLocation = env.getProperty("mybatis.configLocation"); |
|
typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); |
|
VFS.addImplClass(SpringBootVFS.class); |
|
|
|
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); |
|
sessionFactory.setDataSource(dataSource); |
|
sessionFactory.setTypeAliasesPackage(typeAliasesPackage); |
|
sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ","))); |
|
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); |
|
return sessionFactory.getObject(); |
|
} |
|
} |