🧑🎓 个人主页:花棉袄
📖 本章内容:Mybatis-支持*匹配扫描包
🌳Gitee仓库地址:👉🏽 Mybatis支持*匹配扫描包
1️⃣ 可以给指定的包起别名
2️⃣ 找到所有的mapper.xml映射文件
3️⃣ 加载全局的配置文件
🍖配置文件信息
# 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>
🍵读取配置信息
/**
* @Author: 花棉袄
* @CreateDate: 2022年08月29日
* @Describe: 读取mybatis扫描包
*/
@Data
@Component
@ConfigurationProperties(prefix = "mybatis")
public class MybatisProperties {
@ApiModelProperty("搜索指定包别名")
private String typeAliasesPackage;
@ApiModelProperty("配置mapper的扫描,找到所有的mapper.xml映射文件")
private String mapperLocations;
@ApiModelProperty("加载全局的配置文件")
private String configLocation;
}
🍠Mybatis配置类
/**
* @Author: 花棉袄
* @CreateDate: 2022年08月29日
* @Describe: Mybatis支持*匹配扫描包
*/
@Configuration
public class MyBatisConfig {
@Autowired
private MybatisProperties mybatisProperties;
static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
/* 获取配置信息 */
String typeAliasesPackage = mybatisProperties.getTypeAliasesPackage();
String mapperLocations = mybatisProperties.getMapperLocations();
String configLocation = mybatisProperties.getConfigLocation();
typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
/* 将指定的类添加到VFS实现列表中 */
VFS.addImplClass(SpringBootVFS.class);
/* 依赖Spring容器完成MyBatis的SqlSessionFactory对象的创建 */
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
/* 配置数据源 */
sessionFactory.setDataSource(dataSource);
/* 配置需要定义别名的实体类的包 */
sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
/* 配置mapper文件的路径 */
sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
/* 配置mapper文件的路径 */
sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
return sessionFactory.getObject();
}
/**
* typeAliasesPackage 路径扫描
* @param typeAliasesPackage
* @return
*/
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;
}
/**
* mybatisProperties 路径扫描
* @param mapperLocations
* @return
*/
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()]);
}
}
🍏MybatisPlus扩展
-
配置数据源之后MybatisPlus的增强组件全部失效的问题
-
使用MybatisSqlSessionFactoryBean工厂构建对象
final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
📢💨如果文章对你有帮助【关注👍点赞❤️收藏⭐】