JDBC向数据库中插入数据,数据库表列过长如何插入?

本文介绍了如何使用JDBC高效地处理包含大量列的数据库表插入操作。通过创建一个实体类来映射数据库字段,并利用PreparedStatement防止SQL注入,实现了灵活的参数映射。关键在于构造动态SQL字符串和正确设置PreparedStatement的参数,从而简化了大量数据的入库过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在处理jdbc插入数据库的过程中,基本的使用自不必多说

但是遇到数据库中表的项目过多,我们该如何进行插入比较方便呢

首先定义我们与数据库相关联的实体类

package com.example.demo.pojo;

import lombok.Data;

import java.sql.ResultSet;
import java.sql.SQLException;
@Data
public class InsCostJDBC {

    //定义你要读取的参数
    
    private  String Mark;
    private String Sex;
    private int Yearly;
    
    //定义成了数组的格式,然后通过jdbc来直接映射,不需要通过mybatis的方式类与表必须完全匹配的方        
     式来进行读取

    private int[] args=new int[111];

    //在实体类中完成对参数与数据库表之间的映射,在读取数据库中的数据直接调用Read方法即可

    public InsCostJDBC Read(ResultSet resultSet) throws SQLException {
        Mark=resultSet.getString("Mark");
        Sex=resultSet.getString("Sex");
        Yearly=resultSet.getInt("Yearly");

    //读取到val0对应的位置列数,读取后面的直接+1,因为我的表中有val0-val99
       
         int idx=resultSet.findColumn("val0");
        for (int i = 0; i < 100; i++) {
            args[i] = resultSet.getInt(idx);
            idx++;
        }
        return this;
    }
}

 我的数据库表

 具体写法:

重点在于sql字符串的拼接,我这里用的是Param参数形式的方法,可以预防sql注入,当然如果你只是在内部或者稳定的环境使用,可以直接拼接一条sql

 @Test
    public void JdbcTest(InsCostJDBC insCostJDBC) throws ClassNotFoundException, SQLException {
        String s ="";
        //拿到参数里面的值
        int[] args = insCostJDBC.getArgs();
        //通过list来读取
        List<InsCostJDBC> list = new ArrayList<>();
        //1. 注册驱动
        Class.forName(dateModule.getProvider());
        //2. 获取链接
        Connection conn = DriverManager.getConnection(dateModule.getDbUrl(), dateModule.getDbUser(), dateModule.getDbPassword());
        //整个Excel表中有104个列,所以产生103个?
        for (int j = 0; j < 104; j++) {
            if (j==103)
            {
                s+="?";
                break;
            }
            s+="?"+",";
        }
        //3. 定义sql语句
        String sql = "insert into dbo.Ins_Cost values("+s+")";
        //预编译sql语句
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        preparedStatement.setString(1,insCostJDBC.getMark());
        preparedStatement.setString(2,insCostJDBC.getSex());
        preparedStatement.setInt(3,insCostJDBC.getYearly());
        //开始存VAL0-VAL99
        for (int j=4;j<104;j++)
        {
            preparedStatement.setString(j,String.valueOf(args[(j-4)+1]));
        }
        preparedStatement.setDate(104, Date.valueOf(LocalDate.now()));
        //执行sql
        preparedStatement.executeUpdate();
    }
}

 重点在于sql的拼接,和对具体的数据库的掌握

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值