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

 更新时间:2022年01月20日 16:18:09   作者:暴走编程  
MyBatis可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录,这篇文章主要介绍了Mybatis实体别名支持通配符扫描的问题,需要的朋友可以参考下

Mybatis简介

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

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

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

问题

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

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

	<!-- sqlSessionFactory spring 整合 mybatis -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<property name="dataSource" ref="dataSource" />
    	<!-- mybatis 核心配置 -->
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
        <!-- mapper xml -->
        <property name="mapperLocations">
        	<array>
        		<value>classpath*:mybatis/mapper/*.xml</value>
        	</array>
        </property>
        <!-- 实体类别名 多个路径扫描 -->
        <property name="typeAliasesPackage" value="com.dongzz.cms.modules.a.entity,com.dongzz.cms.modules.b.entity" />
    </bean>

方式二:采用通配符的方式配置,默认不支持此方式,需要对 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) {
        // 资源路径解析器
        ResourcePatternResolver 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<String> 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配置:

	<!-- sqlSessionFactory 采用自定义的 -->
	<bean id="sqlSessionFactory" class="com.dongzz.cms.common.plugin.mybatis.SqlSessionFactoryBean">
    	<property name="dataSource" ref="dataSource" />
    	<!-- mybatis 核心配置 -->
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
        <!-- mapper xml -->
        <property name="mapperLocations">
        	<array>
        		<value>classpath*:mybatis/mapper/*.xml</value>
        	</array>
        </property>
        <!-- 实体类别名 通配符扫描 -->
        <property name="typeAliasesPackage" value="com.dongzz.cms.modules.**.entity" />
    </bean>

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

到此这篇关于Mybatis实体别名支持通配符扫描的文章就介绍到这了,更多相关Mybatis通配符扫描内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java如何使用while循环计算一个整数的位数

    Java如何使用while循环计算一个整数的位数

    这篇文章主要介绍了Java使用while循环计算一个整数的位数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java如何检测当前CPU负载状态

    Java如何检测当前CPU负载状态

    在Java中,直接检测CPU负载状态并不像在操作系统命令行中那样简单,因为Java标准库并没有直接提供这样的功能,这篇文章主要介绍了java检测当前CPU负载状态的方法,需要的朋友可以参考下
    2024-06-06
  • Spring Data JPA实现排序与分页查询超详细流程讲解

    Spring Data JPA实现排序与分页查询超详细流程讲解

    在介绍Spring Data JPA的时候,我们首先认识下Hibernate。Hibernate是数据访问解决技术的绝对霸主,使用O/R映射技术实现数据访问,O/R映射即将领域模型类和数据库的表进行映射,通过程序操作对象而实现表数据操作的能力,让数据访问操作无须关注数据库相关的技术
    2022-10-10
  • mybatis插入数据后如何返回新增数据的id值

    mybatis插入数据后如何返回新增数据的id值

    当往mysql数据库插入一条数据时,有时候需要知道刚插入的信息,下面这篇文章主要给大家介绍了关于mybatis插入数据后如何返回新增数据id值的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Spring Boot拦截器和监听器实现对请求和响应处理实战

    Spring Boot拦截器和监听器实现对请求和响应处理实战

    这篇文章主要介绍了Spring Boot拦截器和监听器实现对请求和响应处理实战,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Sentinel实现动态配置的集群流控的方法

    Sentinel实现动态配置的集群流控的方法

    这篇文章主要介绍了Sentinel实现动态配置的集群流控,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • SpringBoot配置文件中密码属性加密的实现

    SpringBoot配置文件中密码属性加密的实现

    本文主要介绍了SpringBoot配置文件中密码属性加密的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 解决java.lang.Error: Unresolved compilation problems:问题

    解决java.lang.Error: Unresolved compilation pro

    这篇文章主要介绍了解决java.lang.Error: Unresolved compilation problems:问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • JDBC 使用说明(流程、架构、编程)

    JDBC 使用说明(流程、架构、编程)

    这篇文章主要介绍了JDBC 使用说明,需要的朋友可以参考下
    2015-08-08
  • JAVA使用Ldap操作AD域的方法示例

    JAVA使用Ldap操作AD域的方法示例

    这篇文章主要介绍了JAVA使用Ldap操作AD域的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论