Springboot+Mybatis中typeAliasesPackage正则扫描实现

2023-10-27

        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<String> result = new ArrayList<String>();
            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<String> h = new HashSet<String>(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");
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot+Mybatis中typeAliasesPackage正则扫描实现 的相关文章

  • WebSphere 中跨 JVM 的会话复制

    我们建立了一个基础设施 其中网络服务器是集群的 而应用程序服务器不是 Web 服务器根据循环策略将请求路由到应用程序服务器 在这种情况下 一个应用程序服务器中可用的会话数据在另一应用程序服务器中不可用 无论如何 是否可以使来自第一个应用程序
  • Hibernate 每个子类一个表继承策略的效率

    我正在考虑 Hibernate 管理的类层次结构的表布局 当然 每个子类表技术在我看来是一般意义上最合适的 然而 通过逻辑思考 我对其性能有些担忧 尤其是随着子类数量的扩展 举一个非常简短 且经典 的示例 假设您有以下类 public ab
  • Grails 项目 - Servlet 调用 - ClassNotFoundException:javax.servlet.AsyncContext

    我在用 IntelliJ IDEA 终极版 12 4 grails 2 2 0 BuildConfig groovy 文件中的 grails servlet version 2 5 并实现了简单的 servlet post 请求 使用 RE
  • 模式更新后 jOOQ 生成的类的运行时验证?

    我用org jooq util DefaultGenerator在构建过程中生成 jOOQ 类来表示我的数据库模式 当应用程序运行时 架构预计会在应用程序不知情的情况下发生更改 此类更改可能与已生成的代码兼容 也可能不兼容 如何在运行时检测
  • AMQP Spring 集成错误处理

    我的集成流程如下所示 Bean public IntegrationFlow auditFlow Qualifier eventLoggingConnectionFactory ConnectionFactory connectionFac
  • 有没有办法让Maven自动下载快照版本?

    所以我有一个项目依赖于另一个项目的快照版本 依赖关系是
  • 如何将日期字符串解析为Date? [复制]

    这个问题在这里已经有答案了 如何将下面的日期字符串解析为Date object String target Thu Sep 28 20 29 30 JST 2000 DateFormat df new SimpleDateFormat E
  • NIO 直接缓冲区何时以及如何被释放?

    我有一个 C 库 需要一个临时缓冲区作为暂存空间 我正在考虑将直接字节缓冲区的地址传递给它 在最终释放缓冲区之前 是否允许虚拟机重新定位缓冲区 JNI 框架消失后 本机库将保留该指针 我的理解是 JNI 本地对象引用无法缓存 因为 VM 可
  • Java 表达式树 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有相当于 net的 LINQ 下的表达式树JVM 我想实现一些类似 LINQ 的代码结构Scala
  • Eclipse RCP - 将视图与编辑器区域堆叠?

    在开发 Eclipse RCP 应用程序时 是否可以将视图与编辑器区域堆叠在一起 像这样 我有多个列表 表格 我想创建一种预览组合 当通过单击鼠标选择列表上的项目时 我希望我的预览合成显示该项目的数据 如果用户双击某个项目 我想在预览合成后
  • 我可以使用 Selenium Webdriver 测试元素的顺序吗?

    有一个表单 其中有 3 个字段 具有 3 个不同的 ID fieldset div div fieldset
  • 不使用 length() 方法的字符串长度[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何在不使用字符串的情况下找到字符串的长度length String类的方法 str toCharArray length应该管用 或者怎么
  • java中永远不会出现的异常

    我为点和向量编写一个类 我想用它们来计算向量的点和范数 这些是点类和向量类 public class Point public float x y public class MyVector public Point start end 我
  • 用于 Eclipse 的 Resharper [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Eclipse Juno 指标插件

    Eclipse JUNO 版本有哪些 Eclipse 指标插件 我尝试了一些通用指标插件 但没有一个能够在 Eclipse 的 JUNO 版本中正常运行 差点忘了 我们正在使用 Java 作为编程语言 我想要诸如圈复杂度 代码行数 方法长度
  • “强制更新快照/版本” - 这是什么意思

    在 Maven 项目中 选择 更新项目 时 有一个名为 强制更新快照 版本 的选项 它有什么作用 强制更新快照 版本 就像运行以下命令 mvn U install U 也可以用作 update snapshot 看here http boo
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 在 servlet 会话和 java.io.NotSerializedException 中保存对象

    SEVERE IOException while loading persisted sessions java io WriteAbortedException writing aborted java io NotSerializabl
  • Android Webview:无法调用确定的可见性() - 从未见过 pid 的连接

    我有一个 Android Webview 当我单击链接下载文件 pdf 图像等 时 我收到一条错误消息 Error message Cannot call determinedVisibility never saw a connectio
  • 将 SQL 数据中的一行映射到 Java 对象

    我有一个 Java 类 其实例字段 以及匹配的 setter 方法 与 SQL 数据库表的列名相匹配 我想优雅地从表中获取一行 到 ResultSet 中 并将其映射到此类的实例 例如 我有一个 Student 类 其中包含实例字段 FNA

随机推荐

  • 傻瓜式3分钟理解:工厂模式(简单工厂+工厂方法+抽象工厂)

    一 给我一句话概括 简单工厂 工厂类中 根据条件决定一个接口由哪个具体产品类来实现 工厂方法 创建多个工厂类 各个工厂类中 都对应一个获得接口A实例的方法 用户决定使用哪个工厂 抽象工厂 对工厂方法进行扩展 各个工厂类中 再增加一个获得接口
  • 移位运算

    div class markdown views div
  • python中dict数据转DataFrame,pandas实现类似sql查询语句

    目的 将一组dict字典数据转为pandas的DataFrame格式 然后用pandas实现类似sql语句中select from xxx where condition的功能 一 python中将dict格式数据转为DataFrame格式
  • 4.4.2 中文标点符号验证

    英文标点符号比较多 如 逗号 点号 问号 冒号 分号 单引号 感叹号 双引号 连接号 破折号 省略号 小括号 中括号 大括号 顿号 书名号等 以下正则表达式能够验证英文标点符号 2 64 正则表达式 64 解释 匹配 符号 2 匹配破折号
  • Java 添加背景图片

    import java awt import javax swing public class TestBackgroundColor extends JFrame public static void main String args T
  • IF语句例题(一)

    石头剪刀布 需求 1 从控制台输入要出的拳 石头 1 剪刀 2 布 3 2 电脑随机出拳 先假定电脑会出石头 完成代码功能 3 比较正负 解题 首先我们先会议一些input函数 在input函数中内部都是字符串 所以说要把字符串变成整数 p
  • k8s安全管理:认证、授权、准入控制概述

    概述信息 k8s对我们整个系统的认证 授权 访问控制做了精密的设置 对于k8s集群来说 apiserver是整个集群访问控制的唯一入口 我们在k8s集群之上部署应用程序的时候 也可以通过宿主机的NodePort暴露的端口访问里面的程序 用户
  • linux备份工具

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 经常备份计算机上的数据是个好的做法 它可以手动完成 也可以设置成自动执行 许多备
  • Java____西财大图书管理系统 代码实现

    西财大图书管理项目代码 book类 1 book 2 bookist operation类 1 AddOperation 2 BorrowOperation 3 DisplayOperation 4 FindOperation 5 Remo
  • 信号与系统matlab心得体会,实验五 Matlab在信号与系统分析中的应用

    实验五Matlab在信号与系统分析中的应用 08电子 3 班E08610308 陈建能 一 实验目的 1 学会用MATLAB进行Laplace正 反变换及Z正 反变换 2 掌握利用MATLAB画出系统的幅频响应 相频响应的方法 3 掌握利用
  • 【C语言】N 阶矩阵的转置

    非主对角线元素的调换 只需要将蓝色虚线左边的元素进行调换 include
  • u盘装系统

    1 用ultraiso将ios写入u盘 2 U盘插入电脑 3 开机狂按某键进入 boot启动页面 4 选择该u盘 enter回车确认安装
  • ag-grid表格基本使用方法-React版本

    AG表格基本用法及Api 在要使用的项目中 首次使用需要引入相关组件包 注 项目中所有组件都是封装之后的 引入方式如下 import Table from pkg common table 引入完成后 在view层需要用到表格的地方直接放入
  • Vue3的filter过滤器代替方法

    Vue3的过滤器代替方法 前言 一 使用步骤 1 vue2的filter 2 vue3的computed 总结 前言 最近博主从vue2转到vue3 惊奇的发现vue2里面的filter在vue3中不再支持 官方建议用计算属性或方法代替过滤
  • 现代博弈论与多智能体强化学习系统

    如今 大多数人工智能 AI 系统都是基于处理任务的单个代理 或者在对抗模型的情况下 是一些相互竞争以改善系统整体行为的代理 然而 现实世界中的许多认知问题是大群人建立的知识的结果 以自动驾驶汽车场景为例 任何座席的决策都是场景中许多其他座席
  • 遭遇难缠的病毒群ntldr.exe和c0nime.exe等,可杀

    据当事人说中毒后就上不了网了 我没有确认 每个硬盘分区下都有 Autorun inf和ntldr exe C Windows System 目录 下有 c0nime exe 那是数字0不是字母o 等若干个可疑的可执行文件 硬盘上N多exe可
  • Vue模板语法

    Vue js使用了基于HTML的模板语法 允许开发者声明式地将DOM绑定至底层Vue实例的数据 所有Vue js的模板都是合法的HTML 所以能够被遵循规范的浏览器和HTML解析器解析 在底层的实现上 Vue将模板编译成虚拟DOM渲染函数
  • Andorid与其他操作系统的知识

    安卓用的是LINUX的内核 利用LINUX的几个库 应用层运行JAVA虚拟机上 这点和iPhone很想 只不过 iphone是基于unix系统 是微内核结构 同样运行在java虚拟机上 所以 安卓只是一个linux的衍生系统 是LINUX的
  • Opecv检测多个圆形(霍夫圆检测,轮廓面积筛选,C/C++)

    主要是利用霍夫圆检测 面积筛选等完成多个圆形检测 具体代码及结果如下 第一部分是头文件 common h pragma once include
  • Springboot+Mybatis中typeAliasesPackage正则扫描实现

    mybatis默认配置typeAliasesPackage是不支持正则扫描package的 因此需要手动继承org mybatis spring SqlSessionFactoryBean 自己实现正则扫描 方法和传统的spring myb