Springboot集成Mybatis支持*匹配扫描包

2022-07-08 11:06:27
  • 当我们集成Mybatis初始化加载*Mapper.xml时,在xml中使用了类型匹配报错。

1.解决这样的错误有3中办法在这里插入图片描述

  • application.yml配置中添加如下配置
#MyBatis
mybatis:
 # 搜索指定包别名
 typeAliasesPackage: com.xp.**.domain #类型扫描不持支*需要结合方法
三
 # 配置mapper的扫描,找到所有的mapper.xml映射文件 这里没有加* 这是错误一
 mapperLocations: classpath*:mapper/**/*Mapper.xml
 # 加载全局的配置文件
 configLocation: classpath:mybatis/mybatis-config.xml
  • spring boot 启动类中添加@MapperScan
@SpringBootApplication
@MapperScan("com.xp.system.mapper")
public class XpAdminApplication {

   public static void main(String[] args) {
       SpringApplication.run(XpAdminApplication.class, args);
   }

}

1.在Mybati-Config.xml文件中添加如下配置重启(方法一)

// An highlighted block<typeAliases><typeAlias alias="Integer" type="java.lang.Integer"/><typeAlias alias="Long" type="java.lang.Long"/><typeAlias alias="HashMap" type="java.util.HashMap"/><typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap"/><typeAlias alias="ArrayList" type="java.util.ArrayList"/><typeAlias alias="LinkedList" type="java.util.LinkedList"/><!--<typeAlias alias="SysUser" type="com.xp.system.domain.SysUser"/>--><!--<typeAlias alias="SysDept" type="com.xp.system.domain.SysDept"/>--><!--<typeAlias alias="SysRole" type="com.xp.system.domain.SysRole"/>--></typeAliases>

2.在Mapper.xml中直接使用类全面(方法二)

<resultMap id="deptResult" type="com.xp.system.domain.SysDept">--><!--<id     property="deptId"   column="dept_id"/>--><!--<result property="parentId" column="parent_id"/>--><!--<result property="deptName" column="dept_name"/>--><!--<result property="orderNum" column="order_num"/>--><!--<result property="leader"   column="leader"/>--><!--<result property="status"   column="dept_status"/>--><!--</resultMap>-->

3.配置Mybatis支持*扫描包(方法三)

package com.xp.framework.config;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 javax.sql.DataSource;import java.io.IOException;import java.util.ArrayList;import java.util.HashSet;import java.util.List;/**
 *  Mybatis支持*匹配扫描包
 *
 * @Author 徐培
 * @Date 2020/7/9 17:43
 * @Version 1.0
 */
@ConfigurationpublicclassMybatisConfig{

    @Autowiredprivate Environment env;static final StringDEFAULT_RESOURCE_PATTERN="**/*.class";publicstatic StringsetTypeAliasesPackage(String typeAliasesPackage){
        ResourcePatternResolver resolver=(ResourcePatternResolver)newPathMatchingResourcePatternResolver();
        MetadataReaderFactory metadataReaderFactory=newCachingMetadataReaderFactory(resolver);
        List<String> allResult=newArrayList<String>();try{for(String aliasesPackage: typeAliasesPackage.split(",")){
                List<String> result=newArrayList<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=newHashSet<String>(result);
                    allResult.addAll(hashResult);}}if(allResult.size()>0){
                typeAliasesPackage= String.join(",",(String[]) allResult.toArray(newString[0]));}else{thrownewRuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:"+ typeAliasesPackage+"未找到任何包");}}catch(IOException e){
            e.printStackTrace();}return typeAliasesPackage;}

    @Beanpublic SqlSessionFactorysqlSessionFactory(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=newSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
        sessionFactory.setMapperLocations(newPathMatchingResourcePatternResolver().getResources(mapperLocations));
        sessionFactory.setConfigLocation(newDefaultResourceLoader().getResource(configLocation));return sessionFactory.getObject();}}
  • 作者:危险制造
  • 原文链接:https://blog.csdn.net/qq_45432659/article/details/107280904
    更新时间:2022-07-08 11:06:27