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

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

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

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

当我们集成Mybatis初始化加载*Mapper.xml时,在xml中使用了类型匹配报错。解决这样的错误有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);
   }

}

在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>


在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>-->


配置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
 */
@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;
    }

    @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(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
        return sessionFactory.getObject();
    }
}


Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐