SpringBoot自定义初始化sql文件 支持多类型数据库

news2024/11/18 9:29:16

我在resources目录下有init.sql初始化sql语句
在这里插入图片描述
指定sql文件的地址
在这里插入图片描述

sql内容如下:

/*角色表*/
INSERT INTO #{schema}ccc_base_role (id, create_time, create_user_id, is_delete, role_name, status, update_time, update_user_id) VALUES('b89e30d81acb88448d412b7b196bf02e', '1710896575106', 'f1fe2f289b8646ced1bc0294a2bf6d09', 0, '超级管理员', 0, '1714467132605', 'f1fe2f289b8646ced1bc0294a2bf6d09');
  • #{schema}用来指定数据库的视图 因为国产有些数据库新增数据时想要指定视图

java初始化代码如下:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zhou.starter.jpacomment.service.AlterCommentService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ResourceLoader;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * @author lcz
 * @desc 数据初始化器
 * @mail lcz_0130@163.com
 * @date 2024/05/11
 */

@Component
@Slf4j
public class DataInitializerConfig {

    @Resource
    private JdbcTemplate jdbcTemplate;
    @Autowired
    private ResourceLoader resourceLoader;
    @Resource
    private DataInitializerMapper dataInitializerMapper;
    @Resource
    private AlterCommentService alterCommentService;
	//这里是sql文件的目录
    @Value("${init.file}")
    String initFile;
    //存在多个服务共同使用 就用服务名进行判断是否初始化
    @Value("${spring.application.name}")
    String serviceName;

    @PostConstruct
    public void initData() {
        //判断是否执行初始化sql文件
        List<DataInitializer> dataInitializers = dataInitializerMapper.selectList(new QueryWrapper<DataInitializer>().eq("service_name", serviceName));
        if (!dataInitializers.isEmpty()) {
            log.info("数据库已经初始化完成");
            return;
        }
        try {
            // 读取原始文件
            BufferedReader reader = new BufferedReader(new InputStreamReader(resourceLoader.getResource(initFile).getInputStream(), StandardCharsets.UTF_8));
            String line;
            //获取视图 可以通过命令查询 也可以通过导入我的jpacomment库 自动获取
            String schema = alterCommentService.getSchema();
            if (StringUtils.isNotBlank(schema)) {
                schema += ".";
            }
            while ((line = reader.readLine()) != null) {
                // 替换字符串
                String newLine = line.replace("#{schema}", schema);
                //如果newLine以/*开头就是注释文件不执行
                if (newLine.startsWith("/*")) {
                    continue;
                }
                // 注意:每行都是一个完整的SQL语句
                jdbcTemplate.execute(newLine);
            }
            log.info("文件初始化替换完成");
            // 关闭流
            reader.close();
        } catch (IOException e) {
            throw new ServerException(GlobalErrorCodeConstants.SQL_INIT_ERROR);
        }
        //设置系统初始化完成
        DataInitializer dataInitializer = new DataInitializer();
        dataInitializer.setServiceName(serviceName);
        dataInitializerMapper.insert(dataInitializer);
        log.info("{}数据库初始化信息完成", serviceName);
    }
}
@Data
@TableName("ccc_base_data_initializer")
@Table(name = "ccc_base_data_initializer")
@Entity
@TableComment("初始化表")
public class DataInitializer implements Serializable {
    @Id
    @TableId(type = IdType.ASSIGN_UUID)
    @ColumnComment("主键id")
    private String id;
    @ColumnComment("服务名")
    private String serviceName;
}

下载开源库 直接打包即可
https://gitee.com/lcz2000/zhou-jpacomment

            <!--数据库表注释-->
            <dependency>
                <groupId>com.zhou</groupId>
                <artifactId>zhou-jpacomment</artifactId>
                <version>1.0.0</version>
            </dependency>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1664971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷粒商城实战(023 业务-订单模块-页面和幂等性等校验)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第270p-第p283的内容 简介 远程调用的服务已经注册到了注册中心 校验 幂等性校验 拿令牌 读令牌 删令牌 要实现 原子性 在一个事务中 添加令牌…

小红书·电商运营课:小红书开店流程,小红书电商如何运营(18节视频课)

课程目录 第1节课:学习流程以及后续实操流程注意事项 第2节课:小红书店铺类型解析以及开店细节 第3节课:小红书电商运营两种玩法之多品店铺解析 第4节课:小红书电商运营两种玩法之单品店铺解析 第5节课:选品课(多品类类目推荐) 第6节课:选品课(多品类类目推荐) 第7节课:…

以C++为核心语言的高频交易系统是如何做到低延迟的?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 c的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 问题中限定语言是C&#xff0c;可…

自动驾驶中的神经辐射场:综述

24年4月清华大学论文“Neural Radiance Field in Autonomous Driving: A Survey”。 神经辐射场&#xff08;NeRF&#xff09;由于其固有的优势&#xff0c;特别是其隐式表示和新视图合成能力&#xff0c;引起了学术界和工业界的广泛关注。 随着深度学习的快速发展&#xff0c…

最少数量线段覆盖-华为OD

系列文章目录 文章目录 系列文章目录前言一、题目描述二、输入描述三、输出描述四、java代码五、测试用例 前言 本人最近再练习算法&#xff0c;所以会发布一些解题思路&#xff0c;希望大家多指教 一、题目描述 给定坐标轴上的一组线段&#xff0c;线段的起点和终点均为整数…

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习

ICode国际青少年编程竞赛- Python-4级训练场-列表综合练习 1、 Flyer[3].step(1) Flyer[7].step(2) Flyer[11].step(1) for i in range(4):Flyer[i * 2].step(1) Flyer[8].step(3)for i in range(3):Dev.turnRight()Dev.step(-5)2、 for i in range(5):Flyer[i5].step(Flyer[…

如何通过AI技术实现员工培训的革命性变革

AI个性化培训&#xff1a;开启员工潜力的新篇章 在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的影响力已经渗透到社会的各个层面&#xff0c;包括教育与培训行业。AI技术正在彻底改变我们获取知识与技能的方式&#xff0c;特别是在员工培训领域…

upload组件封装,支持拖拽文件上传

一、组件封装需要注意什么? 组件化思想:组件应该是独立的、可复用的部件,应该遵循单一职责原则,将组件的功能划分得尽可能细致。 API 设计:组件的 API 设计要合理,要考虑到组件的可定制性和易用性。应该尽可能的提供必要的配置项和事件回调,同时避免提供过多的 API,导…

Python Supervisor助力代码后台运行

大家好&#xff0c;Supervisor 是一个 C/S 架构的进程监控与管理工具&#xff0c;本文将主要介绍其基本用法和部分高级特性&#xff0c;用于解决部署持久化进程的稳定性问题。 1.问题场景 在实际的工作中&#xff0c;往往会有部署持久化进程的需求&#xff0c;比如接口服务进…

BOOT程序与APP程序的RAM共享问题与栈顶地址判断合法

一、我们在进行BOOT程序和APP程序&#xff0c;会想到这里面的RAM他们之间是怎么分配的&#xff0c;会不会有冲突&#xff1f; 答案是&#xff1a;从BOOT程序跳转到APP程序后&#xff0c;相当于执行了新的程序&#xff0c;所以BOOT里边的内存是全部释放了。所以是相互不影响的 …

硬件 - TL431计算

文章目录 1 . 概要2 . TL431内部3 . TL431应用电路4 . TL431计算5 . 小结 【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 概要 1 . TL431常用于通过外围电阻R1,R2设置输出一个目标电压 2 . TL431内部 3 . TL431应用电路 1 . R1 1K&#xf…

web前端之sass中的颜色函数、active按钮激活、hover鼠标悬浮、disabled禁用、scss循环、css

MENU 效果图htmlsassscss编译后的css页面css 效果图 注意查看蓝色按钮。 html <div class"box"><button class"btn type_1">按钮</button><button class"btn type_2">按钮</button><button class"btn ty…

修改表空间对应数据文件的大小

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 表空间与数据文件紧密相连&#xff0c;相互依存&#xff0c;创建表空间的时候需设置数据文件大小。 在后期实际应用中&#xff0c;如果实际存储的数据量超出事先设置的数据…

Threejs Shader动态修改Merge合并几何体中单个Mesh的颜色

目录 Merge合并 现象 思路 实现 为单个geometry添加映射 通过id检索Merge后的Geometry映射属性&#xff0c;获取顶点坐标 onBeforeCompile修改编译前材质的着色代码 编译前材质的顶点着色代码 编译前材质的片元着色代码 着色器代码 注意 效果 Merge合并 mergeBuf…

Postgresql中JIT函数能否inline的依据function_inlinable

相关 《Postgresql源码&#xff08;128&#xff09;深入分析JIT中的函数内联llvm_inline》 《LLVM的ThinLTO编译优化技术在Postgresql中的应用》 前置阅读&#xff1a;《Postgresql源码&#xff08;128&#xff09;深入分析JIT中的函数内联llvm_inline》 在JIT inline函数的过…

2024高安全个人密码本程序源码,贴身密码管家-随机密码备忘录二代密码

项目概述&#xff1a; 在这个网络高度发展的时代&#xff0c;每个人都需要上网&#xff0c;而上网就不可避免地需要使用账号和密码。 在众多账号的情况下&#xff0c;你是否还在为复杂难记的密码感到烦恼&#xff1f;现在只需要记录一次&#xff0c; 就可以随时查看你的密码…

用websocket实现一个简单的im聊天功能

WebSocket前后端建立以及使用-CSDN博客 经过我上一篇的基本理解websocket的建立以及使用后&#xff0c;这篇就写一个简单的demo 实现im聊天 首先就是后端代码&#xff0c;详细解释我都放到了每一句的代码解析了&#xff0c;文章最后我会说怎么运行流程 放置后端代码 packa…

半小时搞懂STM32面经知识点——系统架构与启动流程

1.Cortex-M系统 1.1系统结构 1.处理器核心&#xff1a; Cortex-M3 2.存储器系统&#xff1a; Flash&#xff0c;SRAM&#xff0c;FSMC等 3.总线接口&#xff1a; 核心通过总线接口与外设设备和存储器进行通信。 总线矩阵&#xff1a;总线矩阵是一种硬件结构&#xff0c;用于连…

libcity笔记:

1 __init__ 2 encode 得到的内容如下&#xff1a; data_feature的内容&#xff1a; 一共有多少个location1【包括pad的一个】最长的时间间隔&#xff08;秒&#xff09;最长的距离间隔&#xff08;千米&#xff09;多少个useer idpadding 的locationidpad_item的内容 location…

社交媒体数据恢复:飞书

飞书数据恢复过程包括以下几个步骤&#xff1a; 确认数据丢失&#xff1a;首先要确认数据是否真的丢失&#xff0c;有时候可能只是被隐藏或者误操作删除了。 检查回收站&#xff1a;飞书中删除的文件会默认保存在回收站中&#xff0c;用户可以通过进入回收站找到被删除的文件&…