如何在JAVA中确定jdbcTemplate的sql查询类型?

问题描述 投票:2回答:3

我的要求是我想确定sql查询的类型,以便我可以相应地选择jdbcTemplate方法。

假设我的sql查询是insert或update类型,那么我会选择

String sql ="insert/update sql query";
jdbcTemplate.update(sql); 

jdbcTemplate方法,如果我的sql查询的类型是选择,那么我将选择

String sql ="select sql query";
jdbcTemplate.query(sql);

jdbcTemplate方法。

如何有效地确定java中sql查询的类型?

如果我的查询包含update和select sql语句,请选择哪个jdbcTemplate方法?例如

update table set column_name =“abc”where column_name in(select column_name from table where column_name =“xyz”);

更新:实际上我接受来自Web表单的应用程序用户的sql查询,这就是出现实际问题的原因,因为用户可以通过表单发布任何类型的sql查询,我想根据类型选择特定的jdbcTemplate方法查询

java sql spring oracle jdbctemplate
3个回答
1
投票

SELECT子查询与最终结果无关。所以命令,第一个动词表示结果(int updateCount vs. ResultSet)。

boolean isSqlSelect = sql.toUpperCase().startsWith("SELECT")
                   || sql.toUpperCase().startsWith("WITH");

3
投票

在Oracle中,您可以在执行查询之前解析查询

declare
    l_theCursor     integer default dbms_sql.open_cursor;
begin
    dbms_sql.parse(  l_theCursor,  'SELECT 1 FROM DUAL', dbms_sql.native );
end;

无论如何,这是一个很好的做法,因为您将从用户输入接收SQL。如果该语句无效,您将收到相应的错误消息。当然,声明不是由上述执行的。

解析语句后,您可以查询v $ sql以找出command_type:

select command_type, sql_text
from v$sql t
where sql_text = 'SELECT 1 FROM DUAL';

各种commands_types是这样的:

2 - 插入

3 - 选择

6 - 更新

7 - 删除

189 - MERGE

你可以通过select * from audit_actions order by action获取完整列表

希望有帮助:)


1
投票

您可以通过.select()方法运行SQL UPDATE查询,并且可以通过.update()方法运行SQL SELECT查询。

那么为什么有两种不同的方法呢?

update方法返回一个数字;此数字表示已更改/创建的行数。

select方法返回一个结果集,就像一个小表:它有许多(类型和命名)列,你可以遍历结果集,每次都获得一行的数据。

在实践中,通过.update()运行SELECT SQL语句将运行select(如果选择以某种方式写入DB,例如因为您运行SELECT NEXTVAL('someSequence'),那么这些效果确实会发生,但是你会得到0返回,因为它没有更改/添加任何行到任何表。如果你通过.select()运行UPDATE SQL,更新将通过,你得到一个空结果集,或者可能是一个带有一列数字的结果集type和一行,其中一行的值等于更新计数。这取决于JDBC驱动程序。

还有另一种方法(执行),它不返回任何内容。这同样适用于此:如果您通过此方法运行UPDATE,它仍然有效,您只是没有得到updatecount。

我的建议:对所有这些使用.select,并编写一个很好的渲染器,将结果集报告给用户。

如果你想研究一些已经完成所有这些的代码,请查看h2 console

© www.soinside.com 2019 - 2024. All rights reserved.