多结果
使用 JdbcTemplate 类的 multipleExecute 系列方法可以解决 SQL 语句在产生多个值后难以辨识和获取的问题。
产生条件
-
一次性将多条 未经切分 的 SQL 语句发给数据库进行执行。
例如:将下列语句作为一个整体发 送给 MySQL 进行执行set @userName = convert(? USING utf8);select * from test_user where name = @userName;select * from test_user where name != @userName;信息- 这通常需要数据库支持,例如:MySQL 在连接字符串上需要设置 “allowMultiQueries=true” 参数。
-
在编写存储过程时,由于 有意 或 无意 的方式产生的多个结果集。
例如:下列 MySQL 存储过程产生了 2 个结果集create procedure proc_multi_result(in userName varchar(200))beginselect * from test_user where name = userName;select * from test_user where name != userName;end; -
其它可能的情况。
用法
通过一个参数查询两个结果集。分别为:1.符合参数条件的、2.不符合参数条件的。
String multipleSql = " set @userName = convert(? USING utf8);" +
" select * from test_user where name = @userName;" +
" select * from test_user where name != @userName;";
Map<String, Object> result = jdbc.multipleExecute(multipleSql, "muhammad");
- dbVisitor 支持多种参数传递方式,想要了解更多参数传递内容请到 参数传递 页面查看。
返回值
- 默认情况下在多值查询中,所有返回的结果集会统一采用 List/Map 结构。
即:每个结果集对应一个
List<Map<String, Object>>,与更新数一起存入返回的Map<String, Object>。未指定名称时,键为#result-set-N或#update-count-N,N 是从 1 开始的结果序号。 - dbVisitor 提供了一 种能力,允许在 SQL 语句中通过规则指定何种方式处理对应语句的查询结果。
1. 通过在语句中添加 ‘@{resultSet} 规则’ 指定结果集类型
set @userName = convert(? USING utf8); @{resultUpdate,name=upd}
select * from test_user where name = @userName; @{resultSet,name=res1,javaType=net.demo.dto.User}
select * from test_user where name != @userName; @{resultSet,name=res2,javaType=net.demo.dto.User}
该示例中:
- 第一条语句使用 resultUpdate 规则,规则为更新数设定了名称
upd。 - 第二条语句使用 resultSet 规则,规则为结果集设定了名称
res1和类型net.demo.dto.User。 - 第三条语句使用 resultSet 规则,规则为结果集设定了名称
res2和类型net.demo.dto.User。
2. 执行含有 ‘@{resultSet} 规则’ 的查询并获取结果集
String query = "set @userName = convert(? USING utf8); @{resultUpdate,name=upd}" +
"select * from test_user where name = @userName; @{resultSet,name=res1,javaType=net.demo.dto.User}" +
"select * from test_user where name != @userName; @{resultSet,name=res2,javaType=net.demo.dto.User}";
Map<String, Object> result = jdbcTemplate.multipleExecute(query, "muhammad");
List<User> result1 = (List<User>) result.get("res1"); // 对应 语句的结果
List<User> result2 = (List<User>) result.get("res2"); // 对应 语句的结果
信息
更多关于 @{resultSet,xxx} 规则的用法请参考 RESULT 规则。
信息
- multipleExecute 查询返回结果会使用 LinkedCaseInsensitiveMap 或 LinkedHashMap 来保证多个语句结果之间的顺序。
- 详细信息请参考 Map 大小写敏感性。