当前位置: 代码迷 >> java >> 如何确定JAVA中jdbcTemplate的SQL查询的类型?
  详细解决方案

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

热度:18   发布时间:2023-07-31 11:00:02.0

我的要求是我要确定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方法查询。

在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来获取完整列表

希望有帮助:)

SELECT子查询与最终结果无关。 因此,该命令的第一个动词表示结果(int updateCount与ResultSet)。

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

您可以通过.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,并编写一个漂亮的渲染器,将结果集报告给用户。

如果您想研究已经完成所有这些操作的一些代码,请查看 。

  相关解决方案