当前位置: 首页 > news >正文

动态建表并插入数据

Service层根据解析到的数据在Mysql数据库中动态建表并插入数据

以Easy Excel解析得到的文件为例

@Slf4j
@Service
public class ExcelImportServiceImpl implements ExcelImportService {

@Autowired
private ExcelImportDao dao;
@Value("${source.url}")
private String DB_URL;
@Value("${source.name}")
private String USER;
@Value("${source.pwd}")
private String PASS;
//filePath:文件存储绝对路径,tableName:创建的表名
@Override
public Result importExcel(String filePath,String tableName) {

    // 首先创建一个ExcelImportUtilOne的实例,用于处理Excel文件的导入相关操作
    ExcelImportUtilOne excelImportUtil = new ExcelImportUtilOne(filePath);
    // 如果ExcelImportUtilOne实例获取的结果为0,表示可能在读取Excel文件等前期操作中有问题,直接返回0表示导入失败
    if(excelImportUtil.getResult()==0)
        return Result.error();

    //表数据
    List<Map<String, String>> dataList = excelImportUtil.getDataList();
    //表字段
    String[] columns = excelImportUtil.getColumns();

    //动态建表外部方法
    dynamicCreatTable(tableName,columns);
    
    ArrayList<String> fieldList = new ArrayList<>(Arrays.asList(columns));
    //动态插入数据
    dao.dynamicSave(tableName,fieldList,dataList);

    return Result.ok();

}

//动态建表方法
    private void dynamicCreatTable(String tableName,String[] columns){

        StringBuilder sql = new StringBuilder("CREATE TABLE ");
        sql.append(tableName).append(" (");
        sql.append("id BIGINT PRIMARY KEY AUTO_INCREMENT,");

        for (int i = 0; i < columns.length; i++) {
            sql.append(columns[i]).append(" VARCHAR(255)");
            if (i < columns.length - 1) {
                sql.append(", ");
            }
        }
        sql.append(");");
        String statement = sql.toString();

        // 创建Connection对象
        // JDBC连接参数
        String url = DB_URL;
        String username = USER;
        String password = PASS;
        try (Connection connection = DriverManager.getConnection(url, username, password)) {
            // 创建Statement对象
//            Statement psStatement = connection.createStatement();
            PreparedStatement psStatement = connection.prepareStatement(statement, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

            // 在此处执行更新SQL语句
            psStatement.executeUpdate();

            // 关闭Statement
//            resultSet.close();
            psStatement.close();
        } catch (SQLException e) {
            log.error("建表失败", e);
        }
    }
}

Mapper层

@Mapper
public interface ExcelImportDao {

    //动态插入数据
    void dynamicSave(String tableName, ArrayList<String> fieldList, List<Map<String, String>> dataList);
}

xml文件

<mapper namespace="net.srt.system.dao.ExcelImportDao">

    <insert id="dynamicSave">
        INSERT INTO ${tableName}(
        <foreach collection="fieldList" item="fieldEach" separator=",">
            ${fieldEach}
        </foreach>
        ) VALUES
        <foreach collection="dataList" item="dataEach" separator=",">
            (
            <foreach collection="fieldList" item="fieldEach" separator=",">
                #{dataEach.${fieldEach}}
            </foreach>
            )
        </foreach>
    </insert>
</mapper>

相关文章:

  • 【uniapp-小程序】实现方法调用的全局tips弹窗
  • Centos搭建python环境
  • Python创建Excel的方式——提供4中方式可供参考
  • Python基础语法精要
  • flutter常见面试题(欢迎私信投稿——更新到10)
  • 19vue3实战-----菜单子树的展示
  • web集群(LVS-DR)
  • 动态规划两个数组的dp问题系列一>两个字符串的最小ASCII 删除和
  • 【c++刷题】leetcode 200. 岛屿数量
  • 生物发酵展与2025生物医药创新技术与应用发展论坛同期盛大举办
  • DeepSeek教unity------UI框架
  • 基于51单片机的4位电子密码锁proteus仿真
  • Ubuntu下载安装Docker-Desktop
  • latex二重闭合积分显示
  • UI-设计规范大小总结
  • 深度学习|表示学习|归一化和正则化带给我们的启示|27
  • 基于 openEuler 构建 LVS-NAT 集群和ldirectord监控RS
  • WPF的MVVMLight框架
  • 整理及仿真Xilinx的SRIO示例工程(高速收发器三十)
  • MapReduce简单应用(三)——高级WordCount
  • 面对非专业人士,科学家该如何提供建议
  • 总奖池超百万!第五届七猫现实题材征文大赛颁奖在即
  • 巴基斯坦称约50名印度士兵在克什米尔实控线丧生
  • 售卖自制外挂交易额超百万元,一男子因提供入侵计算机系统程序被抓
  • 外交部介绍中国赞比亚共同举办人工智能能力建设主题活动情况
  • 印媒证实:至少3架印军战机7日在印控克什米尔地区坠毁