jdbc mysql 存储过程查询_jdbc调用mysql存储过程,并获得结果集合

本文展示了如何使用Java的JdbcTemplate调用MySQL存储过程,并获取存储过程返回的结果集。通过创建CallableStatementCallback处理结果集,转换为Java对象进行操作。示例中包含了无输入参数和有输入参数的存储过程调用方式。
摘要由CSDN通过智能技术生成

最近碰到一个需要Java调用mysql存储过程并获得存储过程结果集的场景.

存储过程:spilte_result:分割字符串存储到临时表,并返回临时表的结果

数据库执行结果

0818b9ca8b590ca3270a3433284dd417.png

sum_interface_traffic_result:统计策略流量

0818b9ca8b590ca3270a3433284dd417.png

现在使用JdbcTemplate进行调用存储过程并且获得结果

package com.cqs.demo.jdbc;

import org.springframework.jdbc.core.BeanPropertyRowMapper;

import org.springframework.jdbc.core.CallableStatementCallback;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.core.simple.SimpleJdbcCall;

import org.springframework.stereotype.Component;

import javax.annotation.Resource;

import java.sql.CallableStatement;

import java.sql.ResultSet;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

@Component

public class JdbcTemplateProcessCall {

@Resource

JdbcTemplate jdbcTemplate;

public List callProcessResultSet() {

List result = (List) jdbcTemplate.execute(

con -> {

String storedProc = "{call sum_interface_traffic_result()}";//SQL

CallableStatement cs = con.prepareCall(storedProc);

return cs;

}, (CallableStatementCallback) cs -> {

List list = new ArrayList<>();

boolean exist = cs.execute();

if (exist) {

ResultSet resultSet = cs.getResultSet();

//遍历结果集

while (resultSet.next()) {

// System.out.println("strategyId:" + resultSet.getInt(1) + "\tsum_in_traffic:" + resultSet.getFloat(2) + "\tsum_out_traffic:" + resultSet.getFloat(3));

SumStrategyTraffic sumStrategyTraffic = new SumStrategyTraffic();

sumStrategyTraffic.setStrategyId(resultSet.getInt(1));

sumStrategyTraffic.setSumInTraffic(resultSet.getFloat(2));

sumStrategyTraffic.setSumOutTraffic(resultSet.getFloat(3));

list.add(sumStrategyTraffic);

}

}

return list;

});

System.out.println("获得存储结果集:");

result.forEach(System.out::println);

return result;

}

//带有输入值的例子

public void callProcessResultSetWithInput() {

List result = (List) jdbcTemplate.execute(

con -> {

String storedProc = "{call split_result(?)}";// 调用的sql

CallableStatement cs = con.prepareCall(storedProc);

cs.setString(1, "783,268");// 设置输入参数的值

//cs.registerOutParameter(2, JDBCType.REF_CURSOR);// 注册输出参数的类型

return cs;

}, (CallableStatementCallback) cs -> {

List list = new ArrayList<>();

boolean exist = cs.execute();

ResultSet resultSet = cs.getResultSet();

if (exist) {

while (resultSet.next()) {

// System.out.println(resultSet.getString(1));

list.add(resultSet.getString(1));

}

}

return list;

});

System.out.println("存储过程结果:"+result);

}

//通过SimpleJdbcCall调用存储过程

public List callProcessResultSetWithSimpleJdbcCall(){

SimpleJdbcCall call = new SimpleJdbcCall(this.jdbcTemplate)

.withProcedureName("sum_interface_traffic_result")

.withoutProcedureColumnMetaDataAccess()

.returningResultSet("sumStrategyTraffic", BeanPropertyRowMapper.newInstance(SumStrategyTraffic.class));

Map map = call.execute();

@SuppressWarnings("unchecked")

List result = (List) map.get("sumStrategyTraffic");

System.out.println("存储过程结果:");

result.forEach(System.out::println);

return result;

}

}

package com.cqs.demo.jdbc;

public class SumStrategyTraffic {

private int strategyId;

private float sumInTraffic;

private float sumOutTraffic;

public int getStrategyId() {

return strategyId;

}

public void setStrategyId(int strategyId) {

this.strategyId = strategyId;

}

public float getSumInTraffic() {

return sumInTraffic;

}

public void setSumInTraffic(float sumInTraffic) {

this.sumInTraffic = sumInTraffic;

}

public float getSumOutTraffic() {

return sumOutTraffic;

}

public void setSumOutTraffic(float sumOutTraffic) {

this.sumOutTraffic = sumOutTraffic;

}

@Override

public String toString() {

return "SumStrategyTraffic{" +

"strategyId=" + strategyId +

", sumInTraffic=" + sumInTraffic +

", sumOutTraffic=" + sumOutTraffic +

'}';

}

}JUnit单元测试

package com.cqs.demo.jdbc;

import com.cqs.demo.base.BaseConfigurationTest;

import org.junit.Test;

import javax.annotation.Resource;

/**

* Created by cqs on 16-12-4.

*/

public class JdbcTemplateProcessCallTest extends BaseConfigurationTest {

@Resource

JdbcTemplateProcessCall jdbcTemplateProcessCall;

@Test

public void callProcessResultSet() throws Exception {

jdbcTemplateProcessCall.callProcessResultSet();

}

@Test

public void callProcessResultSetWithInput() throws Exception {

jdbcTemplateProcessCall.callProcessResultSetWithInput();

}

@Test

public void callProcessResultSetWithSimpleJdbcCall() throws Exception {

jdbcTemplateProcessCall.callProcessResultSetWithSimpleJdbcCall();

}

}

运行结果

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值