如何确定 JAVA 中 jdbcTemplate 的 sql 查询类型?
How to determine type of the sql query for jdbcTemplate in JAVA?
我的要求是我想确定 sql 查询的类型,以便我可以相应地选择 jdbcTemplate 方法。
假设我的 sql 查询是插入或更新类型,那么我会选择
String sql ="insert/update sql query";
jdbcTemplate.update(sql);
jdbcTemplate 方法,如果我的 sql 查询类型是 select 那么我会选择
String sql ="select sql query";
jdbcTemplate.query(sql);
jdbcTemplate 方法。
如何有效地确定 java 中 sql 查询的类型?
如果我的查询同时包含更新和 select sql 语句,应该选择哪个 jdbcTemplate 方法?例如
update table set column_name="abc" where column_name in (select
column_name from table where column_name ="xyz");
更新: 实际上,我正在接受来自 Web 表单的应用程序用户的 sql 查询,这就是实际问题出现的原因,因为用户可以post 任何类型的 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 -- SELECT
6 -- 更新
7 -- 删除
189 -- 合并
您可以通过select * from audit_actions order by action
获取完整列表
希望对您有所帮助 :)
您可以通过 .select() 方法 运行 SQL UPDATE 查询,并且您可以 运行 SQL SELECT 通过 .update() 方法查询。
那么为什么有两种不同的方法?
更新方法returns单号;此数字表示 changed/created 行的数量。
select方法returns一个结果集,有点像table:它有许多(类型化和命名的)列,你可以遍历结果集, 每次都得到一行的数据。
在实践中,运行通过 .update() 执行 SELECT SQL 语句将 运行 select (如果 select 以某种方式写入数据库,例如因为你 运行 SELECT NEXTVAL('someSequence'),这些影响确实发生了,但你得到 0 回来因为它没有 change/add 任何 tables 的任何行。如果您 运行 通过 .select() 更新 SQL,更新将通过,并且您会得到一个空的结果集,或者可能是一个包含 1 列某种数字类型和一行的结果集,该行的一个值等于更新计数。这取决于 JDBC 驱动程序。
还有另一种方法(执行),returns 没有。这同样适用于此:如果您 运行 通过此方法进行更新,它仍然有效,您只是没有取回更新计数。
我的建议:对所有这些都使用 .select,并编写一个漂亮的渲染器,将结果集报告给用户。
如果您想研究一些已经完成所有这些的代码,请查看 h2 console。
我的要求是我想确定 sql 查询的类型,以便我可以相应地选择 jdbcTemplate 方法。
假设我的 sql 查询是插入或更新类型,那么我会选择
String sql ="insert/update sql query";
jdbcTemplate.update(sql);
jdbcTemplate 方法,如果我的 sql 查询类型是 select 那么我会选择
String sql ="select sql query";
jdbcTemplate.query(sql);
jdbcTemplate 方法。
如何有效地确定 java 中 sql 查询的类型?
如果我的查询同时包含更新和 select sql 语句,应该选择哪个 jdbcTemplate 方法?例如
update table set column_name="abc" where column_name in (select column_name from table where column_name ="xyz");
更新: 实际上,我正在接受来自 Web 表单的应用程序用户的 sql 查询,这就是实际问题出现的原因,因为用户可以post 任何类型的 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 -- SELECT
6 -- 更新
7 -- 删除
189 -- 合并
您可以通过select * from audit_actions order by action
希望对您有所帮助 :)
您可以通过 .select() 方法 运行 SQL UPDATE 查询,并且您可以 运行 SQL SELECT 通过 .update() 方法查询。
那么为什么有两种不同的方法?
更新方法returns单号;此数字表示 changed/created 行的数量。
select方法returns一个结果集,有点像table:它有许多(类型化和命名的)列,你可以遍历结果集, 每次都得到一行的数据。
在实践中,运行通过 .update() 执行 SELECT SQL 语句将 运行 select (如果 select 以某种方式写入数据库,例如因为你 运行 SELECT NEXTVAL('someSequence'),这些影响确实发生了,但你得到 0 回来因为它没有 change/add 任何 tables 的任何行。如果您 运行 通过 .select() 更新 SQL,更新将通过,并且您会得到一个空的结果集,或者可能是一个包含 1 列某种数字类型和一行的结果集,该行的一个值等于更新计数。这取决于 JDBC 驱动程序。
还有另一种方法(执行),returns 没有。这同样适用于此:如果您 运行 通过此方法进行更新,它仍然有效,您只是没有取回更新计数。
我的建议:对所有这些都使用 .select,并编写一个漂亮的渲染器,将结果集报告给用户。
如果您想研究一些已经完成所有这些的代码,请查看 h2 console。