我的要求是我想确定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方法查询
SELECT子查询与最终结果无关。所以命令,第一个动词表示结果(int updateCount vs. ResultSet)。
boolean isSqlSelect = sql.toUpperCase().startsWith("SELECT")
|| sql.toUpperCase().startsWith("WITH");
在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
获取完整列表
希望有帮助:)
您可以通过.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。