java将数据插入Mysql数据库

java将数据插入Mysql数据库,java,mysql,Java,Mysql,我将函数转换为流动的应用程序 应用程序使用PreparedStatement pstmt插入二维字符串数组,当我启动它时,出现了像照片这样的问题 import java.sql.PreparedStatement; public static void main(String[] args){ java.sql.Connection conn = java.sql.DriverManager.getConnection( url, user, password); 要写入数

我将函数转换为流动的应用程序 应用程序使用PreparedStatement pstmt插入二维字符串数组,当我启动它时,出现了像照片这样的问题

import java.sql.PreparedStatement;

public static void main(String[] args){

java.sql.Connection conn = java.sql.DriverManager.getConnection(
        url, user, password);
要写入数据库的字符串数组

String[][] sheetContent={{"100007"," 钢笔", "200", "xxx"},{"100020", "鞋子","700", "AAA"}};
int rows=2;
int columns = 4;
String sql = "INSERT INTO product(编号,商品名,单价,提供商) VALUES(?,?,?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql); 
        for(int r=0;r<rows;r++){
            for(int c=0;c<columns;c++){
                pstmt.setString(c, sheetContent[r][c]);
            }
        }
pstmt.executeUpdate();
String[][]sheetContent={{{“100007”钢笔", "200,“xxx”},{“100020”鞋子","700,“AAA”};
int行=2;
int列=4;
String sql=“插入到产品中”(编号,商品名,单价,提供商) 值(?,?,?)”;
PreparedStatement pstmt=conn.prepareStatement(sql);

对于(int r=0;r,您需要巧妙地使用列索引:

PreparedStatement pstmt = conn.prepareStatement(sql); 
for (int r=0; r < rows; r++) {
    for (int c=0; c < columns; c++) {
        int index = 1 + (r * columns) + c;
        pstmt.setString(index, sheetContent[r][c]);
    }
}
pstmt.executeUpdate();
PreparedStatement pstmt=conn.PreparedStatement(sql);
对于(int r=0;r
您需要巧妙地使用列索引:

PreparedStatement pstmt = conn.prepareStatement(sql); 
for (int r=0; r < rows; r++) {
    for (int c=0; c < columns; c++) {
        int index = 1 + (r * columns) + c;
        pstmt.setString(index, sheetContent[r][c]);
    }
}
pstmt.executeUpdate();
PreparedStatement pstmt=conn.PreparedStatement(sql);
对于(int r=0;r
您应该从1开始对preparedStatement进行索引, 您正在做的是从0开始

index=必须以索引整数1开头

pstmt.setString(索引,页内容[r][c])

示例:pstmt.setString(1,sheetContent[r][c]);
pstmt.setString(2,sheetContent[r][c]);

您应该从1开始编制报表的索引, 您正在做的是从0开始

index=必须以索引整数1开头

pstmt.setString(索引,页内容[r][c])

示例:pstmt.setString(1,sheetContent[r][c]);
pstmt.setString(2,sheetContent[r][c]);

指向
setString()
的索引是基于1的,而不是基于0的。请阅读指向
setString()
的.index是基于1的,而不是基于0的。请阅读。为什么
(r*列)
需要吗?这会增加基于行索引的参数索引;这似乎不正确。尽管我对正确性发表了评论,但我认为OP应该建议编辑Tim的答案,指出正确的方向,而不是发布他自己的答案。我会投票支持Tim的正确答案。@Cascader感谢defe告诉我,伙计。我的答案背后的想法是将两个维度(行、列)转换为准备好的语句所需的一维索引。这就是它的全部内容。您的想法很清楚,而且方向肯定是正确的。但是,该语句的参数数有限(即4个)但是如果代码针对50行运行,
索引将增长到最大值
1+(49*4)+3
(因为
r
将达到49,而c将达到3,根据
for
限制)。这将导致在执行/分析语句时出错。他应确保首先存在列。这不会使我的答案无效。为什么
(r*columns)
需要吗?这会增加基于行索引的参数索引;这似乎不正确。尽管我对正确性发表了评论,但我认为OP应该建议编辑Tim的答案,指出正确的方向,而不是发布他自己的答案。我会投票支持Tim的正确答案。@Cascader感谢defe告诉我,伙计。我的答案背后的想法是将两个维度(行、列)转换为准备好的语句所需的一维索引。这就是它的全部内容。您的想法很清楚,而且方向肯定是正确的。但是,该语句的参数数有限(即4个)但是如果代码针对50行运行,
索引将增长到最大值
1+(49*4)+3
(因为
r
将达到49,而c将达到3,根据
for
限制)。这将导致执行/分析语句时出错。他应确保首先存在列。这不会使我的答案无效。