<Java导出Excel> 4.0 Java实现Excel动态模板字段增删改查

news2024/9/20 22:27:21

思路
主要是同时操作两张表:一张存储数据的表,一张存储模板字段的表;
查询:只查询模板字段的表;
新增,修改,删除:需要同时操作两张表中的字段
如果两张表字段不一致,可能导致:数据模板,数据导出,导入失败!

案例:

动态模板查询:
备注:查询我们不采用传统的SQ查询,而是采用:QueryWrapper 查询
VO类:

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * 动态模板字段
 */
@Data
@TableName("list_table_header")
public class ListFormTableVo{
    private String headerName;
    private String headerField;
    private String headerType;
    private String headerLength;
    private String isModify;
    private String isDelete;
    private String isAuto;
    private int id;
    private String colExample;
}

Controller层:ListController
@Slf4j
@RestController
@RequestMapping(“/xxxList”)


	@Autowired
    private ListTempleteService listTempleteService;
    
	public Result getListTemplateCell() {
        QueryWrapper<ListFormTableVo> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByAsc("id");// 根据模板字段ID升序排序
        return Result.success().result(ListTempleteService.list(queryWrapper));
    }
    

Service层:ListTempleteService(只写接口层)

public interface ListTempleteService extends IService<ListFormTableVo> {
}

ServiceImpl层:ListTempleteServiceImpl(只写接口层)

@Service
public class ListTempleteServiceImpl extends ServiceImpl<ListFormTemplateMapper,ListFormTableVo> implements ListTempleteService {
}

Mapper层:ListFormTemplateMapper(只写接口层)

@Mapper
public interface ListFormTemplateMapper extends BaseMapper<ListFormTableVo> {
}

至此:整个查询就结束了,是不是比我们常规写SQ简单多呢,当然我们也可以采用常规方式查询!

关于增删改,需要说明一下:
我们在进行增删改的时候:需要操作两张表:
表A,模板表,这张表是操作里面的数据;
表B,数据表,这张表是操作里面的字段列;

操作列的SQ如下:

数据库表 : 添加字段(在表A中,字段c后面添加字段b,字段b中文:中文xxx)
ALTER TABLE 表A ADD 字段b VARCHAR(250) COMMENT ‘中文xxx’ AFTER 字段c;

数据库表 : 删除字段(在表A中,删除字段b)
ALTER TABLE 表A DROP 字段b;

数据库表 : 修改字段属性(在表A中,修改字段isUpdate长度为20,中文为:是否修改)
ALTER TABLE 表A MODIFY COLUMN isUpdate VARCHAR(20) COMMENT ‘是否修改’;

操作数据的SQ自行脑部,不做说明!
需要注意:
我们在增删的时候,要么就是在两张表添加新字段,要么就是在两张表删除新字段;
但是修改字段的时候,一般是修改的是模板表,修改的是模板表里面的数据中文名称,
比如:headerName这一列的数据,比如修改:部门A为:部门AAA,条件是:headerField = hrA;
备注:在进行增删改的时候,一般我们会对初始的字段列做控制,不让进行修改,删除;
只对新增的字段操作:修改,删除,且修改一般也做控制,如:只改中文名称,用于模板回填展示!
在这里插入图片描述
动态模板添加修改:(一般都是添加,修改出一个接口)
Controller层:ListController

@Slf4j
@RestController
@RequestMapping("/xxxList")
public class ListController {

    @Autowired
    private ListService ListService;

	/**
     * 增加/修改:动态模板字段
     * 权限-管理员
     *
     * @param param
     * @return
     */
    @PostMapping(value = "/addOrUpdateListDataCell")
    @AuthInterceptor("mag:getList:addOrUpdateTemplate")
    public Result addOrUpdateListDataCell(@RequestBody String param) {
        try {
            List<Map<String, Object>> paramList = JsonUtils.readValue(param, List.class);
            ListService.addOrUpdateListDataCell(paramList);
            return Result.success();
        } catch (Exception e) {
            log.error("===模板增加 addOrUpdateListDataCellis error===:" + e.getMessage(), e);
            return Result.failure("修改或添加模板失败");
        }
    }

Service层:ListService

public interface ListService {
	//增加/修改:动态模板字段
    void addOrUpdateListDataCell (List<Map<String, Object>> paramList) throws Exception;
}

ServiceImpl层:ListServiceImpl


@Slf4j
@Service
public class ListServiceImpl implements ListService {

	@Autowired
    private ListMapper ListMapper;
    
	/*
     *增加/修改:动态模板字段
     *
     * @param param
     * @return
     */
    @Override
    public void addOrUpdateListDataCell (List<Map<String, Object>> paramList) throws Exception {
		String updateOrSave = String.valueOf((paramList.get("updateOrSave")));
		// 通过前台传的字段:updateOrSave的值确定是添加还是修改; 
        // 添加
        if (updateOrSave.equals("save")){
        	paramList.remove("updateOrSave");  // 数据库不需要该字段,删除,根据SQ看是否需要删除这一行代码;
            ListMapper.addListDataCell(paramList);
        }
        // 修改
        if(updateOrSave.equals("update")){
            ListMapper.updateListDataCell(modifys);
        }
    }

Mapper层:ListMapper

@Mapper
public interface ListMapper {
	
	//增加:动态模板字段
    void addListDataCell(List<Map<String, Object>> paramList);
    //修改:动态模板字段
    void updateListDataCell(List<Map<String, Object>> paramList);
    
}

Mapper.xml:ListMapper.xml
ListMapper.xml里面可以写SQ,写可以通过存储过程执行SQ,本文采用存储过程添加字段!

 	<!-- 增加:动态模板字段 -->
    <insert id="addListDataCell" parameterType="java.util.List">
        <foreach collection="list" item="item" index="index">
            CALL add_template(#{item.headerField},#{item.headerLength},
            #{item.headerName},#{item.headerType},'list_form_data','list_table_header');
        </foreach>
    </insert>
    
	<!-- 修改:动态模板字段 -->
    <update id="updateListDataCell" parameterType="java.util.List">
        <foreach collection="list" item="item" index="i" separator=";">
            update list_table_header
            <set>
                headerName = #{item.headerName}
            </set>
            WHERE 1=1
            <if test="null!= item.headerField and ''!= item.headerField">
                AND headerField = #{item.headerField}
            </if>
        </foreach>
    </update>
    

存储过程语法:

DELIMITER $$

USE `xx_control_schema`$$

DROP PROCEDURE IF EXISTS `add_template`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `add_template`(c_headerField VARCHAR(1000), c_headerLength VARCHAR(1000),
                              c_headerName VARCHAR(1000), c_headerType VARCHAR(1000), c_table VARCHAR(200),
                              h_table VARCHAR(1000))
BEGIN
    DECLARE altStr VARCHAR(2000);
    DECLARE addSql VARCHAR(2000);
    IF NOT EXISTS(SELECT 1
                  FROM information_schema.COLUMNS
                  WHERE table_name = c_table
                    AND column_name = c_headerField)
    THEN
        SET addSql := CONCAT(
                'INSERT INTO  ',
                h_table,
                '(headerName, headerField, headerType, headerLength) VALUES("',
                c_headerName, '","', c_headerField, '","', c_headerType, '","', c_headerLength, '")'
            );
        IF (c_headerType = 'VARCHAR')
        THEN
            SET c_headerType := CONCAT(c_headerType, '(', c_headerLength, ')');
        END IF;
        SET altStr := CONCAT(
                'ALTER TABLE  ',
                c_table,
                ' ADD COLUMN  ',
                c_headerField, ' ', c_headerType
            );
    ELSE
        SET altStr := '';
        SET addSql := '';
    END IF;
    -- 执行命令
    IF (altStr <> '')
    THEN
        SET @SQL1 = altStr ; PREPARE stmt1 FROM @SQL1 ; EXECUTE stmt1 ;
    END IF;
    IF (addSql <> '')
    THEN
        SET @SQL2 = addSql ; PREPARE stmt2 FROM @SQL2 ; EXECUTE stmt2 ;
    END IF;
END$$

DELIMITER ;

使用存储过程:添加只需要写一个接口即可,如果通过编写SQ,则写两个添加接口的SQ也可以实现!

 		
 		// 添加
        if (updateOrSave.equals("save")){
        	paramList.remove("updateOrSave");  // 数据库不需要该字段,删除,根据SQ看是否需要删除这一行代码;
            ListMapper.addListTableHeader(paramList);  // 模板表 添加字段(数据)
            ListMapper.addListFormData(paramList);  // 数据表 添加字段列
        }
        

动态模板删除:同理,代码比较简单,可自行编写哈!

至此,动态模板字段的增删改查就完成了!
总结:本文我们使用了两项不常用的技术:存储过程,QueryWrapper查询!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/729629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机--点亮LED灯和流水灯

文章目录 前言LED模块的原理点亮一个LED灯LED灯的闪烁LED流水灯 前言 大家好&#xff0c;这里是诡异森林。我使用的是普中科技的A2的51开发板&#xff0c;适合新手入门。用到的应用是Keil5和Stc-isp&#xff0c;第一个软件主要用来写代码的&#xff0c;第二个是将代码程序输送…

RocketMQ5.0--部署与实例

RocketMQ5.0–部署与实例 一、Idea调试 1.相关配置文件 在E:\rocketmq创建conf、logs、store三个文件夹。从RocketMQ distribution部署目录中将broker.conf、logback_namesrv.xml、logback_broker.xml文件复制到conf目录。如下图所示。 其中logback_namesrv.xml、logback_b…

2.2.cuda驱动API-初始化和检查的理解,CUDA错误检查习惯

目录 前言1. cuInit-驱动初始化2. 返回值检查总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记 本次课程学习精简 CUDA 教程-Driver API 案例…

氢燃料电池汽车储氢技术及其发展现状

摘要&#xff1a; 氢能的发展可有效地解决经济发展和生态环境间日益增长的矛盾。氢燃料汽车将处于氢能产业体系中核心地位&#xff0c;加快对氢燃料电池车的技术研发&#xff0c;大范围提高氢能源利用率&#xff0c;对于全世界形成以低碳排放为特征的工业体系具有重要意义。在…

【数据库】忘记mysql本地密码

目录 说明 操作步骤操作失败解决1.在以上操作步骤的第四步&#xff0c;输入mysql&#xff0c;报错第一种报错解决办法如下 第二种报错解决办法如下 2.从上面操作第二步后重新操作步骤如下报错解决办法如下 参考链接 说明 太久没使用本地mysql数据库&#xff0c;忘记了密码。 …

禅意工作-诗意生活

“禅意工作&#xff0c;诗意生活”能做到这两点&#xff0c;非常非常非常难。 AI的解释&#xff1a; “禅意工作&#xff0c;诗意生活”是一种追求内心平和与幸福的生活方式&#xff0c;它将工作与生活相结合&#xff0c;达到一种和谐的状态。以下是一些关于如何实现“禅意工…

GitHub快速上手--GitHub高效操作教程

一、前言 如果你正在看我的这篇文章&#xff0c;说明你已经对GitHub有了一些基础的了解&#xff0c;下面我们将详细叙述每一步的操作&#xff0c;以保证你能够快速上手GitHub&#xff0c;完成对代码的管理。 二、创建仓库 登录GitHub账号&#xff0c;点击页面右上角的加号&am…

flutter聊天界面-自定义表情键盘实现

flutter聊天界面-自定义表情键盘实现 flutter 是 Google推出并开源的移动应用开发框架&#xff0c;主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App&#xff0c;一套代码同时运行在 iOS 和 Android平台。 flutter开发基础腾讯IM的聊天应用&#xff0c;使用的是t…

PADS Layout中显示与布线标签页参数设置

1.“显示”标签页如图1 所示&#xff1a; 图1 显示标签页 显示标签页是用于去设置网络名以及管脚编号的字体大小的设置&#xff0c;建议是可以采取默认设置的&#xff0c;如果自己设计有另外要求&#xff0c;也是可以去进行设置。 2.“布线”标签也有三个子标签&#xff0c;首先…

基于matlab使用两个图像估计校准相机的姿势(附源码)

一、前言 运动结构 &#xff08;SfM&#xff09; 是从一组 3-D 图像估计场景的 2-D 结构的过程。此示例演示如何从两个图像估计校准相机的姿势&#xff0c;将场景的三维结构重建为未知比例因子&#xff0c;然后通过检测已知大小的对象来恢复实际比例因子。 此示例演示如何从使…

2.标识符、关键字、保留字

1、标识符 标识符&#xff1a;就是指开发人员为变量、属性、函数、参数取的名字 注意&#xff1a;标识符不能是关键字或保留字 JavaScript标识符 在JavaScript中&#xff0c;标识符&#xff08;Identifier&#xff09;是用于标识变量、函数、对象、属性或其他编程元素的名称。…

如何实现CesiumJS的视效升级?

CesiumJS作为一款强大的地理可视化引擎&#xff0c;为我们提供了丰富的地球数据可视化和交互展示的能力。然而&#xff0c;随着用户需求的不断增加和技术的不断进步&#xff0c;如何进一步提升CesiumJS的视觉效果成为了一个重要的问题。 首先&#xff0c;为了实现CesiumJS视觉…

Docker(二)之容器技术所涉及Linux内核关键技术

容器技术所涉及Linux内核关键技术 一、容器技术前世今生 1.1 1979年 — chroot 容器技术的概念可以追溯到1979年的UNIX chroot。它是一套“UNIX操作系统”系统&#xff0c;旨在将其root目录及其它子目录变更至文件系统内的新位置&#xff0c;且只接受特定进程的访问。这项功…

国内几款常用热门音频功放芯片-低功耗、高保真

音频功放芯片&#xff0c;又称为音频功率放大器芯片&#xff0c;是指一种将音频信号转换成线性的输出功率的集成电路芯片&#xff0c;在音频功放领域中一类是传统意义上的模拟功放&#xff1b;另一类是数字功放&#xff0c;它们都可以实现模拟信号到数字信号的转换。 随着智能…

[Java基础] StringBuffer 和 StringBuilder 类应用及源码分析

系列文章目录 [Java基础] StringBuffer 和 StringBuilder 类应用及源码分析 [Java基础] 数组应用及源码分析 [Java基础] String&#xff0c;分析内存地址&#xff0c;源码 文章目录 系列文章目录前言1、特性1.1、操作StringBuffer不会生成新的对象1.2、对比操作String会生成新…

el-tab-pane 和el-tooltip及el-tree 组合使用

<el-tabs v-model"groupId" tab-click"handleClick"><el-tab-pane label"全部" name"0"></el-tab-pane><el-tab-pane v-for"items in editableTabs" :key"items.group_id" :name"item…

Rust环境配置

专栏简介&#xff1a;本专栏作为Rust语言的入门级的文章&#xff0c;目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言&#xff0c;虽然历史没有C、和python历史悠远&#xff0c;但是它的优点可以说是非常的多&#xff0c;既继承了C运行速度&#xff0c;还拥有了Java…

动态规划之 70爬楼梯(第2道)

题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例&#xff1a; 解法&#xff1a; class Solution { public:int climbStairs(int n) {vector<int> dp(n1);//n1个数…

IDEA+SpringBoot+mybatis+SSM+layui+Mysql学生学籍管理系统

IDEASpringBootmybatisSSMlayuiMysql学生学籍管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.专业管理3.班级管理4.学生管理5.老师管理6.公告管理7.课程管理8.开课管理9.用户管理 三、部分代码UserDao.javaUserController.javaUser.java 四、其他获取源码 一、系…

WEB中表单案例

一、题目&#xff1a;书写如下图的web前端 二、解题代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…