动态创建表,并批量入库表数据(字段在程序运行之前未知)
环境:
springboot+mybatis
需求:
前台导入任意数据,后台经过处理后,根据处理后的字段,新建数据库表,并入库处理后的数据。
1.Mapper.xml中创建通用sql脚本,如下:
<select id="executeSql" parameterType="String">${sqlContent}</select>
2.创建表格,因为表明和字段名,字段数量未知,需要用StringBuffer讲sql拼接
StringBuffer sbInsert=new StringBuffer();tId= "re_"+ UUIDUtils.uuid();sbInsert.append("CREATE TABLE ").append(tId) .append("(");// 遍历map中的key,来构造数据库字段for(int tabIndex=0;tabIndex<tableTitle.size();tabIndex++){sbInsert.append(" ").append(tableTitle.get(tabIndex)).append(" varchar(255) DEFAULT NULL");if(tabIndex!=tableTitle.size()-1){sbInsert.append(",");}}sbInsert.append(")").append(";");//执行通用sql语句mapper.executeSql(sbInsert.toString());
3.开始拼接并执行insert语句
其实就是拼接出如下sql语句:
insert into re_5f7ba278190d4b46b4b3505495050541-->动态生成的表名
(amount,province_id,oder_time,order_id,order_name,province_name) -->动态生成的列名
VALUES
('308','340000','2018/10/1','DHDB190601022','奇瑞控股-系统','安徽省'),
('307','340000','2018/12/1','DHDB190601022','奇瑞控股-系统','安徽省'),
('69','340000','2019/3/1','DHDB190601022','奇瑞控股-系统','安徽省'),
('484','340000','2019/6/1','DHDB190601022','奇瑞控股-系统','安徽省'),
('370','340000','2018/8/1','DHDB180601009','奇瑞控股-咨询','安徽省'),
('464','340000','2020/8/1','DHDB200801098','奇瑞系统项目三期','安徽省'),
('447','120000','2021/1/1','DHBB210101037','一汽丰田系统项目','天津市'),
('37','120000','2020/3/1','DHBB200301032','中汽中心电子影像项目','天津市')
拼接代码如下:
StringBuffer sbInsert=new StringBuffer();sbInsert.append("insert into ").append(tId).append("(")//将动态生成的列名字段之间使用","隔开.append(String.join(",",tableTitle)).append(") VALUES ");//遍历数据,根据表头取出数据,拼接数据for(int countIndex=0;countIndex<list.size();countIndex++){sbInsert.append("(");Map<String, Object> stringObjectMap = list.get(countIndex);for(int titleNUm=0;titleNUm<tableTitle.size();titleNUm++){if(titleNUm!=0){sbInsert.append(",");}sbInsert.append("'").append(stringObjectMap.get(tableTitle.get(titleNUm))).append("'");}sbInsert.append(")");if(countIndex!=list.size()-1){sbInsert.append(",");}}//将sql传入公共sql处理模块,执行insert语句mapper.executeSql(sbInsert.toString());
如下操作后,数据库表和表数据都可以在程序中动态生成,如下图:
题外:
postgrepsql 主键冲突则updata其他字段,主键不冲突则执行insert
INSERT INTO res_tname_tid_relatioin_t(tab_name,tab_id)
VALUES('zhangsan','112222')
ON conflict(tab_id)
DO UPDATE SET tab_name = 'true_tname'
动态创建表,并批量入库表数据(字段在程序运行之前未知)相关推荐
- linux直接运行程序加载动态库失败,扣丁学堂Linux培训详解程序运行时加载动态库失败解决方法...
今天扣丁学堂Linux培训老师给大家介绍一下关于Linux程序运行时加载动态库失败的解决方法,希望对同学们学习有所帮助,下面我们一起来看一下吧. Linux下不能加载动态库问题 当出现下边异常情况 . ...
- VS2008工具,两种加入库的方法。 设置程序运行时目录
方法一:整个编译器加入库 tools->Projects and Solutions->VC++ Directories->右上角选择Library files 加入D:\work\ ...
- mysql循环建表_mysql创建存储过程,批量建表分表00到99
--创建存储过程 DELIMITER $$ CREATE PROCEDURE `createTablesWithIndex`() BEGIN DECLARE `@i` INT(11); DECLARE ...
- 使用python套用excel模板_Python自动化办公Excel-从表中批量复制粘贴数据到新表
1.模块安装 1)cmd模式下: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd pip install -i https:/ ...
- python复制excel到另一个excel_Python自动化办公Excel-从表中批量复制粘贴数据到新表...
1.模块安装 1)cmd模式下: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xlrd pip install -i https:/ ...
- 批量导入数据到hive表中:假设我有60张主子表如何批量创建导入数据
背景:根据业务需要需要把60张主子表批量入库到hive表. 创建测试数据: 1 def createBatchTestFile(): Unit = { 2 for (layer <- 0 to ...
- sql 创建表,批量插入数据
sql语言被用于数据库中记录的"增删改查",本文将介绍数据库中mysql数据库中利用sql语言创建表,批量插入数据. - -以下示例来自牛客网- - 1.创建表 创建一个actor ...
- MySQL批量入库的几种方式详解
MySQL批量入库的几种方式详解 1. MySQL批量入库概述 2. Hutool封装jdbc方式 3. Jdbc直接或批量执行方式 4. MyBatis批量入库方式 5. MySQL批量入库总结 1 ...
- hbase批量入库的总结
最近这一段时间一直在研究hbase的批量入库,看似简单的问题其实埋着无数的坑...... 接下来就把我遇到的一些问题和解决的办法分享给大家,希望能让那些新接触到的人不至于像我一样走这么多弯路. hba ...
最新文章
- 前端中会用到的设计模式之单一职责原则
- codis集群部署实战
- C++教程之lambda表达式一
- Mysql中遇到的错误
- P4878 道路修建-美国
- 情景喜剧消亡史:人人都爱,没人敢拍
- tp mysql 去重
- 更改via浏览器字体_【安卓】我心中的最佳手机浏览器
- [ACM_动态规划] hdu 1176 免费馅饼 [变形数塔问题]
- 某文件在桌面上,命令窗口中找不到,因为桌面是两个目录合成的
- 从架构设计到系统实施-基于.NET 3.0的全新企业应用之基于WCF的系统服务
- c语言求5个整数最小公倍数,C语言求两个正整数的最小公倍数和最大公约数
- pt-archiver 命令
- Kotlin 异常处理之 Option、Either、Result
- 非宁静无以致远 非淡泊无以明志
- OpenStack Cinder特性之Volume-backed image介绍与验证
- vue实现简单搜索功能
- Java开发实习经历01——寻找到入职(真实实习经历,希望对各位有帮助)
- Numpy提取多维数组的某行/列
- 15-移动端布局基础——DPI、PPI、物理像素、DPR、viewportcss像素、DPR