parent
36cc088dba
commit
e0a164e567
@ -1,132 +0,0 @@ |
|||||||
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(); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,62 @@ |
|||||||
|
package com.ruoyi.framework.config; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.DbType; |
||||||
|
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; |
||||||
|
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; |
||||||
|
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; |
||||||
|
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; |
||||||
|
import org.springframework.context.annotation.Bean; |
||||||
|
import org.springframework.context.annotation.Configuration; |
||||||
|
import org.springframework.transaction.annotation.EnableTransactionManagement; |
||||||
|
|
||||||
|
/** |
||||||
|
* Mybatis Plus 配置 |
||||||
|
* |
||||||
|
* @author ruoyi |
||||||
|
*/ |
||||||
|
@EnableTransactionManagement(proxyTargetClass = true) |
||||||
|
@Configuration |
||||||
|
public class MybatisPlusConfig |
||||||
|
{ |
||||||
|
@Bean |
||||||
|
public MybatisPlusInterceptor mybatisPlusInterceptor() |
||||||
|
{ |
||||||
|
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); |
||||||
|
// 分页插件
|
||||||
|
interceptor.addInnerInterceptor(paginationInnerInterceptor()); |
||||||
|
// 乐观锁插件
|
||||||
|
interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor()); |
||||||
|
// 阻断插件
|
||||||
|
interceptor.addInnerInterceptor(blockAttackInnerInterceptor()); |
||||||
|
return interceptor; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html
|
||||||
|
*/ |
||||||
|
public PaginationInnerInterceptor paginationInnerInterceptor() |
||||||
|
{ |
||||||
|
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); |
||||||
|
// 设置数据库类型为mysql
|
||||||
|
paginationInnerInterceptor.setDbType(DbType.MYSQL); |
||||||
|
// 设置最大单页限制数量,默认 500 条,-1 不受限制
|
||||||
|
paginationInnerInterceptor.setMaxLimit(-1L); |
||||||
|
return paginationInnerInterceptor; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html
|
||||||
|
*/ |
||||||
|
public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() |
||||||
|
{ |
||||||
|
return new OptimisticLockerInnerInterceptor(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html
|
||||||
|
*/ |
||||||
|
public BlockAttackInnerInterceptor blockAttackInnerInterceptor() |
||||||
|
{ |
||||||
|
return new BlockAttackInnerInterceptor(); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue