Java中SQL的动态填充(从带null的数组)
举一个简单的例子来说明我的问题:
//Create database table allowing nulls.
CREATE TABLE test(one int not null, two int null, three int not null);
现在,在Java中,我有一个与数据库内容匹配的对象数组。我需要使用数组值为此数据库表创建insert/update/delete语句
Object[] arr = { 4, null, 1 };
String sql = GenereateInsert(arr);
但是这会变得很困难,因为我需要提前在insert中省略空字段。例如,如果上面的两个不为空:
INSERT INTO test(4, 2, 1);
一切都很容易。但如果为空,我需要声明为:
INSERT INTO test(one, three) values(4, 1);
我正在处理的表有50列以上,所以我不想手动执行此操作,它将无法管理。那么,人们通常如何解决这个问题呢?这一定是一种普遍的情况
PS:我不想使用完整的ORM库,这似乎有些过分
# 1 楼答案
不确定是否有其他数据库系统,但在postgres中可以按如下方式插入空值:
也可以用相同的方法执行set语句:
因此,
如果有很多这样的循环,那么使用for-each循环可能更有意义
# 2 楼答案
我建议这样做:
运行类似} 检索列名及其列类型。将其存储在HashMap中,并将键存储在ArrayList中
SELECT * FROM <TABLE_NAME> LIMIT 1
的查询。使用^{现在使用ArrayList中的键作为列名创建一个
PreparedStatement
我想这不难做到现在,考虑到数组中的数据,以及您知道它们来自HashMap的SQL类型这一事实,您可以轻松地使用此信息将从数组中获得的值映射到生成的PreparedStatement的
?
中现在的问题是如何处理} 将它们设置为null
null
。因为您知道列的类型,如果您得到的值是null
,那么您可以使用^{另外,我只想指出,according to this document,这里有一个关于setXXX(…)的重要指南:
这意味着您可以发送null作为
setXX(...)
方法的参数值,而实际上不必显式调用setNull(..)
方法我希望这对你有用
# 3 楼答案
高级算法:
allColumnNames
——作为类的字段李>List<String>
,一个表示列名,一个表示值-让我们调用它们columnNamesList
和columnValuesList
李>allColumnNames[i]
添加到columnNamesList
,将values[i]
添加到columnValuesList
李>INSERT INTO tablename
、columnNames
、VALUES
中的每个值的逗号分隔列表以及columnValuesList
中的每个值的逗号分隔列表连接在一起,构建insert语句李>