前言

Java 接口接收Map类型参数 java接收api接口json数据_接口

你是否已经厌倦了管理平台的增删查改接口,写十几个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,步骤如下:

  1. 创建scheme:sys
create schema sys;
  1. 执行sql脚本文件
    只需要Access、Request、Fuction三张表
  2. 在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"
}
###