问题描述
我的要求是我要确定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方法? 例如
更新表集column_name =“ abc”其中的column_name(从表中的column_name =“ xyz”中选择column_name);
更新:实际上,我从Web表单接受应用程序用户的sql查询,因此这是出现实际问题的原因,因为用户可以通过表单发布任何类型的sql查询,并且我想根据类型选择特定的jdbcTemplate方法查询。
1楼
在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_type如下所示:
2-插入
3-选择
6-更新
7-删除
189-合并
您可以通过select * from audit_actions order by action
来获取完整列表
希望有帮助:)
2楼
SELECT子查询与最终结果无关。 因此,该命令的第一个动词表示结果(int updateCount与ResultSet)。
boolean isSqlSelect = sql.toUpperCase().startsWith("SELECT")
|| sql.toUpperCase().startsWith("WITH");
3楼
您可以通过.select()方法运行SQL UPDATE查询,也可以通过.update()方法运行SQL SELECT查询。
那么为什么有2种不同的方法呢?
update方法返回一个数字; 该数字表示已更改/创建的行数。
select方法返回一个结果集,该结果集就像一张小表:它具有许多(类型化和命名的)列,您可以遍历结果集,每次都获得一行数据。
实际上,通过.update()运行SELECT SQL语句将运行select(并且如果该select以某种方式写入数据库,例如,因为您运行SELECT NEXTVAL('someSequence'),则确实会发生这些影响,但得到0返回,因为它没有更改/未向任何表添加任何行如果通过.select()运行UPDATE SQL,更新将通过,并且您将得到一个空的结果集,或者可能是带有1列数字的结果集类型和一行,其中一个值等于更新计数,这取决于JDBC驱动程序。
还有另一个方法(执行),该方法不返回任何内容。 同样适用于此:如果通过此方法运行UPDATE,它仍然有效,只是您没有获得updatecount。
我的建议:全部使用.select,并编写一个漂亮的渲染器,将结果集报告给用户。
如果您想研究已经完成所有这些操作的一些代码,请查看 。