014-Mybatis支持*匹配扫描包

🧑‍🎓 个人主页: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();

📢💨如果文章对你有帮助【关注👍点赞❤️收藏⭐】
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silence Lamb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值