jdbc调用mysql存储过程,并获得结果集合
2016-12-04 11:58
519 查看
最近碰到一个需要Java调用mysql存储过程并获得存储过程结果集的场景.
存储过程:spilte_result:分割字符串存储到临时表,并返回临时表的结果
数据库执行结果
sum_interface_traffic_result:统计策略流量
现在使用JdbcTemplate进行调用存储过程并且获得结果
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单元测试
运行结果
存储过程:spilte_result:分割字符串存储到临时表,并返回临时表的结果
数据库执行结果
sum_interface_traffic_result:统计策略流量
现在使用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<SumStrategyTraffic> 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<SumStrategyTraffic> 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<String> 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<SumStrategyTraffic> callProcessResultSetWithSimpleJdbcCall(){ SimpleJdbcCall call = new SimpleJdbcCall(this.jdbcTemplate) .withProcedureName("sum_interface_traffic_result") .withoutProcedureColumnMetaDataAccess() .returningResultSet("sumStrategyTraffic", BeanPropertyRowMapper.newInstance(SumStrategyTraffic.class)); Map<String, Object> map = call.execute(); @SuppressWarnings("unchecked") List<SumStrategyTraffic> result = (List<SumStrategyTraffic>) 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(); } }
运行结果
相关文章推荐
- python2.7调用mysql存储过程并且返回结果
- MySQL 存储过程实例 与 ibatis/mybatis/hibernate/jdbc 如何调用存储过程
- python 调用mysql存储过程返回结果集
- c/c++调用mysql存储过程,并获得返回值
- VB.NET调用MySQL存储过程并获得返回值的方法
- MySQL存储过程相互调用并获得错误码
- php调用MySQL存储过程的方法集合(推荐)
- mybatis调用mysql存储过程返回结果集
- MySQL存储过程与JDBC调用
- Python简单调用MySQL存储过程并获得返回值的方法
- Java调用MySQL存储过程并获得返回值的方法
- php调用MySQL存储过程的方法集合(推荐)
- python 调用mysql存储过程返回结果集
- JDBC基于MVC架构项目实例-实现对MySQL数据表的增删改查、调用数据表中的存储过程和函数
- Java 调用 MySQL 存储过程并获得返回值
- JDBC远程调用mysql存储过程错误
- JDBC-MYSQL-存储函数和存储过程的调用
- php调用MySQL存储过程的方法集合
- mysql 多日志表结果集合拼接存储过程
- Python简单调用MySQL存储过程并获得返回值的方法