如何摆脱Java sql语句中的许多占位符(问号)

时间:2019-06-26 14:07:30

标签: java sql oracle jdbc prepared-statement

我想使用JDBC在表中插入一行。但是表有很多列,因此我不想将所有列都指定为一个语句。还有另一种指定列值的方法吗?

INSERT INTO TABLE_NAME VALUES(?, ?, ?, ..., ?)

我希望没有大量的占位符,还有另一种方法。

已编辑

我的意思是,我可以像...这样编辑查询吗,这意味着它需要多个值并使用递增的索引或其他方式动态设置值。是的,就像@ f1sh提到的那样,问题出在占位符的数量上,但对于懒惰而言不是,在方便和整洁的情况下更多。

P.S .:出于某些滑稽的企业要求的原因,我无法使用JPA框架:)

1 个答案:

答案 0 :(得分:3)

编辑

另一种选择是自己编写或使用SqlBuilder

  

SqlBuilder通过将SQL语法包装在非常轻巧且易于使用的Java对象中来改变整个情况,该Java对象遵循“ builder”范例(类似于StringBuilder)。这将许多常见的SQL语法,运行时错误变为Java编译时错误!让我们直接看一些简单的示例,看看它们如何工作。

您可以使用Spring的NamedParameterJdbcTemplate并使用变量名

>>> car = "Kia Cerato Forte 1.6M EX (COE till 03/2024)"
>>> newName = car.split(' ')
>>> ' '.join(newName[:2])
'Kia Cerato'
>>> car = "Mercedes-Benz C-Class C180 CGI"
>>> newName = car.split(' ')
>>> ' '.join(newName[:2])
'Mercedes-Benz C-Class'
>>> 
  

模板类具有一组基本的JDBC操作,允许使用命名参数而不是传统的“?”占位符。

如果可以({安全地)使用String SQL = INSERT INTO TABLE_NAME VALUES((:id),...); MapSqlParameterSource parameters = new MapSqlParameterSource(); parameters.addValue("id", "idValue"); //... namedParameterJdbcTemplate.update(SQL, parameters) > 0; 使用dynamic query

Statement

您只能在封闭值上使用它,因此将没有SQL注入选项