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