关于Mybatis实体别名支持通配符扫描问题小结

网友投稿 250 2022-11-06

关于Mybatis实体别名支持通配符扫描问题小结

目录Mybatis简介问题

Mybatis简介

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。

MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录

问题

Spring集成Mybatis的项目中,可以为指定包下的实体取别名,这样在Mapper xml文件中可以省略实体类的全路径名称,只写类名称即可;但是在多模块项目中,可能需要将实体放在不同的模块下,此时需要配置多路径扫描;

方式一:配置多个路径,逗号分隔符隔开

<array>

classpath*:mybatis/mapper/*.xml

方式二:采用通配符的方式配置,默认不支持此方式,需要对 SqlSessionFactoryBean 进行重写,使其支持通配符扫描

package com.dongzz.cms.common.plugin.mybatis;

import org.apache.commons.lang3.StringUtils;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

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.HashSet;

import java.util.Set;

/**

* 自定义 SqlSessionFactoryBean

*/

public class SqlSessionFactoryBean extends org.mybatis.spring.SqlSessionFactoryBean {

public static final Logger logger = LoggerFactory.getLogger(SqlSessionFactoryBean.class);

public static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; // 别名通配符

/**

* 重写 实体别名扩展 支持通配符

*

* @param typeAliasesPackage 格式: com.dongzz.cms.modules.**.entity

*/

@Override

public void setTypeAliasesPackage(String typeAliasesPackage) {

// 资源路径解析器

ResourcePatternhttp://Resolver resolver = new PathMatchingResourcePatternResolver();

// 元数据读取

MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);

// 解析路径

typeAliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + ClassUtils.convertClassNameToResourcePath(typeAliasesPackage) + "/" + DEFAULT_RESOURCE_PATTERN;

logger.debug("别名包通配符:" + typeAliasesPackage);

try {

Set result = new HashSet<>(); // 别名包路径集合

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); // 读取类的信息,每个 Resource 都是一个类资源

try {

result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); // 存储类对应的包路径

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

}

if (result.size() > 0) {

logger.debug("别名包路径集合:" + StringUtils.join(result.toArray(), ","));

super.setTypeAliasesPackage(StringUtils.join(result.toArray(), ","));

} else {

logger.warn("Parameter typeAliasesPackage:" + typeAliasesPackage + ", not found any packages.");

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

Xml配置:

classpath*:mybatis/mapper/*.xml

通过自定义 SqlSessionFactoryBean 使得mybatis支持通配符别名扫http://描,这样在多模块项目中,扫描路径仅需要配置一次即可;

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

上一篇:SMAX集成AlertManager实现突发事件自动开单
下一篇:VRRP实验
相关文章

 发表评论

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