# api-table
**Repository Path**: hlx_coltd/api-table
## Basic Information
- **Project Name**: api-table
- **Description**: Java DB 框架,自动完成table转Json
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2024-12-13
- **Last Updated**: 2024-12-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ApiTable
在现代应用开发中,简化数据库操作、提高代码复用性和维护性是每个开发者追求的目标。**ApiTable** 作为一个基于 **java-db** 框架的通用数据表操作工具,旨在实现这一目标。本文将详细介绍如何封装 **ApiTableService** 以及如何在控制器中使用 **ApiTableService**,以实现高效、灵活的增删改查(CRUD)操作。
## 目录
1. [前言](#前言)
2. [项目结构与依赖配置](#项目结构与依赖配置)
3. [封装 ApiTableService](#封装-apitableservice)
4. [创建 ApiPostController](#创建-apipostcontroller)
5. [使用 ApiTableService](#使用-apitableservice)
6. [测试接口](#测试接口)
7. [总结](#总结)
## 前言
在实际开发过程中,频繁的数据库操作往往导致大量重复代码的出现,增加了维护难度。通过封装 **ApiTableService**,可以将常用的数据库操作集中管理,提升代码的可读性和可维护性。同时,结合 **tio-boot** 框架的特性,可以进一步简化开发流程,实现高效的接口管理。
## 项目结构与依赖配置
在开始封装 **ApiTableService** 之前,确保项目已经正确配置了所需的依赖。以下是 `pom.xml` 文件中需要添加的依赖项:
```xml
com.alibaba.fastjson2
fastjson2
2.0.12
com.litongjava
tio-boot
${tio.boot.version}
com.litongjava
api-table
${tio.boot.version}
com.alibaba
easyexcel
2.2.10
com.alibaba
druid
1.1.10
mysql
mysql-connector-java
5.1.46
```
请确保所有依赖的版本号为最新版本,以获得最佳的功能和安全性。
## 封装 ApiTableService
**ApiTableService** 是封装 **ApiTable** 操作的核心服务类,负责处理与数据库表相关的所有增删改查操作。通过统一的接口,简化了控制器中的代码逻辑。
### ApiTableService 代码
以下是 **ApiTableService** 的完整代码:
```java
package com.litongjava.max.blog.service;
import java.io.IOException;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.jfinal.kit.Kv;
import com.litongjava.db.TableInput;
import com.litongjava.db.TableResult;
import com.litongjava.db.activerecord.Db;
import com.litongjava.db.activerecord.Record;
import com.litongjava.model.body.RespBodyVo;
import com.litongjava.model.page.DbPage;
import com.litongjava.model.page.Page;
import com.litongjava.table.services.ApiTable;
import com.litongjava.table.utils.EasyExcelResponseUtils;
import com.litongjava.table.utils.TableInputUtils;
import com.litongjava.table.utils.TableResultUtils;
import com.litongjava.tio.boot.http.TioRequestContext;
import com.litongjava.tio.boot.utils.TioRequestParamUtils;
import com.litongjava.tio.http.common.HttpRequest;
import com.litongjava.tio.http.common.HttpResponse;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ApiTableService {
public RespBodyVo create(String f, HttpRequest request) {
Map map = TioRequestParamUtils.getRequestMap(request);
map.remove("f");
ApiTable.transformType(f, map);
TableInput kv = TableInputUtils.camelToUnderscore(map);
log.info("tableName:{},kv:{}", f, kv);
TableResult dbJsonBean = ApiTable.saveOrUpdate(f, kv);
if (dbJsonBean.getCode() == 1) {
return RespBodyVo.ok(dbJsonBean.getData()).code(dbJsonBean.getCode()).msg(dbJsonBean.getMsg());
} else {
return RespBodyVo.fail(dbJsonBean.getMsg()).code(dbJsonBean.getCode()).data(dbJsonBean.getData());
}
}
public RespBodyVo list(String f, HttpRequest request) {
Map map = TioRequestParamUtils.getRequestMap(request);
map.remove("f");
ApiTable.transformType(f, map);
TableInput kv = TableInputUtils.camelToUnderscore(map);
log.info("tableName:{},kv:{}", f, kv);
TableResult> list = ApiTable.list(f, kv);
TableResult> dbJsonBean = TableResultUtils.recordsToKv(list, false);
return RespBodyVo.ok(dbJsonBean.getData()).code(dbJsonBean.getCode()).msg(dbJsonBean.getMsg());
}
public RespBodyVo listAll(String f) {
log.info("tableName:{}", f);
TableResult> listAll = ApiTable.listAll(f);
TableResult> dbJsonBean = TableResultUtils.recordsToKv(listAll, false);
return RespBodyVo.ok(dbJsonBean.getData()).code(dbJsonBean.getCode()).msg(dbJsonBean.getMsg());
}
public RespBodyVo page(String f, HttpRequest request) {
Map map = TioRequestParamUtils.getRequestMap(request);
map.remove("f");
Object current = map.remove("current");
if (current != null) {
// 支持 Ant Design Pro Table
map.put("pageNo", current);
}
ApiTable.transformType(f, map);
TableInput kv = TableInputUtils.camelToUnderscore(map);
log.info("tableName:{},kv:{}", f, kv);
TableResult> page = ApiTable.page(f, kv);
TableResult> dbJsonBean = TableResultUtils.pageToDbPage(page, false);
return RespBodyVo.ok(dbJsonBean.getData()).code(dbJsonBean.getCode()).msg(dbJsonBean.getMsg());
}
public RespBodyVo get(String f, HttpRequest request) {
Map map = TioRequestParamUtils.getRequestMap(request);
map.remove("f");
ApiTable.transformType(f, map);
TableInput kv = TableInputUtils.camelToUnderscore(map);
log.info("tableName:{},kv:{}", f, kv);
TableResult jsonBean = ApiTable.get(f, kv);
TableResult dbJsonBean = TableResultUtils.recordToKv(jsonBean);
return RespBodyVo.ok(dbJsonBean.getData()).code(dbJsonBean.getCode()).msg(dbJsonBean.getMsg());
}
public RespBodyVo update(String f, HttpRequest request) {
Map map = TioRequestParamUtils.getRequestMap(request);
map.remove("f");
ApiTable.transformType(f, map);
TableInput kv = TableInputUtils.camelToUnderscore(map);
log.info("tableName:{},kv:{}", f, kv);
TableResult dbJsonBean = ApiTable.saveOrUpdate(f, kv);
return RespBodyVo.ok(dbJsonBean.getData()).code(dbJsonBean.getCode()).msg(dbJsonBean.getMsg());
}
public RespBodyVo batchUpdate(String f, HttpRequest request) {
Map map = TioRequestParamUtils.getRequestMap(request);
map.remove("f");
ApiTable.transformType(f, map);
TableInput kv = TableInputUtils.camelToUnderscore(map);
log.info("tableName:{},kv:{}", f, kv);
TableResult dbJsonBean = ApiTable.batchUpdateByIds(f, kv);
return RespBodyVo.ok(dbJsonBean.getData()).code(dbJsonBean.getCode()).msg(dbJsonBean.getMsg());
}
public RespBodyVo remove(String f, String id) {
log.info("tableName:{},id:{}", f, id);
TableResult dbJsonBean = ApiTable.updateFlagById(f, id, "deleted", 1);
return RespBodyVo.ok(dbJsonBean.getData()).code(dbJsonBean.getCode()).msg(dbJsonBean.getMsg());
}
public RespBodyVo delete(String f, String id) {
log.info("tableName:{},id:{}", f, id);
TableResult dbJsonBean = ApiTable.delById(f, id);
return RespBodyVo.ok(dbJsonBean.getData()).code(dbJsonBean.getCode()).msg(dbJsonBean.getMsg());
}
public RespBodyVo total(String f) {
log.info("tableName:{},id:{}", f);
Long count = Db.count(f);
return RespBodyVo.ok(count);
}
public HttpResponse exportExcel(String f, HttpRequest request) throws IOException {
Map map = TioRequestParamUtils.getRequestMap(request);
map.remove("f");
ApiTable.transformType(f, map);
Object current = map.remove("current");
if (current != null) {
// 支持 Ant Design Pro Table
map.put("pageNo", current);
}
TableInput kv = TableInputUtils.camelToUnderscore(map);
log.info("tableName:{},kv:{}", f, kv);
String filename = f + "_export_" + System.currentTimeMillis() + ".xlsx";
// 获取数据
List records = ApiTable.list(f, kv).getData();
HttpResponse response = TioRequestContext.getResponse();
return EasyExcelResponseUtils.exportRecords(response, filename, f, records);
}
public HttpResponse exportAllExcel(String f, HttpRequest request) throws IOException, SQLException {
Map map = TioRequestParamUtils.getRequestMap(request);
map.remove("f");
map.remove("current");
map.remove("pageNo");
map.remove("pageSize");
ApiTable.transformType(f, map);
TableInput kv = TableInputUtils.camelToUnderscore(map);
log.info("tableName:{},kv:{}", f, kv);
// 导出 Excel
String filename = f + "-all_" + System.currentTimeMillis() + ".xlsx";
// 获取数据
List records = ApiTable.listAll(f, kv).getData();
HttpResponse response = TioRequestContext.getResponse();
EasyExcelResponseUtils.exportRecords(response, filename, f, records);
log.info("finished");
return response;
}
public HttpResponse exportAllTableExcel(HttpRequest request) throws IOException {
String filename = "all-table_" + System.currentTimeMillis() + ".xlsx";
String[] tables = ApiTable.getAllTableNames();
LinkedHashMap> allTableData = new LinkedHashMap<>();
for (String table : tables) {
// 获取数据
List records = ApiTable.listAll(table).getData();
allTableData.put(table, records);
}
HttpResponse response = TioRequestContext.getResponse();
EasyExcelResponseUtils.exportAllTableRecords(response, filename, allTableData);
log.info("finished");
return response;
}
public RespBodyVo pageDeleted(String f, HttpRequest request) {
Map map = TioRequestParamUtils.getRequestMap(request);
map.remove("f");
ApiTable.transformType(f, map);
TableInput kv = TableInputUtils.camelToUnderscore(map);
log.info("tableName:{},kv:{}", f, kv);
TableResult> dbJsonBean = TableResultUtils.pageToDbPage(ApiTable.page(f, kv), false);
return RespBodyVo.ok(dbJsonBean.getData()).code(dbJsonBean.getCode()).msg(dbJsonBean.getMsg());
}
public RespBodyVo recover(String f, String id) {
log.info("tableName:{},id:{}", f, id);
TableResult dbJsonBean = ApiTable.updateFlagById(f, id, "deleted", 0);
return RespBodyVo.ok(dbJsonBean.getData()).code(dbJsonBean.getCode()).msg(dbJsonBean.getMsg());
}
public RespBodyVo tableNames() throws IOException {
String[] data = ApiTable.tableNames().getData();
return RespBodyVo.ok(data);
}
public RespBodyVo fConfig(String f, String lang) {
log.info("tableName:{}", f);
TableResult