实现一个自己的spring-boot-starter,基于SQL生成HTTP接口

server/2025/1/22 8:36:20/
http://www.w3.org/2000/svg" style="display: none;">

上一篇博文介绍了Spring Boot Starter,这次我们就实现一个自己的starter模块,引入了该模块,项目就自然具有了通过配置SQL自动生成HTTP接口的能力。
完整代码可以到github下载:https://github.com/chengpei/sqlapi-spring-boot-starter

需求来源

我们在做一些大屏类项目时往往会需要对接一些第三方的数据,提供一些HTTP接口给大屏的前端用于查询数据展示,而这些第三方的数据表可能命名不规范,数据格式不规范,如果基于别人的表生成代码写接口,可能会经常性的修改变动,所以这里最好的解决方案我认为是直接在数据库里配置sql,基于sql生成HTTP接口给前端使用,这样后续变动只需要修改配置的sql,不需要频繁更新代码。
这里我首先想到的是使用开源的解决方案,找了几个但是我觉得太重了,而且我们项目的接口也并不是全部通过sql都能解决的,有些需要对接第三方接口,所以决定自己实现一个简单版的SQL生成HTTP接口的模块,通过SpringBootStarter的方式引入,这样以后哪个项目有这样的需求直接引入即可。

功能介绍

项目中引入该模块后,启动你的项目代码,如果你的项目配置了MySql数据库及Spring-jdbc依赖,则模块会自动创建一张表t_api_generate_config,并初始化一条数据,启动完成后,项目会具有如下两个接口:

  1. http://localhost:8085/pageQuery/test?current=1&size=10
  2. http://localhost:8085/queryOne/test

接口最后的这个/test是接口后缀,是表t_api_generate_config的字段api_postfix的配置
第一个接口是分页接口,可以执行表里statement_content配置的sql分页返回
第二个接口是单条数据查询接口,要求表里statement_content配置的sql只能返回一条数据,查询效果如下:

https://i-blog.csdnimg.cn/img_convert/6d324e81420643d7c5f4fa65668dd96d.png" />https://i-blog.csdnimg.cn/img_convert/87b5466baed1943015dec83324a3211c.png" />

同时sql配置支持动态参数,基于freemarker标签配置动态条件,例如statement_content里配置如下SQL:

select * from t_api_generate_config a where 1=1  
<#if apiPostfix?? && apiPostfix != "">  and a.api_postfix = '${apiPostfix}'  
</#if>

这样就可以如下方式传参:
http://localhost:8085/pageQuery/test2?current=1&size=10&apiPostfix=test
和分页参数一样放在GET请求地址后即可

sqlapispringbootstarter_30">sqlapi-spring-boot-starter

这里首先给模块起一个名字,springboot官方似乎并不推荐使用spring-boot-starter-xxxx的命名方式来命名我们自己的starter模块,所以很多第三方的starter模块一般采用类似xxxx-spring-boot-starter格式来命名我们自己的starter模块,例如:dubbo-spring-boot-starter、grpc-spring-boot-starter等等,所以我们这个基于sql生成http接口的模块就叫sqlapi-spring-boot-starter吧

SqlapiAutoConfiguration

模块中最重要的一个类当然是SqlapiAutoConfiguration,他是自动配置的入口

@Configuration
@ConditionalOnClass({JdbcTemplate.class})
@EnableConfigurationProperties(SqlapiProperties.class)
@ComponentScans(@ComponentScan("top.chengpei.sqlapi.modules"))
@AutoConfigureAfter({JdbcTemplateAutoConfiguration.class})
public class SqlapiAutoConfiguration implements InitializingBean {private static final Logger logger = LoggerFactory.getLogger(SqlapiAutoConfiguration.class);private JdbcTemplate jdbcTemplate;public SqlapiAutoConfiguration(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}@Overridepublic void afterPropertiesSet() {Long count = jdbcTemplate.queryForObject("SELECT COUNT(1) FROM information_schema.TABLES WHERE table_name='t_api_generate_config'", Long.class);if (count > 0) {return;}logger.info("接口生成表初始化。。。");String createTableSql = "create table t_api_generate_config\n" +"(\n" +"    api_postfix       varchar(200) not null comment '接口后缀'\n" +"        primary key,\n" +"    api_name          varchar(100) not null comment '接口名称',\n" +"    statement_content text         not null comment 'sql语句'\n" +")";String initDataSql = "INSERT INTO t_api_generate_config (api_postfix, api_name, statement_content) VALUES ('test', '测试接口', 'select * from t_api_generate_config')";logger.info("创建表:");logger.info(createTableSql);jdbcTemplate.execute(createTableSql);logger.info("初始化数据:");logger.info(initDataSql);jdbcTemplate.execute(initDataSql);logger.info("接口生成表初始化完成。。。");}
}

这里比较重要的几个注解

  1. @ConditionalOnClass({JdbcTemplate.class}): 因为我们要执行sql,这里使用的是JdbcTemplate,所以需要环境中有这个类
  2. @AutoConfigureAfter({JdbcTemplateAutoConfiguration.class}):并且当前自动配置需要在JdbcTemplate配置好以后,因为要初始化表
  3. @ComponentScans(@ComponentScan(“top.chengpei.sqlapi.modules”)):增加要扫描的包,里面有Controller提供HTTP接口

下面的代码主要是初始化SQL配置表,这里只支持了MySql

spring.factories

有了自动配置类以后,还需要创建一个文件用于SpringFactoriesLoader加载,文件中加入以下代码即可:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\top.chengpei.sqlapi.autoconfigure.SqlapiAutoConfiguration

接口代码

以上代码配置添加好后,就可以写接口了,需要放在top.chengpei.sqlapi.modules包下,因为上面的自动配置类中指定的扫描该包,查询接口就不细说了,看看代码就好,这里也只支持了MySql,如果有兴趣的话可以在配置类top.chengpei.sqlapi.autoconfigure.SqlapiProperties里加上方言的配置,然后修改代码做不同数据库方言的支持。
完整代码可以到github下载:https://github.com/chengpei/sqlapi-spring-boot-starter


http://www.ppmy.cn/server/160404.html

相关文章

win32汇编环境,窗口程序中复杂列表框的应用举例

;运行效果 ;双击到根目录后 ;win32汇编环境,窗口程序中复杂列表框的应用举例 ;在窗口程序中生成复杂列表框,增加子项,删除某项,取得指定项内容,在列表框内展示某文件夹内的文件列表,选定某文件夹后双击打开,返回上层目录再打开等 ;直接抄进RadAsm可编译运行。重点部分加备…

天机学堂7--Redisson自定义注解AOP以及SPEL表达式实现分布式锁

文章目录 集群下的锁失效问题Redis中的setnx命令实现分布式锁setnx基本原理死锁问题利用Redis实现的简单分布式锁流程setnx的分布式锁的问题锁误删问题超时释放问题其它问题 Redisson基于注解的分布式锁工厂模式 选择锁类型策略模式提供 重试策略 失败策略组合基于SPEL的动态锁…

智谱四大免费模型GLM-4-FLASH系列

1、智谱四大免费模型 模型类型 智谱AI目前发布了四大免费模型&#xff0c;分别是文本模型GLM-4-Flash&#xff0c;图片识别模型GLM-4V-Flash&#xff0c;图片生成模型CogView-3-Flash&#xff0c;视频生成模型CogVideoX-Flash。 产品线全面性 智谱AI是目前国内模型厂商中产品…

TensorFlow深度学习实战——情感分析模型

TensorFlow深度学习实战——情感分析模型 0. 前言1. IMDB 数据集2. 构建情感分析模型3. 预测输出相关链接 0. 前言 情感分析 (Sentiment Analysis) 是一种自然语言处理 (Natural Language Processing, NLP) 技术&#xff0c;旨在分析和识别文本中的情感倾向&#xff0c;情感分…

2024年,我的技术探索与成长之路

2024年&#xff0c;我的技术探索与成长之路 2024年已经过去&#xff0c;作为一名技术爱好者和写作者&#xff0c;我回顾了过去一年在博客上记录的点滴&#xff0c;感慨良多。这一年&#xff0c;我不仅见证了技术的飞速发展&#xff0c;也在不断学习和实践中找到了自己的成长方向…

uc/os-II 原理及应用(八) 系统裁减以及移植到51单片机-下

现在说明几个重要的点&#xff0c; OSStartHighRdy 的作用就是把任务栈复制到系统栈上面&#xff0c;再利用RET的时候会从系统栈上到一个地址放到PC寄存器上来实现任务运行。OSCtxSw是任务切换&#xff0c;把系统栈全部备份到当前任务栈映射上&#xff0c;然后改OSTCBCur,调用…

模拟飞行入坑(五) P3D 多通道视角配置 viewgroup

背景&#xff1a; P3D进行多个屏幕显示的时候&#xff0c;如果使用英伟达自带的屏幕融合成一个屏&#xff0c;或者使用P3D单独拉伸窗口&#xff0c;会使得P3D的画面被整体拉伸&#xff0c;又或者,当使用Multichannel进行多个设备联动时&#xff0c;视角同步组合需要配置&#…

数据结构(初阶)(一)----算法复杂度

算法复杂度 算法复杂度数据结构算法算法效率复杂度的概念 数据结构 数据结构(Data Structure)是计算机存储、组织数据的⽅式&#xff0c;指相互之间存在⼀种或多种特定关系的数据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤&#xff0c;所以我们要学各式各样的数据结…