不用写代码就可以创建HTTP API,开源项目DBAPI推荐

背景

  • 在互联网业务开发中,其实有很多时候HTTP接口的逻辑就是sql执行,典型场景比如报表系统,报表的api逻辑就只是sql执行而已,但是我们开发起来要写很多代码
  • 以java springboot项目为例,要写controller、service、mapper、entity、domain、dto,其实写这些代码都是重复性的工作,有没有办法可以只写sql就自动生成http协议的API呢?今天推荐一个开源项目就是做这个事的

开源地址: https://gitee.com/freakchicken/db-api

使用介绍

  • 只需要填写sql,和接口对应的地址和参数,选择DB地址,就可以生成接口

  • 同时还支持接口的分组管理

  • 支持接口的权限控制,只需要创建token,并给token授权可以访问哪些API

    • 还可以在页面上直接进行API访问测试
  • 有人会说,我的项目不是报表系统,API内容不只是sql执行,还要用代码对数据做一些其他转换,比如字段加密脱敏,那怎么办?

    不要急,DBAPI支持数据转换插件,通用的逻辑可以写成插件,只需要在API上配置插件信息就可以,以后API每次被访问的时候就会执行插件中的加密转换。

    具体可以查看插件开发文档

  • 又有人说了,我的项目代码哪有这么简单,每个接口里的逻辑都不一样,那DBAPI有什么用?

    仍然有用,使用 dbApi-spring-boot-starter框架可以把DBAPI集成进你自己的springboot项目,你的复杂API继续写你的代码(controller、service、mapper、dto、entity)。对于sql执行类的简单API,你就可以只用在xml中写sql和数据源地址就够了,大大降低代码量。

进阶功能

缓存

  • 对于报表业务而言,sql查询结果进行缓存也是一个常用的功能,DBAPI通过缓存插件来支持
  • 你可以自己编写缓存插件,将数据写入mangoDB/es/redis等等,非常灵活。
  • 你可以为每个API单独指定缓存插件,比如有的API查询结果我想缓存到redis,有的API查询结果我想缓存到es,有的想缓存一小时,有的想永久缓存,都可以通过指定不同的缓存插件来实现
    具体可以查看插件开发文档

动态sql

  • DBAPI支持类似mybatis的动态sql语法,同时可以在页面上方便的调试sql,包括调试动态sql

建立企业级数据接口中心的思考

  • 对一个程序员而言,DBAPI只是一个低代码开发工具,而对于一个企业而言,DBAPI能做更大的事——建立企业级的数据接口中心

  • 比如一个企业,有成千上万个数据查询的接口,一个接口内的sql几千甚至上万行,业务非常复杂,其中有的sql经手了五六个人的改造(因为人员离职、换岗)。这些接口的管理就会产生一些复杂的问题。

    1.新入职的员工接手了一个报表开发,有个数据查询的sql假设几千行,自己开发可能要好几天,但事实上已经有前人开发过了,可以复用,那去哪里查询这个接口呢?去代码里一行行找吗?如果代码没有注释怎么找?

    2.原先的报表使用某个报表工具(比如帆软)开发,现在想换个工具,或者想自己重新写前端页面开发,那之前在帆软里写好的sql就要一个个复制过来,重新写到后端接口代码里,还要改造sql,去除帆软里一些特有的语法,多麻烦。

    3.原先有的数据查询接口开放给了A部门的某个软件系统,后来A部门被拆分,要对该软件系统取消授权,并进行新的授权,如何在不改动代码的情况下进行?

    4.新的部门现在要新开发软件系统B、软件系统C,BC都要调用一些数据查询接口,而这些sql非常复杂,只有业务部门的人会写,而且开发周期很长,对于这样的sql查询接口是否可以放在一个可查询的地方,供其他软件系统专门调用?

  • 基于以上问题,作者认为企业是非常有必要建立自己统一的数据接口中心(注意不是数据中心)。推荐把数据查询sql封装成接口统一管理,每个接口的功能是什么?参数是什么?都可以方便的搜索到。如果哪个业务系统想调用,只需要申请token,并对token授权访问相应的接口。同时还可以一键导出接口文档给申请方。这种统一管理的思想会极大的降低企业内部的重复工作,并且保证数据使用的准确性。

  • 当然这一切都是针对企业内部的数据业务极其复杂的情况下。

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 好的,以下是一份最全的MybatisPlus代码生成器: ```java package com.example.generator; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.*; import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert; import com.baomidou.mybatisplus.generator.config.po.TableFill; import com.baomidou.mybatisplus.generator.config.po.TableInfo; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; import java.util.ArrayList; import java.util.List; public class CodeGenerator { public static void main(String[] args) { // 代码生成器 AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java"); gc.setAuthor("your name"); gc.setOpen(false); gc.setFileOverride(true); gc.setBaseResultMap(true); gc.setBaseColumnList(true); gc.setEntityName("%sDO"); gc.setMapperName("%sDao"); gc.setXmlName("%sMapper"); gc.setDateType(DateType.ONLY_DATE); gc.setIdType(IdType.ID_WORKER); mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setDbType(DbType.MYSQL); dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&useSSL=false&characterEncoding=utf8"); dsc.setDriverName("com.mysql.jdbc.Driver"); dsc.setUsername("root"); dsc.setPassword("root"); dsc.setTypeConvert(new MySqlTypeConvert()); mpg.setDataSource(dsc); // 包配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.example"); pc.setEntity("entity"); pc.setMapper("dao"); pc.setXml("mapper"); pc.setService("service"); pc.setServiceImpl("service.impl"); pc.setController("controller"); mpg.setPackageInfo(pc); // 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setEntityLombokModel(true); strategy.setRestControllerStyle(true); strategy.setSuperEntityClass("com.example.common.BaseDO"); strategy.setSuperMapperClass("com.baomidou.mybatisplus.core.mapper.BaseMapper"); strategy.setSuperServiceClass("com.baomidou.mybatisplus.extension.service.IService"); strategy.setSuperServiceImplClass("com.baomidou.mybatisplus.extension.service.impl.ServiceImpl"); strategy.setSuperControllerClass("com.example.common.BaseController"); strategy.setInclude("user"); strategy.setControllerMappingHyphenStyle(true); List<TableFill> tableFillList = new ArrayList<>(); tableFillList.add(new TableFill("gmt_create", FieldFill.INSERT)); tableFillList.add(new TableFill("gmt_modified", FieldFill.INSERT_UPDATE)); strategy.setTableFillList(tableFillList); strategy.setVersionFieldName("version"); strategy.setLogicDeleteFieldName("deleted"); mpg.setStrategy(strategy); // 模板配置 TemplateConfig templateConfig = new TemplateConfig(); templateConfig.setEntity("/templates/entity.java"); templateConfig.setService("/templates/service.java"); templateConfig.setServiceImpl("/templates/serviceImpl.java"); templateConfig.setController("/templates/controller.java"); templateConfig.setMapper("/templates/mapper.java"); templateConfig.setXml("/templates/mapper.xml"); mpg.setTemplate(templateConfig); // 自定义模板引擎,需要引入相应的依赖 mpg.setTemplateEngine(new FreemarkerTemplateEngine()); // 模板引擎需要的属性配置 TemplateConfig tc = new TemplateConfig(); tc.setXml(null); mpg.setTemplate(tc); // 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值 InjectionConfig injectionConfig = new InjectionConfig() { @Override public void initMap() { // to do nothing } }; // 自定义输出配置 List<FileOutConfig> focList = new ArrayList<>(); // 自定义配置会被优先输出 focList.add(new FileOutConfig("/templates/mapper.xml.vm") { @Override public String outputFile(TableInfo tableInfo) { // 自定义输入文件名称 return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper.xml"; } }); injectionConfig.setFileOutConfigList(focList); mpg.setCfg(injectionConfig); // 执行生成 mpg.execute(); } } ``` 其中,需要根据实际情况修改数据库连接信息、包名、表名等参数。执行 main 方法即可生成相应的代码。该代码生成器包含了MybatisPlus的所有常用配置,并且使用了自定义模板引擎和输出配置实现更灵活的代码生成。 ### 回答2: MyBatis Plus是一个基于MyBatis的优秀的持久层框架,它提供了很多便捷的开发工具,包括代码生成器。下面是一份最全的MyBatis Plus代码生成器的示例代码: 首先,引入相关的依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>最新版本</version> </dependency> ``` 创建一个Generator类,配置代码生成器的相关参数: ```java public class Generator { public static void main(String[] args) { // 1. 全局配置 GlobalConfig globalConfig = new GlobalConfig(); globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java"); globalConfig.setAuthor("Your Name"); globalConfig.setOpen(false); // 2. 数据源配置 DataSourceConfig dataSourceConfig = new DataSourceConfig(); dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/db_name"); dataSourceConfig.setDriverName("com.mysql.jdbc.Driver"); dataSourceConfig.setUsername("root"); dataSourceConfig.setPassword("password"); // 3. 策略配置 StrategyConfig strategyConfig = new StrategyConfig(); strategyConfig.setNaming(NamingStrategy.underline_to_camel); strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel); strategyConfig.setEntityLombokModel(true); // 4. 包名配置 PackageConfig packageConfig = new PackageConfig(); packageConfig.setParent("com.example"); packageConfig.setModuleName("demo"); // 5. 代码生成器配置 AutoGenerator autoGenerator = new AutoGenerator(); autoGenerator.setGlobalConfig(globalConfig); autoGenerator.setDataSource(dataSourceConfig); autoGenerator.setStrategy(strategyConfig); autoGenerator.setPackageInfo(packageConfig); // 6. 执行代码生成器 autoGenerator.execute(); } } ``` 在上面的代码中,我们配置了全局属性、数据源属性、策略配置和包名配置,然后创建了一个代码生成器对象并执行生成代码的操作。 以上就是一份使用MyBatis Plus的最全的代码生成器示例,你可以根据自己的需求,修改相关配置来生成需要的代码。 ### 回答3: MyBatis Plus是一款开源的持久层框架,提供了丰富的功能和便利的API,能够极大地简化数据库操作。下面是一份使用MyBatis Plus的完整代码生成器。 首先,我们需要引入MyBatis Plus的依赖包到项目中。可以使用Maven或Gradle配置文件添加以下依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>x.x.x</version> </dependency> ``` 接下来,创建一个代码生成器类,用于配置和生成代码代码生成器可以通过读取数据库表结构自动生成实体类、Mapper接口和XML映射文件。 ```java public class CodeGenerator { public static void main(String[] args) { // 数据源配置 String url = "jdbc:mysql://localhost:3306/database"; String username = "root"; String password = "123456"; String driverName = "com.mysql.jdbc.Driver"; // 数据源 DataSourceConfig dataSourceConfig = new DataSourceConfig(); dataSourceConfig.setDbType(DbType.MYSQL); dataSourceConfig.setUrl(url); dataSourceConfig.setUsername(username); dataSourceConfig.setPassword(password); dataSourceConfig.setDriverName(driverName); // 全局配置 GlobalConfig globalConfig = new GlobalConfig(); String outputDir = System.getProperty("user.dir") + "/src/main/java"; globalConfig.setOutputDir(outputDir); globalConfig.setAuthor("Your Name"); globalConfig.setOpen(false); // 数据表配置 StrategyConfig strategyConfig = new StrategyConfig(); String[] tableNames = {"table1", "table2"}; strategyConfig.setInclude(tableNames); // 包名配置 PackageConfig packageConfig = new PackageConfig(); packageConfig.setParent("com.example"); packageConfig.setEntity("entity"); packageConfig.setMapper("mapper"); packageConfig.setXml("mapper.xml"); // 代码生成器 AutoGenerator autoGenerator = new AutoGenerator(); autoGenerator.setDataSource(dataSourceConfig); autoGenerator.setGlobalConfig(globalConfig); autoGenerator.setStrategy(strategyConfig); autoGenerator.setPackageInfo(packageConfig); // 执行生成代码 autoGenerator.execute(); } } ``` 以上代码中,配置了数据库连接信息、输出路径、作者等等。通过设置数据表名称,我们可以生成对应的实体类、Mapper接口和XML映射文件。最后,调用execute()方法执行生成代码的操作。 请注意,代码生成器是一个独立的Java类,需要单独运行。在运行代码生成器之前,确保数据库连接正确,并且依赖包已经成功导入。 通过以上代码生成器,我们可以轻松地生成MyBatis Plus的完整代码,大大节省了手动创建实体类、Mapper和XML文件的时间。同时,MyBatis Plus还提供了更多高级功能和配置选项,可以根据具体需求进行扩展和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值