启动程序触发器-项目启动建表

一、需求

  • 在项目启动时,自动新建数据表

二、实现思路

  • 创建触发类

  • 实现SpringBoot的ApplicationRunner接口

  • 编写建表语句常量

  • 实现run方法,并在run方法中使用JDBC工具类的建表方法,传入建表语句常亮,完成建表

三、代码实现(末尾附完整代码)

  • 创建触发类,实现ApplicationRunner接口
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.HashMap;/*** 项目启动的程序触发器** @author Odinpeng* @since 2023/11/29**/@Slf4j
@Component
@Order(0) //表示触发的顺序,越小越靠前
public class TableBuildingTrigger implements ApplicationRunner {}

注:

  • 一个项目可以有多个启动触发器

  • @Order的value属性表示启动触发器的执行顺序

  • value属性越小,该启动触发器的执行顺序越靠前(可以为负数)

  • 编写建表语句常量
    // 建表语句1private static final String USER_TABLE = "CREATE TABLE user_table "+ "( id Integer NOT NULL COMMENT 'id',"+ " username varchar(20) NOT NULL COMMENT '用户名',"+ " password varchar(4) NOT NULL COMMENT '密码',"+ " PRIMARY KEY (id) ) COMMENT='用户表'";// 建表语句2private static final String ORDER_TABLE = "CREATE TABLE order_table "+ "( id Integer NOT NULL COMMENT 'id',"+ " orderName varchar(20) NOT NULL COMMENT '订单名',"+ " price Integer NOT NULL COMMENT '价格',"+ " PRIMARY KEY (id) ) COMMENT='订单表'";
  • 引入JDBC工具类,实现ApplicationRunner接口的run方法完成建表
	// 重写run方法@Overridepublic void run(ApplicationArguments args) throws Exception {// 将表名和建表语句存入mapHashMap<String, String> tableMap = new HashMap<String, String>() {{put("user_table", USER_TABLE);put("order_table", ORDER_TABLE);}};// 遍历建表tableMap.forEach((key, value) -> {//执行建表方法,在建表方法中判断当前表是否存在if (!checkTable(key, value)) {log.error("初始化{}核心配置表失败,执行sql:{}", key, value);throw new BizException("建表失败");}});}/*** 检查表是否存在,不存在新建表** @param tableName 表名* @param createSql 建表语句* @return*/private boolean checkTable(String tableName, String createSql) {// 查询指定表名的数量String sql = "select count(table_name) from information_schema.tables where table_name like '%s'";// 将表名动态拼接到以上sql中String querySql = String.format(sql, tableName);Integer total = jdbcTemplate.queryForObject(querySql, Integer.class);// 若查询指定表名的数量<=0,说明当前表不存在,则新增表if (total <= 0) {// 查询当前数据库版本String versionSql = "select version()";String version = jdbcTemplate.queryForObject(versionSql, String.class);// 若当前数据库版本为5.7开头,则将字符集由"utf8mb4"替换为"utf8"(MySQL5.7默认字符集是"utf8mb4",支持4字节字符,而utf8支持3字节)if (version.startsWith("5.7")) {createSql = createSql.replaceAll("utf8mb4", "utf8");}// 新建表int update = jdbcTemplate.update(createSql);if (update <= 0) {return false;}}return true;}

四、完整代码

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.HashMap;/*** 项目启动的程序触发器** @author Odinpeng* @since 2023/11/29**/@Slf4j
@Component
@Order(0) //表示触发的顺序,越小越靠前
public class TableBuildingTrigger implements ApplicationRunner {// 引入JDBC工具类,用于建表和查询表是否存在@Resourceprivate JdbcTemplate jdbcTemplate;// 建表语句1private static final String USER_TABLE = "CREATE TABLE user_table "+ "( id Integer NOT NULL COMMENT 'id',"+ " username varchar(20) NOT NULL COMMENT '用户名',"+ " password varchar(4) NOT NULL COMMENT '密码',"+ " PRIMARY KEY (id) ) COMMENT='用户表'";// 建表语句2private static final String ORDER_TABLE = "CREATE TABLE order_table "+ "( id Integer NOT NULL COMMENT 'id',"+ " orderName varchar(20) NOT NULL COMMENT '订单名',"+ " price Integer NOT NULL COMMENT '价格',"+ " PRIMARY KEY (id) ) COMMENT='订单表'";@Overridepublic void run(ApplicationArguments args) throws Exception {// 将表名和建表语句存入mapHashMap<String, String> tableMap = new HashMap<String, String>() {{put("user_table", USER_TABLE);put("order_table", ORDER_TABLE);}};// 遍历建表,并查询表是否存在tableMap.forEach((key, value) -> {//执行建表方法,在建表方法中判断当前表是否存在if (!checkTable(key, value)) {log.error("初始化{}核心配置表失败,执行sql:{}", key, value);throw new BizException("建表失败");}});}/*** 检查表是否存在,不存在新建表** @param tableName 表名* @param createSql 建表语句* @return*/private boolean checkTable(String tableName, String createSql) {// 查询指定表名的数量String sql = "select count(table_name) from information_schema.tables where table_name like '%s'";// 将表名动态拼接到以上sql中String querySql = String.format(sql, tableName);Integer total = jdbcTemplate.queryForObject(querySql, Integer.class);// 若查询指定表名的数量<=0,说明当前表不存在,则新增表if (total <= 0) {// 查询当前数据库版本String versionSql = "select version()";String version = jdbcTemplate.queryForObject(versionSql, String.class);// 若当前数据库版本为5.7开头,则将字符集由"utf8mb4"替换为"utf8"(MySQL5.7默认字符集是"utf8mb4",支持4字节字符,而utf8支持3字节)if (version.startsWith("5.7")) {createSql = createSql.replaceAll("utf8mb4", "utf8");}// 新建表int update = jdbcTemplate.update(createSql);if (update <= 0) {return false;}}return true;}
}

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

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

相关文章

牛客剑指offer刷题位运算篇

文章目录 不用加减乘除做加法题目思路代码实现 二进制中1的个数题目思路代码实现 数值的整数次方题目思路代码实现 不用加减乘除做加法 题目 设计一个函数把两个数字相加。不得使用 或者其他算术运算符。 示例: 输入: a 1, b 1 输出: 2 提示&#xff1a; a, b 均可能是负…

使用Git客户端向gitee免密推送项目代码(保姆级流程哦)

1.进入Git官网手动下载git的客户端可执行程序 一路next即可 2.找到安装路径下的3.进入git-bash 根据如下的代码一次执行只需要修改对应的username和自己再gitee中绑定的邮箱 4.分发私钥到邮箱 产生私钥的时候回车三次即可&#xff1b;查看私钥如下图及正常&#xff1b; 5.进…

文生图领域经典-ControlNet介绍

引言 2023年的计算机视觉领域顶级学术会议ICCV上&#xff0c;一篇颠覆文生图AI领域的论文《Adding Conditional Control to Text-to-Image Diffusion Models》——ControlNet 荣膺最佳论文奖(Marr奖)。 自开源以来&#xff0c;ControlNet已经在GitHub上揽获25k星。无论是对扩…

vue项目多个不同的服务器请求地址管理

vue项目多个不同的服务器请求地址管理 在vue项目开发过程中&#xff0c;获取不同的数据可能会出现需要请求多个不同服务器地址的域名&#xff0c;这个时候需要对不同域名的请求地址进行管理以及跨域的代理。 一、单服务器域名地址的跨域代理和请求配置&#xff1a; 跨域配置&…

C#:程序发布的大小控制

.net不讨喜有个大原因就是.net平台本身太大了&#xff0c;不同版本没有兼容性&#xff0c;程序依赖哪个版本用户就要安装哪个版本&#xff0c;除非你恰好用的是操作系统默认安装的版本——问题是不同版本操作系统默认安装的不一样。 所以打包程序就很头疼&#xff0c;不打包平台…

深度解读:为什么要做数据合规?如何做到数据合规?

数据资源“入表”在即&#xff0c;企业更需筑牢数据合规防线。但企业主企业购买数据、获取数据到底是否合法合规&#xff0c;入表如何防范合规风险&#xff1f;上周三&#xff0c;亿信华辰邀请到北京鑫诺律师事务所高级合伙人、管委会副主任武婕将和大家分享《数据入表法律合规…

每天五分钟计算机视觉:经典架构的力量与启示

在深度学习和计算机视觉领域,卷积神经网络(Convolutional Neural Networks,简称CNN)无疑是最为经典的架构之一。近年来,随着研究的不断深入和新架构的不断涌现,许多初学者可能会忽视这些经典架构的重要性。然而,理解并学习这些经典架构,对于我们深入理解卷积神经网络的…

Docker+Anaconda+CUDA+cuDNN

一、导语 因为要复现文献的需求和实验室里师兄想要给我提升能力的多方面因素在一起&#xff0c;所以学习并实现了相关安装。在这里做一个记录&#xff0c;方便日后查看&#xff0c;如果能给其他同学带来便捷就更好了。 在这篇文章中&#xff0c;我的目标是搭建一个可以使用Py…

鸿蒙4.0开发笔记之ArkTS语法的基础数据类型[DevEco Studio开发](七)

文章目录 一、基本数据类型的定义1、变量声明2、数字类型3、字符串类型4、布尔类型5、数组类型6、元组类型7、枚举类型8、联合类型&#xff08;少用&#xff09;9、未知Unkown类型10、未定义和空值类型 二、数据类型的使用1、组件内部声明变量不需要使用let关键字2、使用Divide…

从戴森发明的“球轮手推车”看专利

今天跟大家分享一个特别有意思的专利&#xff0c;那就是戴森发明的球状轮子的手推车。 相信戴森这个品牌很多人都听过&#xff0c;大家熟悉的应该是戴森吹风机和戴森吸尘器。这两个目前是市场上比较高端的家用设备。 很多人也正是因为这些家用设备了解到戴森这个人&#xff0…

有权图的最短路径算法

目录 单源最短路径问题 Dijkstra算法 原理 ​ 获得最短路径长度的Dijkstra代码实现 时间复杂度 算法优化 优先队列优化后的代码实现 时间复杂度 可以具体获得最短路径的Dijkstra代码实现 Bellman-Ford算法 原理 代码实现 Floyed算法 原理 代码实现 单源最短路…

YouTube宣布要求披露AI生成的内容并添加标签

不知道大家在逛YouTube的时候有没有刷到过一些画面和人物看起来不太自然的视频。 没错&#xff0c;这些视频里面的画面和人物可能都是由AI生成的。 近日&#xff0c;YouTube 产品管理副总裁在官方博客文章上表示&#xff1a;生成式 AI 有潜力在 YouTube 上激发创造力&#xff…

IBNR详解及基于R的计算逻辑

一、什么是IBNR IBNR是英文“Incurred But Not Reported”的缩写&#xff0c;中文意思是“已发生未报案未决赔款准备金”。它通常用在保险和金融领域&#xff0c;描述的是非寿险保险事故已经发生&#xff0c;但尚未向保险公司提出索赔的赔案而提取的准备金。 二、IBNR的提取流…

11:kotlin 类和对象 -- 普通类

前面粗咯的讲了类&#xff0c;这篇详细介绍类及相关的概念 定义类使用关键字class class Person { /*...*/ }类声明由类名、类头&#xff08;指定其类型参数、主构造函数等&#xff09;和由{}包围的类体组成。类头和类体都是可选的&#xff1b;如果类没有体&#xff0c;可以省…

vue.draggable拖拽——岗位切换如何判断?

有一个业务场景&#xff1a;把一个单位的某个岗位的人&#xff0c;从某某市A岗位调离出来后&#xff0c;又拖拽回去&#xff0c;如果是回到某某市A岗位&#xff0c;则没有变化&#xff0c;若是换了岗位&#xff0c;则会把色块变成红色&#xff0c;表示岗位的变化。 方法一&…

Maven 介绍

文章目录 什么是 maven为什么要选择mavenmaven 仓库什么是maven中央仓库什么是maven本地仓库 idea如何创建出maven项目如何引入第三方库依赖配置国内源 下载 Maven Helper 插件查看各个项目之间的依赖关系 什么是 maven Maven是 Apache 下的一个纯 Java 开发的开源项目&#x…

DDD 系统间的七种关系梳理与实践

系统间的七种关系 本节将根据耦合度从高到低逐一探讨这些关系。耦合度高有时并不是坏事&#xff0c;它能够让团队内部的系统更加内聚&#xff0c;而不是无法整合的碎块。我们应该根据具体情况进行选择。 因为系统间关系往往也是组织架构的反映&#xff0c;此处每种关系除了描…

超卓航科聚国内外专家学者,共推冷喷涂技术的发展与应用

11月24日——26日&#xff0c;冷喷涂技术及其在增材制造中的应用专题会在襄阳召开&#xff0c;来自国内外200多名科技工作者齐聚一堂&#xff0c;共同交流冷喷涂技术的研究与应用。 本次专题研讨会由中国机械工程学会表面工程分会主办&#xff0c;湖北超卓航空科技股份有限公司…

【EasyExcel实践】导出多个sheet到多个excel文件,并压缩到一个zip文件

文章目录 前言正文一、项目依赖二、封装表格实体和Sheet实体2.1 表格实体2.2 Sheet实体 三、核心实现3.1 核心实现之导出为输出流3.2 web导出3.3 导出为字节数组 四、调试4.1 构建调试用的实体类4.2 控制器调用4.3 测试结果 五、注册大数转换器&#xff0c;长度大于15时&#x…

webGL开发虚拟实验室

开发虚拟实验室是一个具有挑战性但也非常有趣和有价值的任务。通过 WebGL&#xff0c;你可以创建交互式、沉浸式的虚拟实验室&#xff0c;使用户能够进行实验和学习。以下是一些步骤和关键考虑因素&#xff0c;帮助你开始开发虚拟实验室&#xff0c;希望对大家有所帮助。北京木…