前言
你是否已经厌倦了管理平台的增删查改接口,写十几个service、dao层代码,只是为了简单的增删改查,本文使用腾讯开源项目APIJSON,低代码高效率写Curd接口!
本文实现的功能是使用三张表和三个类,即可实现所有表基本的增删改查。
官方提供的demo都不合适现在Springboot
项目,这里稍微改了下。同时需要指出的是这里取消了原来的校验逻辑,因为公司本来就有校验的逻辑。
准备工作
pom
<dependency>
<groupId>com.github.Tencent</groupId>
<artifactId>APIJSON</artifactId>
<version>4.8.0</version>
</dependency>
<dependency>
<groupId>com.github.APIJSON</groupId>
<artifactId>apijson-framework</artifactId>
<version>4.8.0</version>
</dependency>
<dependency>
<groupId>com.github.APIJSON</groupId>
<artifactId>apijson-column</artifactId>
<version>1.1.3</version>
</dependency>
<!-- APIJSON 必须用到的托管平台 -->
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<url>http://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<url>http://repo.spring.io/milestone</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
脚本
如附件,选择的是Mysql,其他数据库参照官方demo,步骤如下:
- 创建scheme:sys
create schema sys;
- 执行sql脚本文件
只需要Access、Request、Fuction三张表 - 在sys.Access表中新插入一行数据,对应是需要请求的表的名字,示例是Output即表名,Test是请求时的别名。
INSERT INTO `Access` VALUES (29,1,'Output','Test','[\"UNKNOWN\", \"LOGIN\", \"CONTACT\", \"CIRCLE\", \"OWNER\", \"ADMIN\"]','[\"UNKNOWN\", \"LOGIN\", \"CONTACT\", \"CIRCLE\", \"OWNER\", \"ADMIN\"]','[\"LOGIN\", \"CONTACT\", \"CIRCLE\", \"OWNER\", \"ADMIN\"]','[\"LOGIN\", \"CONTACT\", \"CIRCLE\", \"OWNER\", \"ADMIN\"]','[\"OWNER\", \"ADMIN\"]','[\"OWNER\", \"ADMIN\"]','[\"OWNER\", \"ADMIN\"]','2020-01-10 07:12:49',NULL)
注意:有些sql可能会跑失败,原因可能是低版本的Mysql,是没有json字段的,需要改成text字段。
代码编码
配置文件
这里用的连接池是HikariCP
,其他的连接池参考官方demo修改DataSourceConfig
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://xxx?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8
spring.datasource.hikari.username=root
spring.datasource.hikari.password=123456
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.pool-name=MyHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1
springboot启动类
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
APIJSONApplication.init();
log.info("service is ready for service.");
}
static {
// 关闭debug打印消息
Log.DEBUG = false;
APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator() {
@Override
public SQLConfig createSQLConfig() {
return new DemoSQLConfig();
}
@Override
public Parser<Long> createParser() {
// 取消原本的校验,如果需要校验修改对应表Request
return new APIJSONParser().setNeedVerify(false);
}
@Override
public SQLExecutor createSQLExecutor() {
return new DemoSQLExecutor();
}
};
}
}
配置类
/**数据源配置,对应 application.yml 的数据库连接池 datasource 配置
* @author Lemon
*/
@Configuration
public class DataSourceConfig {
public static DataSource DATA_SOURCE_HIKARICP = null;
@PostConstruct
public void init() {
DATA_SOURCE_HIKARICP = hikaricpDataSource();
}
/** 数据源配置,对应 application.yml 的数据库连接池 datasource 配置。
* 也可以直接 new 再 set 属性,具体见 HikariCP 的文档
* https://github.com/brettwooldridge/HikariCP#rocket-initialization
*/
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariDataSource hikaricpDataSource() {
return new HikariDataSource();
}
}
这里如果是默认的数据库和默认的schema,可以省去,否则需要另外指定。
public class DemoSQLConfig extends APIJSONSQLConfig {
public DemoSQLConfig() {super();}
public DemoSQLConfig(RequestMethod method, String table) {super(method, table);}
static {
// 需要指定数据库:MYSQL, POSTGRESQL, SQLSERVER, ORACLE, DB2
DEFAULT_DATABASE = "MYSQL";
// 数据库的 Schema 名
DEFAULT_SCHEMA = "sys";
}
}
public class DemoSQLExecutor extends APIJSONSQLExecutor {
public static final String TAG = "DemoSQLExecutor";
@Override
public Connection getConnection(SQLConfig config) throws Exception {
Log.d(TAG, "getConnection config.getDatasource() = " + config.getDatasource());
String key = config.getDatasource() + "-" + config.getDatabase();
Connection c = connectionMap.get(key);
if (c == null || c.isClosed()) {
try {
connectionMap.put(key, DataSourceConfig.DATA_SOURCE_HIKARICP.getConnection());
} catch (Exception e) {
Log.e(TAG, "getConnection try { "
+ "DataSource ds = DemoApplication.getApplicationContext().getBean(DataSource.class); .."
+ "} catch (Exception e) = " + e.getMessage());
}
}
// 必须最后执行 super 方法,因为里面还有事务相关处理。
// 如果这里是 return c,则会导致 增删改 多个对象时只有第一个会 commit,即只有第一个对象成功插入数据库表
return super.getConnection(config);
}
}
controller
@RestController
public class DemoController extends APIJSONController {
private static final String TAG = "DemoController";
/**
* 获取
*
* @param request 只用String,避免encode后未decode
* @param session /
* @return /
*/
@PostMapping(value = "get")
@Override
public String get(@RequestBody String request, HttpSession session) {
return covertOwnFormat(super.get(request, session));
}
/**
* 转化为指定的返回格式
*
* @param frameworkResp 原来的返回格式
* @return /
*/
private String covertOwnFormat(String frameworkResp) {
JSONObject jsonObject = JSON.parseObject(frameworkResp);
jsonObject.remove(JSONResponse.KEY_OK);
jsonObject.put("retCode", Objects.equals(JSONResponse.CODE_SUCCESS, jsonObject.get(JSONResponse.KEY_CODE)) ? "00" : "01");
jsonObject.put("retMsg", jsonObject.get(JSONResponse.KEY_MSG));
jsonObject.remove(JSONResponse.KEY_CODE);
jsonObject.remove(JSONResponse.KEY_MSG);
return jsonObject.toJSONString();
}
/**
* 新增
*
* @param request 只用String,避免encode后未decode
* @param session /
* @return /
*/
@PostMapping("post")
@Override
public String post(@RequestBody String request, HttpSession session) {
return super.post(request, session);
}
/**
* 修改
*
* @param request 只用String,避免encode后未decode
* @param session /
* @return /
*/
@PostMapping("put")
@Override
public String put(@RequestBody String request, HttpSession session) {
return super.put(request, session);
}
/**
* 删除
*
* @param request 只用String,避免encode后未decode
* @param session /
* @return /
*/
@PostMapping("delete")
@Override
public String delete(@RequestBody String request, HttpSession session) {
return super.delete(request, session);
}
}
测试请求
在上面controller代码的基础,所有表的基本增删改查都可以满足。准备工作中的脚本文件是建在默认的数据库sys中,如果查的表是其他的schema,则需要在请求中指定。
# 查询
POST http://localhost:8080/get
Content-Type: application/json;charset=UTF-8
{
"Test": {
}
}
###
# 增加,指定scheme
POST http://localhost:8080/post
Content-Type: application/json;charset=UTF-8
{
"Matter":{
"@schema":"accountcheck",
"id":159,
"times":10,
"interval":100
},
"tag":"Matter"
}
###