🧑🎓 个人主页:Silence Lamb
📖 本章内容:【Springboot-Mybatis支持*匹配扫描包】
1️⃣配置文件信息
# MyBatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.michale.*.entity
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath:mapper/*.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
- mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局参数 -->
<settings>
<!-- 使全局的映射器启用或禁用缓存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 允许JDBC 支持自动生成主键 -->
<setting name="useGeneratedKeys" value="true"/>
<!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE"/>
<!-- 指定 MyBatis 所用日志的具体实现 -->
<setting name="logImpl" value="SLF4J"/>
<!-- 使用驼峰命名法转换字段 -->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
</settings>
</configuration>
2️⃣Mybatis配置类
- 路径扫描工具类
/**
* @author SilenceLamb
* @apiNote 扫描路径
*/
public class PathUtils {
static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
/**
* typeAliasesPackage 路径扫描
*
* @param classPath 路径
* @return 全路径类名
*/
public static String getTypeAliasesPackage(String classPath) {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
List<String> allResult = new ArrayList<>();
try {
for (String aliasesPackage : classPath.split(",")) {
List<String> result = new ArrayList<>();
String path = ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + path;
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 {
String className = metadataReader.getClassMetadata().getClassName();
String name = Class.forName(className).getPackage().getName();
result.add(name);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
if (result.size() > 0) {
HashSet<String> hashResult = new HashSet<String>(result);
allResult.addAll(hashResult);
}
}
if (allResult.size() > 0) {
classPath = String.join(",", (String[]) allResult.toArray(new String[0]));
} else {
throw new UtilException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + classPath + "未找到任何包");
}
} catch (IOException e) {
e.printStackTrace();
}
return classPath;
}
/**
* mybatisProperties 路径扫描
*
* @param mapperPath 路径
* @return
*/
public static Resource[] getMapperLocations(String mapperPath) {
String[] mapperLocations = StringUtils.split(mapperPath, ",");
ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
List<Resource> resources = new ArrayList<>();
if (mapperLocations != null) {
for (String mapperLocation : mapperLocations) {
try {
Resource[] mappers = resourceResolver.getResources(mapperLocation);
resources.addAll(Arrays.asList(mappers));
} catch (IOException e) {
e.printStackTrace();
}
}
}
return resources.toArray(new Resource[resources.size()]);
}
}
- Mybatis支持*匹配扫描包
/**
* @author SilenceLamb
* @apiNote Mybatis支持*匹配扫描包
*/
@Configuration
public class MyBatisConfig {
@Resource
private MybatisProperties mybatisProperties;
@Resource
private GlobalConfig globalConfig;
@Bean("sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
/* 将指定的类添加到VFS实现列表中 */
VFS.addImplClass(SpringBootVFS.class);
/* 依赖Spring容器完成MyBatis的SqlSessionFactory对象的创建 */
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
/* 配置数据源 */
sessionFactoryBean.setDataSource(dataSource);
/* 配置需要定义别名的实体类的包 */
sessionFactoryBean.setTypeAliasesPackage(PathUtils.getTypeAliasesPackage(mybatisProperties.getTypeAliasesPackage()));
/* 配置mapper文件的路径 */
sessionFactoryBean.setMapperLocations(PathUtils.getMapperLocations(mybatisProperties.getMapperLocations()));
/* 加载全局的配置文件 */
sessionFactoryBean.setConfigLocation(new DefaultResourceLoader().getResource(mybatisProperties.getConfigLocation()));
sessionFactoryBean.setGlobalConfig(globalConfig);
return sessionFactoryBean.getObject();
}
}
- 如果使用mybatis扫描不到mapper.java
- 修改sessionFactoryBean
final MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();