千家信息网

Springboot+Mybatis中怎么实现typeAliasesPackage正则扫描

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,本篇内容主要讲解"Springboot+Mybatis中怎么实现typeAliasesPackage正则扫描",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"
千家信息网最后更新 2025年01月31日Springboot+Mybatis中怎么实现typeAliasesPackage正则扫描

本篇内容主要讲解"Springboot+Mybatis中怎么实现typeAliasesPackage正则扫描",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Springboot+Mybatis中怎么实现typeAliasesPackage正则扫描"吧!

Mybatis typeAliasesPackage正则扫描

mybatis默认配置typeAliasesPackage是不支持正则扫描package的,因此需要手动继承org.mybatis.spring.SqlSessionFactoryBean,自己实现正则扫描,方法和传统的spring+mybatis没什么区别,不同的是一个需要继承类一个是使用的扫描实现。

对于两个或多个扫描路径,例:

cn.com.onethird.integration.entity

cn.com.onethird.business.entity

application.properties配置Mybatis 如下

mybatis.typeAliasesPackage=cn.com.onethird.*.*.entitymybatis.mapperLocations=classpath:mapper/*.xml
package cn.com.onethird.nursinghome; import java.io.IOException;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Properties; import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.core.env.Environment;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 com.Application; /**  *  * @Title: MyBatisConfig.java *  * @Package  * @Description: mybtis实现正则扫描java bean包 *  * @author  * @date  * @version V1.0  */ @Configuration@PropertySource("classpath:application.properties")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);        typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX                + ClassUtils.convertClassNameToResourcePath(typeAliasesPackage)                + "/" + DEFAULT_RESOURCE_PATTERN;        try {            List result = new ArrayList();            Resource[] resources = resolver.getResources(typeAliasesPackage);            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 h = new HashSet(result);                result.clear();                result.addAll(h);                typeAliasesPackage = String.join("," ,(String[]) result.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 {        System.out.println(">>>>>>>>>>>配置[typeAliasesPackage,mapperLocations]START>>>>>>>>>>>>>>");        Properties props = new Properties();        String typeAliasesPackage = env                .getProperty("mybatis.typeAliasesPackage");        String mapperLocations = env.getProperty("mybatis.mapperLocations");        typeAliasesPackage=setTypeAliasesPackage(typeAliasesPackage);         final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();        sessionFactory.setDataSource(dataSource);        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));        System.out.println(">>>>>>>>>>>配置[typeAliasesPackage,mapperLocations]END>>>>>>>>>>>>>>");        return sessionFactory.getObject();    }     public static void main(String[] args) throws Exception {        setTypeAliasesPackage("cn.com.onethird.*.*.entity");    }}

Mybatis 自定义扫描通配符typeAliasesPackage

typeAliasesPackage 默认只能扫描某一个路径下,或以逗号等分割的 几个路径下的内容,不支持通配符和正则,采用重写的方式解决

package com.xxxx.xxx.util.common;    import com.xxxx.xxx.util.LogUtil;  import org.apache.commons.lang3.StringUtils;  import org.mybatis.spring.SqlSessionFactoryBean;  import org.slf4j.Logger;  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 java.io.IOException;  import java.util.ArrayList;  import java.util.List;    /**  * Created by Administrator on 2015/10/6.  */  public class PackagesSqlSessionFactoryBean extends SqlSessionFactoryBean {        static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";        private static Logger logger = LogUtil.get();        @Override      public void setTypeAliasesPackage(String typeAliasesPackage) {          ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver();          MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);          typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +                  ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/" + DEFAULT_RESOURCE_PATTERN;            //将加载多个绝对匹配的所有Resource          //将首先通过ClassLoader.getResource("META-INF")加载非模式路径部分          //然后进行遍历模式匹配          try {              List result = new ArrayList();              Resource[] resources =  resolver.getResources(typeAliasesPackage);              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) {                  super.setTypeAliasesPackage(StringUtils.join(result.toArray(), ","));              }else{                  logger.warn("参数typeAliasesPackage:"+typeAliasesPackage+",未找到任何包");              }              //logger.info("d");          } catch (IOException e) {              e.printStackTrace();          }      }    }
                                                                                                                                                          

到此,相信大家对"Springboot+Mybatis中怎么实现typeAliasesPackage正则扫描"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0