Springboot集成Mybatis支持*匹配扫描包
- 当我们集成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();}}