java - 如何在 SQL 中动态创建 UPDATE 查询,每次调用的列不同?
问题描述
我有一个数据有效负载,其JSON
格式指示我将在所述表中更新的内容。我正在使用一个PreparedStatement
. 我正在使用Java v8.212
. 我在MySQL
。我只想更新有效载荷中的字段:
有效载荷
{
"column1": "value1"
"column2": "value2"...
}
我遍历所述有效负载并创建我的SQL
语句,如下所示:
String sql = "UPDATE table SET\n";
if(payload.valueX.isPresent) {
//i have something at the end of the method that deals with commas
sql.append("columnX = " + payload.getColumnX;
}
if(thisOtherColumnExists..) { etc }
try (Connection conn = geConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
//at this point how do i dynamically set bound vars?
ps.executeQuery();
}
我不喜欢这种格式,因为存在SQL
注入攻击的可能性。如何使用绑定变量创建它:
if(payload.valueX.isPresent) {
sql.append("columnX = ?";
}
//how to dynamically set?
preparedStatement.setString();
然后循环遍历 SQL 并将正确的值添加到正确的字段?有时我会更新五列,有时是十列,有时是一列,而且它们的顺序几乎总是不同的。
解决方案
您必须使用多个参数搜索准备好的语句。
基本上你可以给 setString 方法下命令。
if(payload.valueX.isPresent) {
sql.append("columnX = ?";
preparedStatement.setString(1,payload.getColumnX;);
}
//adding an integer parameter, e.g
if(payload.valueY.isPresent) {
sql.append("columnY = ?";
preparedStatement.setInt(2,payload.getColumnY;);
}
此链接可以帮助您提供示例:
如果您想要一种更动态的排序语句方法,我认为您必须设置一个循环变量并在添加新项目时增加该变量。
更改问题后编辑
您必须使用集合(Array/List/HashMap 等)并填充每个 sql 条件。在 try/catch 循环中,此集合并同时添加准备好的语句。
注意:请不要编辑已接受的答案,因为您编辑的问题也需要更改答案,因此我们不能像一直编辑那样继续。:)
推荐阅读
- python - libclntsh.so:无法打开共享对象文件:没有这样的文件或目录 Centos 8 和 python
- python-3.x - 我需要改变什么来摆脱这种似乎从一行跳到另一行的语法错误?
- typescript - Vue & webpack & typescript“初始化前无法访问'__WEBPACK_DEFAULT_EXPORT__'”
- javascript - 使用 Python 在 HTML 网页中输入值
- javascript - NPM MysqlDump 和 Mysql-Import,如何添加删除表选项(如果存在),Node.js
- python-3.x - python3 - pathlib 读取 unicode 文件错误
- django - “x”列中的空值违反非空约束
- r - 如何使用 R 中的泊松分布将一个观察结果与数据帧的其余部分进行比较?
- python - 当我使用 Python 读取图像时,mpimg.imread 和 plt.imread 有什么区别?
- dynamic - 如何确定 IDynamicMemberReferenceOperation 引用了哪些方法?