欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-08 18:30:45
目录mybatis简介问题mybatis简介mybatis 是一款优秀的持久层框架,它支持定制化 sql、存储过程以及高级映射。mybatis 避免了几乎所有的 jdbc 代码和手动设置参数以及获取结...

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通配符扫描内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!