JDBC创建并调用存储过程

一直不知道存储过程是干嘛的,也不知道怎么使用,今天在网上看了资料,并且实践了一下,慢慢琢磨也算懂了一点点皮毛

用的是MySQL,在java中用jdbc使用

package com.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;

import com.test.util.Util;

public class JdbcCunChuGuoCheng {

	public static void main(String[] args) {

		JdbcCunChuGuoCheng jdbc=new JdbcCunChuGuoCheng();
		
		//执行返回int类型的存储过程
		jdbc.callProcedure();
		
		//执行返回resultset类型的存储过程
		jdbc.callProcedure1();
		
	}

	/**
	 * 创建存储过程(查询返回的是int,不是resultset)
	 */
	public void createProcedure(){
		String sql="create procedure demo(in i_id int,out o_count int)"
				+" begin"
				+" select count(*) into o_count from city where id<i_id;"
				+" end;";
		this.executeSql(sql, null);
	}
	
	/**
	 * 调用存储过程
	 */
	public void callProcedure(){
		//先创建存储过程(只需要第一次创建)
		this.createProcedure();
		//再调用
		String procedure="{ call demo(?,?)}";
		Connection conn=null;
		ResultSet rs=null;
		CallableStatement cs=null;
		PreparedStatement ps=null;
		try {
			conn=Util.getConn();
			cs=conn.prepareCall(procedure);
			cs.setInt(1, 10);//设置参数
			cs.registerOutParameter(2,Types.INTEGER);//注册传出的参数
			cs.executeUpdate();
			System.out.println(cs.getInt(2));//2与上面的注册位置2对应
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			close(rs,ps,conn,cs);
		}
	}
	
	/**
	 * 创建存储过程1(查询返回的是resultset)
	 */
	public void createProcedure1(){
		String sql="create procedure demo1(in i_id int)"
				+" begin"
				+" select * from city where id>i_id;"
				+" end;";
		this.executeSql(sql, null);
	}
	
	/**
	 * 调用存储过程1
	 */
	public void callProcedure1(){
		//先创建
		this.createProcedure1();
		//再调用
		String procedure1="{call demo1(?)}";
		Connection conn=null;
		CallableStatement cs=null;
		ResultSet rs=null;
		try{
			conn=Util.getConn();
			cs=conn.prepareCall(procedure1);
			cs.setInt(1, 10);//设置参数
			rs=cs.executeQuery();
			while(rs.next()){
				System.out.println(rs.getString("name"));
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			close(rs,null,conn,cs);
		}
		
	}
	
	
	/**
	 * 查询公用
	 */
	public void getAllList(String sql,Object...objects){
		Connection conn=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		try{
			conn=Util.getConn();
			ps=conn.prepareStatement(sql);
			if(null != objects && objects.length>0){
				for(int i=0;i<objects.length;i++){
					ps.setObject(i+1, objects[i]);
				}
			}
			rs=ps.executeQuery();
			while(rs.next()){
				System.out.println(rs.getRow());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			close(rs,ps,conn,null);
		}
	}
	
	/**
	 * 增删改公用
	 */
	public int executeSql(String sql,Object...objects){
		int result=0;
		Connection conn=null;
		PreparedStatement ps=null;
		try{
			conn=Util.getConn();
			ps=conn.prepareStatement(sql);
			if(null != objects && objects.length>0){
				for(int i=0;i<objects.length;i++){
					ps.setObject(i+1, objects[i]);
				}
			}
			result=ps.executeUpdate();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			close(null,ps,conn,null);
		}
		return result;
	}
	
	/**
	 * 关闭连接公用
	 */
	public void close(ResultSet rs,PreparedStatement ps,Connection conn,CallableStatement cs){
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(ps!=null){
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(cs!=null){
			try {
				cs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
}

callProcedure()和callProcedure1()的方法结果如下图:

          

    

主要方法也就是createProcedure(),createProcedure1(),callProcedure()和callProcedure1()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值