当前位置:

首页 > 编程开发 > Springboot+Mybatis中怎么实现typeAliasesPackage正则扫描

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

MybatistypeAliasesPackage正则扫描mybatis默认配置typeAliasesPackage是不支持正则扫描package的,因此需要手动继承org.mybatis.spring.SqlSessionFactoryBean,自己实现正则扫描,方法和传统的spring+mybatis没什么区别,不同的是一个需要继承类一个是使用的扫描实现。对于两个或多个扫描路径,例:cn.com.onethird.integration.entitycn.com.onethird.business.e

本文目录

    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 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();  
            }  
        }    
    }
      
              
              
              
                        
              
              
                  
                      
                  
              
          
          
              
        
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    MyBatis XML开发全面完整指南
    MyBatis XML开发全面完整指南

    MyBatisXML开发方式适合复杂SQL逻辑,通过配置数据库连接与mapper路径,在接口和XML映射文件中实现增删改查操作。XML支持多表查询及结果映射,#{}使用预编译防注入,${}直接拼接需注意字符串引号。

    MyBatis Mapper 接口原理与实现解析
    MyBatis Mapper 接口原理与实现解析

    MyBatis通过动态代理自动生成Mapper接口实现类,运行时将接口方法绑定到SQL语句,结合XML映射文件中的SQL与参数配置,由SqlSession执行并返回结果,避免了手动编写实现类的繁琐过程。

    MyBatis框架常见问题及解决方案
    MyBatis框架常见问题及解决方案

    MyBatis常见问题包含:1.实体类属性与数据库字段不一致,解决方案为使用@Column注解映射;2.执行更新操作失败,需要配置update元素并检查SQL语句;3.查询结果映射出错,需检查resultMap配置是否正确;4.解析SQL参数失败,要使用#{}占位符并确保参数类型匹配。

    MyBatis框架中设计模式的应用
    MyBatis框架中设计模式的应用

    MyBatis框架广泛应用设计模式,包括:工厂模式:创建SqlSessionFactory对象,管理数据库连接和查询;代理模式:实现延迟加载和懒加载,提高性能。外观模式:封装对数据库访问,简化代码维护。其中,一对多关系映射可以通过User和Order类、Mapper接口和MapperXML配置实现,使用延迟加载和嵌套resultMap优化性能。

    MyBatis 的动态 SQL 解析:原理、实现和优化
    MyBatis 的动态 SQL 解析:原理、实现和优化

    MyBatis动态SQL解析:原理:使用TAG和OGNL表达式动态构建SQL语句。实现:通过SqlNode、SqlSource和ParameterHandler接口实现。优化:避免不必要的动态SQL、优化OGNL表达式、使用PreparedStatement缓存和配置查询超时。

    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    正确使用MyBatis中的小于符号
    正确使用MyBatis中的小于符号

    MyBatis是一个用Java语言编写的持久层框架,广泛用于数据库操作。在MyBatis中,使用小于号(<)进行条件查询是很常见的操作。但是,小于号在MyBatis中有一些使用注意事项,本文将介绍MyBatis小于号的正确使用方法,并提供具体的代码示例。1.在MyBatis中使用小于号的基本方法在MyBatis中使用小于号进行条件查询,一般是在SQL

    解析MyBatis的缓存机制:比较一级缓存和二级缓存的使用场景
    解析MyBatis的缓存机制:比较一级缓存和二级缓存的使用场景

    MyBatis的缓存机制解析:一级缓存与二级缓存的区别与应用在MyBatis框架中,缓存是一个非常重要的特性,可以有效提升数据库操作的性能。其中,一级缓存和二级缓存是MyBatis中常用的两种缓存机制。本文将详细解析一级缓存与二级缓存的区别与应用,并提供具体的代码示例进行说明。一、一级缓存一级缓存也被称为本地缓存,它默认开启且不可关闭。一级缓存是SqlSes

    深入了解MyBatis缓存机制:揭秘缓存存储原理
    深入了解MyBatis缓存机制:揭秘缓存存储原理

    MyBatis缓存机制详解:一文读懂缓存存储原理引言在使用MyBatis进行数据库访问时,缓存是一个非常重要的机制,能够有效减少对数据库的访问,提高系统性能。本文将详细介绍MyBatis的缓存机制,包括缓存的分类、存储原理和具体的代码示例。一、缓存的分类MyBatis的缓存主要分为一级缓存和二级缓存两种。一级缓存一级缓存是SqlSession级别的缓存,当在

    详解在MyBatis中使用小于符号的方法
    详解在MyBatis中使用小于符号的方法

    MyBatis中小于号的写法详解MyBatis是一个优秀的持久层框架,广泛应用于Java开发中。在使用MyBatis进行数据库操作的过程中,我们经常会用到小于号(<)进行条件查询。但是,MyBatis中小于号的写法并不像普通的SQL语句那样直接使用小于号符号,而是需要使用特定的方式来实现。本文将详细解释MyBatis中小于号的写法,并提供具体的代码示例

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。