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

发布于 2024-11-25 05:08:09 字数 258 浏览 2 评论 0原文

我需要以编程方式创建 SQL 语句。我在地图中有 <"column_name",value> 形式的值。现在我有一个基本查询,我添加一个 where 子句并在迭代地图时,如果值不为空,我添加此 " " + key + "=" + value + " 和 "。然后我剪掉了他最后5个字符,就完成了。我想使用比这更好的东西。请注意,我使用的是 Tapestry 5 + Spring JDBC 模板(Hibernate 不是一个选项)。

谢谢,翁德雷

I need to create SQL statement programmatically. I have values in map in form <"column_name",value>. Now I have a base query, I add a where clause and as iterating through the map, if the value is not null I add this " " + key + "=" + value + " and ". Then I cut he last 5 characters and it's done. I would like to use something better than this. Note that I'm using Tapestry 5 + Spring JDBC Template (Hibernate is not an option).

Thanks, Ondrej

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦中楼上月下 2024-12-02 05:08:09

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

" " + key + "=?"

,然后再次迭代以调用 preparedStatement.setXXX。根据驱动程序,您可以调用 setObject 或检查参数类型:

if (value instanceof String) 
    preparedStatement.setString((String)value)
else if ...

使用 ? 有它的优点:

  • 您不需要考虑转换像 Date 这样的类型字符串和特殊符号的引用。
  • 当您使用 ? 而不是文字值时,数据库可以更有效地缓存执行计划。

If you need to use dynamic condition I still recommend to generate where with ? like

" " + key + "=?"

and then iterate again to call preparedStatement.setXXX. Depending on the driver you can call setObject or check parameter type:

if (value instanceof String) 
    preparedStatement.setString((String)value)
else if ...

Using ? have it's advantages:

  • You don't think about converting types like Date to string and quoting of special symbols.
  • Database can cache execution plans more effectively when you use ? and not literal values.
亣腦蒛氧 2024-12-02 05:08:09

看来您正在寻找类似 squiggle-sql 的东西。
并且不要忘记带有“set”方法的准备好的语句。

It seems like you are looking for simething like squiggle-sql.
And do not forget about prepared statements with it's 'set' methods.

黒涩兲箜 2024-12-02 05:08:09

您需要使用类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

参考:http://static。 springsource.org/spring/docs/2.0.x/reference/jdbc.html

参见部分:11.2.8

You need to use the class 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

Reference: http://static.springsource.org/spring/docs/2.0.x/reference/jdbc.html

See section: 11.2.8

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文