Springboot+Mybatis中typeAliasesPackage正则扫描实现方式

网友投稿 911 2022-12-28

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.*.*.entity

mybatis.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 PathMatchekTnJvKNKingResourcePatternResolver().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();

}

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:物联网厂商(物联网设备生产厂家)
下一篇:物联网代理(物联网代理流量卡)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~