Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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 使用Spring以编程方式创建SQL语句_Java_Sql_Spring_Tapestry_Jdbctemplate - Fatal编程技术网

Java 使用Spring以编程方式创建SQL语句

Java 使用Spring以编程方式创建SQL语句,java,sql,spring,tapestry,jdbctemplate,Java,Sql,Spring,Tapestry,Jdbctemplate,我需要以编程方式创建SQL语句。我有地图中的值。现在我有了一个基本查询,我添加了一个where子句,在遍历映射时,如果值不为null,我添加这个“+key+”=“+value+”和”。然后我删掉了最后5个字符,就这样完成了。我想用比这更好的东西。注意,我使用的是Tapestry5+SpringJDBC模板(Hibernate不是一个选项) 谢谢,Ondrej如果您需要使用动态条件,我仍然建议您使用生成where?类似 " " + key + "=?" 然后再次迭代调用preparedState

我需要以编程方式创建SQL语句。我有地图中的值。现在我有了一个基本查询,我添加了一个where子句,在遍历映射时,如果值不为null,我添加这个“+key+”=“+value+”和”。然后我删掉了最后5个字符,就这样完成了。我想用比这更好的东西。注意,我使用的是Tapestry5+SpringJDBC模板(Hibernate不是一个选项)


谢谢,Ondrej

如果您需要使用动态条件,我仍然建议您使用
生成
where
类似

" " + key + "=?"
然后再次迭代调用
preparedStatement.setXXX
。根据驱动程序的不同,您可以调用
setObject
或检查参数类型:

if (value instanceof String) 
    preparedStatement.setString((String)value)
else if ...
使用
有其优点:

  • 您不会考虑将
    Date
    等类型转换为字符串并引用特殊符号
  • 当您使用
    而不是文字值时,数据库可以更有效地缓存执行计划

看起来你在寻找类似的东西。
不要忘记使用“set”方法准备语句。

您需要使用PreparedStatementCreator类

final String INSERT_SQL = "insert into my_test (name) values(?)";
final String name = "Rob";

KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
    new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
            PreparedStatement ps =
                connection.prepareStatement(INSERT_SQL, new String[] {"id"});
            ps.setString(1, name);
            return ps;
        }
    },
    keyHolder);

// keyHolder.getKey() now contains the generated key
参考:


请参见第11.2.8节

是,但我如何创建PreparedStatement?我使用的是JDBCTemplate,因此我没有在其上创建语句的连接。@Ondrej:如果使用JDBCTemplate,则需要将参数作为数组传递,而不是单独设置参数。您有
查询(字符串sql,对象[]参数,行映射器行映射器)
如果您已经有了
sql
,那么您可以将值作为
args
进行传递。
看起来很不错,但它是否稳定并经过测试?最后一个版本是2009年的Java1.4,这不是很新。没错,没有太多的活动。但是,它非常小和简单,所以我不希望它有任何问题。我甚至建议将源代码复制到项目中,直接使用它们,并在需要时进行扩展。