Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java在要插入的参数数量可能不同的数据库中插入值_Java_Sql - Fatal编程技术网

如何使用Java在要插入的参数数量可能不同的数据库中插入值

如何使用Java在要插入的参数数量可能不同的数据库中插入值,java,sql,Java,Sql,我正在创建一个函数,用户需要提供表名和存储值的json文件的路径,并将其插入数据库:insertData(String tablename,String jsonFilePath) 现在,如果我事先知道要插入的值的数量,那么创建一个PreparedStatement就很容易了,如下所示: String strQuery = "INSERT INTO tablename VALUES (?, ?)"; PreparedStatement stmt = conn.prepar

我正在创建一个函数,用户需要提供表名和存储值的json文件的路径,并将其插入数据库:
insertData(String tablename,String jsonFilePath)

现在,如果我事先知道要插入的值的数量,那么创建一个PreparedStatement就很容易了,如下所示:

String strQuery = "INSERT INTO tablename VALUES (?, ?)";
            PreparedStatement stmt = conn.prepareStatement(strQuery);//prepare the SQL Query
            stmt.setString(1, "abc");//insert homeid
            stmt.setInt(2, "def");//insert featureid.
            stmt.executeQuery();//execute query

但是,由于我事先不知道什么是表名,每个表的列数可能会有所不同,因此我需要提前创建SQL查询字符串“strQuery”,将

放在需要放置
的位置,因此我该如何继续操作(数据字段数组也可用于setXXX):

要做的改进:

  • 接受多种类型的参数(字符串、整数等)。您可以在数据字段上创建枚举,在数据字段上创建类型来管理此参数
  • 检查传递给generateStatement的参数是否正确
  • 使用StringBuffer而不是String来生成准备好的语句
  • 如果需要,创建一个对象来保存表名和数据字段数组

由于insert语句的结构可能会发生变化,因此可以动态生成语句。如果不打算重用预处理语句,则使用预处理语句没有任何实际好处。下面是一个使用语句(与预处理语句相反)动态生成语句的示例:

public boolean insert(Connection conn, String table, List<String> columns, List<String> values) throws SQLException {
    StringBuilder sb = new StringBuilder();

    sb.append("INSERT INTO ");
    sb.append(table);
    sb.append(" (");

    // add columns
    Iterator<String> it = columns.iterator();
    sb.append(it.next());
    while(it.hasNext()) {
        sb.append(',');
        sb.append(it.next());
    }

    sb.append(") VALUES (");

    // add values
    it = values.iterator();
    sb.append(it.next());
    while(it.hasNext()) {
        sb.append(',');
        sb.append(it.next());
    }

    sb.append(");");

    // insert
    try (Statement stmt = conn.createStatement()) {
        return stmt.execute(sb.toString());
    }
}
public boolean insert(连接连接、字符串表、列表列、列表值)引发SQLException{
StringBuilder sb=新的StringBuilder();
某人附加(“插入”);
某人附加(表格);
某人加上(“”);
//添加列
Iterator it=columns.Iterator();
某人附加(它的下一个());
while(it.hasNext()){
某人附加(“,”);
某人附加(它的下一个());
}
sb.附加(“)值(”);
//增加价值
它=values.iterator();
某人附加(它的下一个());
while(it.hasNext()){
某人附加(“,”);
某人附加(它的下一个());
}
某人加上(“);”;
//插入
try(语句stmt=conn.createStatement()){
返回stmt.execute(sb.toString());
}
}

请注意,此代码没有执行正确的验证。例如,如果两个列表中的任何一个都为空,则会发生错误。

为什么需要事先创建查询字符串?@Isaiahvanderst我不需要,但即使我不需要,您是说我稍后将循环并添加问号?是否有更简短和智能的呃,我可以跳过添加问号吗?在这种情况下使用准备好的语句并没有什么好处。您可以在fly@IsaiahvanderElst对不起,你能告诉我,我是怎么做的吗?我对Java比较陌生。你可以根据你所做的编写代码来生成你发布的PreparedStatement代码您可以使用StringBuilder。
public boolean insert(Connection conn, String table, List<String> columns, List<String> values) throws SQLException {
    StringBuilder sb = new StringBuilder();

    sb.append("INSERT INTO ");
    sb.append(table);
    sb.append(" (");

    // add columns
    Iterator<String> it = columns.iterator();
    sb.append(it.next());
    while(it.hasNext()) {
        sb.append(',');
        sb.append(it.next());
    }

    sb.append(") VALUES (");

    // add values
    it = values.iterator();
    sb.append(it.next());
    while(it.hasNext()) {
        sb.append(',');
        sb.append(it.next());
    }

    sb.append(");");

    // insert
    try (Statement stmt = conn.createStatement()) {
        return stmt.execute(sb.toString());
    }
}