Spring boot使用一个接口实现任意一张表的增删改查

Spring boot使用一个接口实现任意一张表的增删改查

本文旨在:

  • (需要做额外的操作创建对应表和再一个配置表里配置相关的表)

  • 使用一个接口的方式,下载任意一个表的Excel模板

  • 使用一个接口的方式,将任意的excel中的数据导入到对应的表里面

  • 使用一个接口的方式,将任意表中的数据查询出来并展示

  • 使用一个接口的方式,将任意表中的数据查询出来并根据表中字段自动生成过滤条件展示

  • 使用一个接口的方式,对于任意表中的数据进行新增

  • 使用一个接口的方式,对任意表中的任意数量数据删除

  • 使用一个接口的方式,对任意表中的任意一条数据进行修改

这个是我之前开发项目的时候遇到自定义数据CRUD时写的解决方案,因为觉得不错,所以把其中的业务部份的逻辑都剔除了,提取出了其中的重要的部分,用于帮助分享

0、讲解部分

首先为了保证数据的唯一性,我默认每一张自动定义的表里面肯定有一个相同的属性名字的属,这个属性一定是主键

另外就是我会单独的存储不同表的过滤条件。这个过滤条件可以手动加,也可以写接口帮助加。在自动创建表提交表单时就可以往过滤的表中存储这样的过滤字段

不过由于时间原因,我并没有写通过一个接口的方式可以创建这样的表的接口,如果大家有空的话可以写一下帮我加上代码

我会把带代码提交到GitHub中,是免费开源的

相应的这个博客解答了我在这个博客中抛给大家的问题《Spring boot结合easy excel实现低代码量的Excel导入导出》

1、准备工作

引入maven依赖

<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.10</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!--引入Knife4j的官方start包,该指南选择Spring Boot版本<3.0,开发者需要注意-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
            <version>4.4.0</version>
        </dependency>

        <!-- 参数校验依赖 -->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.25</version>
            <scope>compile</scope>
        </dependency>

其中主要是一下一些配置信息:

druid、knife4j、fastjson、mybatis-plus、动态数据源、MySQL驱动、lombok、hutool

我们使用的是spring boot 是2.5.6版本。

初始化SQL

create schema IF NOT EXISTS report collate utf8mb4_general_ci;
use
report;

create table if not exists report.filter_info
(
    id          bigint            not null comment '主键',
    table_code  varchar(100)      null comment '表编码',
    column_code varchar(100)      null comment '字段码',
    column_name varchar(100)      null comment '字段名称',
    type        varchar(32)       null comment '类型',
    dim_class   varchar(100)      null comment '对应维度值',
    sort        int               null comment '排序',
    is_required tinyint default 0 null comment '是否必须'
    ) comment '表筛选项表';

create table if not exists report.meta_info_mapping
(
    sys_code      varchar(100) null comment '元数据编码',
    sys_name      varchar(100) null comment '元数据名称',
    sys_dim_class varchar(100) null comment '元数据类型'
    ) comment '元数据<下拉框使用>';

配置文件信息为

spring:
  application:
    name: xxxx
  datasource:
    dynamic:
      # ?????
      primary: master
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/report?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
          username: root
          password: 123456
      druid:
        initialSize: 10
        minIdle: 10
        maxActive: 200
        max-wait: 60000
        pool-prepared-statements: true
        max-pool-prepared-statement-per-connection-size: 20
        validation-query: SELECT 'x'
        test-on-borrow: false
        test-on-return: false
        test-while-idle: true
        time-between-eviction-runs-millis: 60000  #???????????????????????????????
        min-evictable-idle-time-millis: 300000    #??????????????????????
        filters: stat,wall
        wall:
          comment-allow: true
          multiStatementAllow: true
          noneBaseStatementAllow: true
knife4j:
  enable: true

# mybatis config
mybatis-plus:
  mapper-locations: mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2、代码实现

前后端对接包装类

@Getter
@Setter
@SuppressWarnings("ALL")
@Accessors(chain = true)
public class Result<T> {
   
    public static final String DEF_ERROR_MESSAGE = "系统繁忙,请稍候再试";
    public static final String HYSTRIX_ERROR_MESSAGE = "请求超时,请稍候再试";
    public static final int SUCCESS_CODE = 200;
    public static final int FAIL_CODE = 500;
    public static final int TIMEOUT_CODE = 503;
    /**
     * 统一参数验证异常
     */
    public static final int VALID_EX_CODE = 400;
    public static final int OPERATION_EX_CODE = 400;
    /**
     * 调用是否成功标识,0:成功,-1:系统繁忙,此时请开发者稍候再试 详情见[ExceptionCode]
     */
    @ApiModelProperty(value = "响应编码:0/200-请求处理成功")
    private int state;

    /**
     * 调用结果
     */
    @ApiModelProperty(value = "响应数据")
    private T data;

    /**
     * 结果消息,如果调用成功,消息通常为空T
     */
    @ApiModelProperty(value = "提示消息")
    private String msg = "SUCCESS";

    /**
     * 附加数据
     */
    // @ApiModelProperty(value = "附加数据")
    // private Map<Object, Object> extra;

    /**
     * 响应时间
     */
    @ApiModelProperty(value = "响应时间戳")
    private long timestamp = System.currentTimeMillis();

    /**
     * 系统报错时,抛出的原生信息
  
### 使用 JSONArray 实现增删改查功能 #### 数据增加 在数据增加的过程中,可以利用 `JSONArray` 的 `add(Object obj)` 方法向数组中添加新的元素。此方法允许将任意类型的对象追加到数组末尾。 ```java // 创建一个新的JSONArray实例 JSONArray jsonArray = new JSONArray(); jsonArray.add("新增的数据项1"); jsonArray.add("新增的数据项2"); log.info("打印新增后的JSONArray: {}", jsonArray.toString()); ``` 通过这种方式,可以在现有的 `JSONArray` 中动态地添加新数据[^1]。 --- #### 数据删除 对于数据删除的操作,可以通过索引来移除指定位置上的元素。具体来说,使用 `remove(int index)` 方法即可完成该操作。 ```java // 假设已有如下JSONArray JSONArray jsonArray = JSON.parseArray("[\"原始数据1\", \"原始数据2\"]"); // 删除索引为0的元素 jsonArray.remove(0); log.info("打印删除后的JSONArray: {}", jsonArray.toString()); ``` 需要注意的是,在实际应用中可能需要先定位目标元素的位置再执行删除动作[^2]。 --- #### 数据修改 当需要更新某个特定位置上的值时,则可借助于 `set(int index, Object value)` 函数来替换原有内容。 ```java // 修改索引为0处的内容为"修改后的内容" jsonArray.set(0, "修改后的内容"); log.info("打印修改后的JSONArray: {}", jsonArray.toString()); ``` 这样就可以轻松实现对现有记录的编辑需求[^3]。 --- #### 数据查询 为了检索存储在 `JSONArray` 内部的具体信息,通常会结合循环结构逐一访问各个成员变量或者直接依据下标获取个实体。 ```java for (int i = 0; i < jsonArray.size(); i++) { log.info("第{}条记录:", i + 1); log.info("{}", jsonArray.getString(i)); } ``` 以上代码片段展示了如何遍历整个列并输出每一条目详情;当然也可以独提取某一项用于进一步处理[^1]。 --- #### 批量操作示例 如果涉及到更复杂的场景比如批量导入导出等功能开发的话,那么往往还需要考虑到前端交互逻辑设计以及后台服务接口定义等问题。下面给出一个的例子说明怎样基于Spring Boot框架配合MySQL数据库完成类似任务: 假设我们有一个名为students的格用来保存学员档案资料,现在希望通过RESTful API的形式支持客户端上传一组学号从而返回匹配的学生姓名列。 ##### 后端控制器部分 ```java @RestController @RequestMapping("/api/students") public class StudentController { @Autowired private IStudentService studentService; /** * 根据IDs查找学生名称 */ @PostMapping("/findNamesByIds") public ResponseEntity<List<String>> findNamesByIds(@RequestBody List<Long> ids){ try{ List<Student> students = studentService.findStudentsByIds(ids); List<String> names = students.stream() .map(Student::getName) .collect(Collectors.toList()); return ResponseEntity.ok(names); }catch(Exception e){ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } } ``` ##### Service层实现细节 ```java @Service public class StudentServiceImpl implements IStudentService{ @Override public List<Student> findStudentsByIds(List<Long> ids) throws Exception{ // 调用DAO层的方法... } } ``` 最后记得配置好相应的Mapper映射关系以便能够正确读取持久化层中的字段属性值等等[^2]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾迪的技术之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值