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

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

案例:

动态模板查询:
备注:查询我们不采用传统的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”)

@Autowiredprivate 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 {@Autowiredprivate 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 {@Autowiredprivate ListMapper ListMapper;/**增加/修改:动态模板字段** @param param* @return*/@Overridepublic 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))
BEGINDECLARE altStr VARCHAR(2000);DECLARE addSql VARCHAR(2000);IF NOT EXISTS(SELECT 1FROM information_schema.COLUMNSWHERE table_name = c_tableAND column_name = c_headerField)THENSET addSql := CONCAT('INSERT INTO  ',h_table,'(headerName, headerField, headerType, headerLength) VALUES("',c_headerName, '","', c_headerField, '","', c_headerType, '","', c_headerLength, '")');IF (c_headerType = 'VARCHAR')THENSET c_headerType := CONCAT(c_headerType, '(', c_headerLength, ')');END IF;SET altStr := CONCAT('ALTER TABLE  ',c_table,' ADD COLUMN  ',c_headerField, ' ', c_headerType);ELSESET altStr := '';SET addSql := '';END IF;-- 执行命令IF (altStr <> '')THENSET @SQL1 = altStr ; PREPARE stmt1 FROM @SQL1 ; EXECUTE stmt1 ;END IF;IF (addSql <> '')THENSET @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.hqwc.cn/news/13679.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Mac】安装DbServer

1.下载 链接: https://pan.baidu.com/s/13Vzsv1sLAq-J8RsRgtL-pw 提取码: 8gsr 2.安装 如果提示已损坏&#xff0c;无法打开。 解决方式&#xff1a; 打开“终端”&#xff0c;输入命令&#xff1a;sudo spctl --master-disable&#xff0c;这个过程中会提示要输入密码&…

硬件电路设计--运算放大器(一)参数和分类

文章目录 前言一、运放分类1.1 功能分类1.2 按单颗IC封装1.3 第一脚的判断 二、运放参数2.1 理想运放2.2 实际运放2.3 数据手册中的重要参数2.3.1 供电电压Vs&#xff08;power supply&#xff09;2.3.2 虚短虚断2.3.3 输入偏置电流Ib2.3.4 噪声Vn2.3.5 静态电流IQ2.3.6 输入失…

【Distributed】分布式监控系统zabbix应用(一)

文章目录 前言一、Zabbix基本概述1. Zabbix 的概念2. Zabbix 的工作原理3. Zabbix 6.0 新特性3.1 Zabbix 可以实现高可用3.2 Zabbix 新增监控系统 4. Zabbix 的构成5. Zabbix 的功能组件5.1 数据库5.2 Web 界面5.3 Zabbix Agent5.4 Zabbix Proxy5.5 Java Gateway 6. Zabbix 和 …

Oracle19c默认用户名system密码不正确不能登录问题解决

Oracle19c默认用户名system密码不正确不能登录问题解决 1、oracle 命令乱码问题 oracle乱码问题一般是由于oracle字符集设置和操作系统字符集设置不一致造成的。 查看oracle字符集方式如下&#xff1a; 1.进入sqlplus 命令&#xff1a; sqlplus /nolog2.以系统管理员身份连…

20中文字符识别(matlab程序)

1.简述 随着计算机科学的飞速发展&#xff0c;以图像为主的多媒体信息迅速成为重要的信息传递媒介&#xff0c;在图像中&#xff0c;文字信息(如新闻标题等字幕) 包含了丰富的高层语义信息&#xff0c;提取出这些文字&#xff0c;对于图像高层语义的理解、索引和检索非常有帮助…

android studio 4.0以上隐藏调用方法参数名提示

引入&#xff1a; android studio在编辑代码的时候&#xff0c;调用函数时会接口处会自动提示参数名&#xff0c;方便代码书写时对传参命名的规范性。 可以如果代码是魂效过的&#xff0c;那会适得其反&#xff0c;l,l1,l2,i,i1,i2这样的参数名提醒反而会混淆视听。 这时候可…

Vue项目在nginx部署启动

目录 1.打包 2.移动文件夹 3.修改配置文件 4.重启nginx即可通过指定端口访问。 1.打包 在package.json有一段代码是命令执行的&#xff0c;代码所示打包命令为build:prod,所以打包命令为npm install build:prod. "scripts": {"dev": "vue-cli-servi…

在SpringBoot中对RabbitMQ三种使用方式

基于API的方式 1.使用AmqpAdmin定制消息发送组件 Autowiredprivate AmqpAdmin amqpAdmin;Testpublic void amqpAdmin(){//1.定义fanout类型的交换器amqpAdmin.declareExchange(new FanoutExchange("fanout_exchange"));//2.定义两个默认持久化队列,分别处理email和sm…

TLS/SSL 协议

TLS/SSL 协议的工作原理 TLS/SSL 协议的工作原理 • 身份验证 • 保密性 • 完整 TLS/SSL 发展 TLS 协议 • Record 记录协议 • 对称加密 • Handshake 握手协议 • 验证通讯双方的身份 • 交换加解密的安全套件 • 协商加密参 TLS 安全密码套件解 对称加密的工作原理&am…

游戏反调试方案解析与frida/IDA框架分析

近来年&#xff0c;游戏黑灰产攻击趋势呈现出角度多样化的特点。据FairGuard游戏安全数据分析发现&#xff0c;游戏黑灰产攻击以工作室、定制注入挂、内存修改器、模拟点击、破解等形式为主。 游戏安全风险分布占比图 对于一款游戏而言&#xff0c;上述的风险中&#xff0c;被…

浅谈线段树

1.前言 Oi-Wiki上的线段树 同步于 c n b l o g s cnblogs cnblogs发布。 如有错误&#xff0c;欢迎各位 dalao 们指出。 注&#xff1a;本篇文章个人见解较多&#xff0c;如有不适&#xff0c;请谅解。 前置芝士 1.二叉树的顺序储存 2.线段树是什么&#xff1f; 线段树…

9.17UEC++代码段、编码和字符串

1. 编码定义&#xff1a; 自行转码&#xff1a; 字符串&#xff1a; FName&#xff1a;名称&#xff0c;访问快&#xff0c;用FName做键值。&#xff08;键值容器&#xff09;资产名称基本都是FName。 FText&#xff1a;一般是和UI有关&#xff0c;专门对接UI&#xff0c;也是…