Java代码调用存储过程和存储方法

Posted 有梦就能实现

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java代码调用存储过程和存储方法相关的知识,希望对你有一定的参考价值。

准备一个oracle 的JDBC jar 包:ojdbc14_11g.jar

首先找到你的 oracle 安装位置,例如:

技术分享图片

 

1.创建一个JDBC数据库连接工具类:

 

  1. package com.test.db;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7. import java.sql.Statement;  
  8.   
  9. public class JDBCUtils {  
  10.   
  11.     private static String driver = "oracle.jdbc.OracleDriver";  
  12.     private static String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";  
  13.     private static String user = "数据库连接名";  
  14.     private static String password = "数据库连接密码";  
  15.       
  16.     //注册数据库驱动  
  17.     static{  
  18.         try {  
  19.             Class.forName(driver);  
  20.         } catch (Exception e) {  
  21.             throw new ExceptionInInitializerError(e);  
  22.         }  
  23.     }  
  24.       
  25.     /** 
  26.      * 获取数据库连接 
  27.      * @return 
  28.      */  
  29.     public static Connection getConnection(){  
  30.         try {  
  31.             return DriverManager.getConnection(url,user,password);  
  32.         } catch (SQLException e) {  
  33.             e.printStackTrace();  
  34.         }  
  35.         return null;  
  36.     }  
  37.       
  38.     /** 
  39.      * 释放数据库连接资源 
  40.      * @param conn 
  41.      * @param st 
  42.      * @param rs 
  43.      */  
  44.     public static void release(Connection conn,Statement st,ResultSet rs){  
  45.         if (rs!=null) {  
  46.             try {  
  47.                 rs.close();  
  48.             } catch (SQLException e) {  
  49.                 e.printStackTrace();  
  50.             }finally{  
  51.                 rs = null;  
  52.             }  
  53.         }  
  54.           
  55.         if (st!=null) {  
  56.             try {  
  57.                 st.close();  
  58.             } catch (SQLException e) {  
  59.                 e.printStackTrace();  
  60.             }finally{  
  61.                 st = null;  
  62.             }  
  63.         }  
  64.           
  65.         if (conn!=null) {  
  66.             try {  
  67.                 conn.close();  
  68.             } catch (SQLException e) {  
  69.                 e.printStackTrace();  
  70.             }finally{  
  71.                 conn = null;  
  72.             }  
  73.         }  
  74.     }  
  75. }  
package com.test.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils {

	private static String driver = "oracle.jdbc.OracleDriver";
	private static String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
	private static String user = "数据库连接名";
	private static String password = "数据库连接密码";
	
	//注册数据库驱动
	static{
		try {
			Class.forName(driver);
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}
	
	/**
	 * 获取数据库连接
	 * @return
	 */
	public static Connection getConnection(){
		try {
			return DriverManager.getConnection(url,user,password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 释放数据库连接资源
	 * @param conn
	 * @param st
	 * @param rs
	 */
	public static void release(Connection conn,Statement st,ResultSet rs){
		if (rs!=null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				rs = null;
			}
		}
		
		if (st!=null) {
			try {
				st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				st = null;
			}
		}
		
		if (conn!=null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				conn = null;
			}
		}
	}
}

2.调用 存储过程:

 

  1. package com.test.demo;  
  2.   
  3. import java.sql.CallableStatement;  
  4. import java.sql.Connection;  
  5.   
  6. import org.junit.Test;  
  7.   
  8. import oracle.jdbc.internal.OracleTypes;  
  9. import oracle.jdbc.oracore.OracleType;  
  10.   
  11. import com.hwb.db.JDBCUtils;  
  12.   
  13. /** 
  14.  * 调用存储过程  一个输入参数,多个 输出参数 
  15.  * @author Administrator 
  16.  * 
  17.  */  
  18. public class ProcedureTest {  
  19.   
  20.     /** 
  21.      * create or replace procedure selectUserById(uid in number, 
  22.                                            uName out VARCHAR2, 
  23.                                            uAge out number, 
  24.                                            uSex out char) 
  25.      */  
  26.       
  27.     @Test  
  28.     public void testProcedure(){  
  29.           
  30.         String sql = "{call selectUserById(?,?,?,?)}";  
  31.           
  32.         Connection conn = null;  
  33.         CallableStatement call = null;  
  34.         try {  
  35.             //得到一个数据库连接  
  36.             conn = JDBCUtils.getConnection();  
  37.             //通过连接创建出statement  
  38.             call = conn.prepareCall(sql);  
  39.             //对于in参数,赋值  
  40.             call.setInt(1, 2);  // (第几个问号,要赋的值)  
  41.             //对out参数,声明  
  42.             call.registerOutParameter(2, OracleTypes.VARCHAR);  //(第几个问号,声明的类型)  
  43.             call.registerOutParameter(3, OracleTypes.NUMBER);  
  44.             call.registerOutParameter(4, OracleTypes.CHAR);  
  45.               
  46.             //执行调用  
  47.             call.execute();  
  48.               
  49.             //取出结果  
  50.             String userName = call.getString(2);  
  51.             int userAge = call.getInt(3);  
  52.             String userSex = call.getString(4);  
  53.               
  54.             System.out.println("用户姓名:"+userName+"\n\t年龄:"+userAge+"\n\t性别:"+userSex);  
  55.               
  56.         } catch (Exception e) {  
  57.             e.printStackTrace();  
  58.         }finally{  
  59.                     //关闭连接,释放资源  
  60.                    JDBCUtils.release(conn, call, null);  
  61.         }  
  62.           
  63.     }  
  64. }  
package com.test.demo;

import java.sql.CallableStatement;
import java.sql.Connection;

import org.junit.Test;

import oracle.jdbc.internal.OracleTypes;
import oracle.jdbc.oracore.OracleType;

import com.hwb.db.JDBCUtils;

/**
 * 调用存储过程  一个输入参数,多个 输出参数
 * @author Administrator
 *
 */
public class ProcedureTest {

	/**
	 * create or replace procedure selectUserById(uid in number,
                                           uName out VARCHAR2,
                                           uAge out number,
                                           uSex out char)
	 */
	
	@Test
	public void testProcedure(){
		
		String sql = "{call selectUserById(?,?,?,?)}";
		
		Connection conn = null;
		CallableStatement call = null;
		try {
			//得到一个数据库连接
			conn = JDBCUtils.getConnection();
			//通过连接创建出statement
			call = conn.prepareCall(sql);
			//对于in参数,赋值
			call.setInt(1, 2);  // (第几个问号,要赋的值)
			//对out参数,声明
			call.registerOutParameter(2, OracleTypes.VARCHAR);  //(第几个问号,声明的类型)
			call.registerOutParameter(3, OracleTypes.NUMBER);
			call.registerOutParameter(4, OracleTypes.CHAR);
			
			//执行调用
			call.execute();
			
			//取出结果
			String userName = call.getString(2);
			int userAge = call.getInt(3);
			String userSex = call.getString(4);
			
			System.out.println("用户姓名:"+userName+"\n\t年龄:"+userAge+"\n\t性别:"+userSex);
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
                    //关闭连接,释放资源
                   JDBCUtils.release(conn, call, null);
		}
		
	}
}

3.调用存储方法:

 

  1. package com.test.demo;  
  2.   
  3. import java.sql.CallableStatement;  
  4. import java.sql.Connection;  
  5.   
  6. import oracle.jdbc.internal.OracleTypes;  
  7.   
  8. import org.junit.Test;  
  9.   
  10. import com.hwb.db.JDBCUtils;  
  11.   
  12. /** 
  13.  * 调用存储函数,一个输入参数,一个输出参数 
  14.  * @author Administrator 
  15.  * 
  16.  */  
  17. public class FunctionTest {  
  18.   
  19.     /** 
  20.      * create or replace function selectAge(eno in number) 
  21.         return number  
  22.      */  
  23.     @Test  
  24.     public void testFunction(){  
  25.         //{?= call <procedure-name>[<arg1>,<arg2>...]}  
  26.         String sql = "{call selectAge(?)}";  
  27.         Connection conn = null;  
  28.         CallableStatement call = null;  
  29.         try {  
  30.             //得到数据库连接  
  31.             conn = JDBCUtils.getConnection();  
  32.               
  33.             //通过数据库连接创建statement  
  34.             call = conn.prepareCall(sql);  
  35.               
  36.             //对于输出参数,声明  
  37.             call.registerOutParameter(1, OracleTypes.NUMBER);  
  38.               
  39.             //对于输入参数,赋值  
  40.             call.setInt(2, 3);  
  41.               
  42.             //执行调用  
  43.             call.execute();  
  44.               
  45.                         //获取返回的结果  
  46.             int age = call.getInt(1);  
  47.               
  48.             System.out.println("该用户年龄:"+age);  
  49.         } catch (Exception e) {  
  50.             e.printStackTrace();  
  51.         }finally{  
  52.             JDBCUtils.release(conn, call, null);  
  53.         }  
  54.     }  
  55. }  
package com.test.demo;

import java.sql.CallableStatement;
import java.sql.Connection;

import oracle.jdbc.internal.OracleTypes;

import org.junit.Test;

import com.hwb.db.JDBCUtils;

/**
 * 调用存储函数,一个输入参数,一个输出参数
 * @author Administrator
 *
 */
public class FunctionTest {

	/**
	 * create or replace function selectAge(eno in number)
		return number 
	 */
	@Test
	public void testFunction(){
		//{?= call <procedure-name>[<arg1>,<arg2>...]}
		String sql = "{call selectAge(?)}";
		Connection conn = null;
		CallableStatement call = null;
		try {
			//得到数据库连接
			conn = JDBCUtils.getConnection();
			
			//通过数据库连接创建statement
			call = conn.prepareCall(sql);
			
			//对于输出参数,声明
			call.registerOutParameter(1, OracleTypes.NUMBER);
			
			//对于输入参数,赋值
			call.setInt(2, 3);
			
			//执行调用
			call.execute();
			
                        //获取返回的结果
			int age = call.getInt(1);
			
			System.out.println("该用户年龄:"+age);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			JDBCUtils.release(conn, call, null);
		}
	}
}

4.调用存储过程,一个输入参数,返回一个查询结果集合

 

  1. package com.hwb.demo;  
  2.   
  3. import java.sql.CallableStatement;  
  4. import java.sql.Connection;  
  5. import java.sql.ResultSet;  
  6.   
  7.   
  8.   
  9.   
  10. import org.junit.Test;  
  11.   
  12. import oracle.jdbc.internal.OracleCallableStatement;  
  13. import oracle.jdbc.internal.OracleTypes;  
  14.   
  15. import com.hwb.db.JDBCUtils;  
  16. /** 
  17.  * 存储过程  一个输入参数,返回一个查询结果集合 
  18.  * @author Administrator 
  19.  * 
  20.  */  
  21. public class CursorTest {  
  22.   
  23.     /** 
  24.      * create or replace package Mypackage as 
  25.         procedure queryUserList(uid in number,userList out usercursor); 
  26.         end mypackage; 
  27.      */  
  28.     @Test  
  29.     public void testCursor(){  
  30.         String sql = "{call Mypackage.queryUserList(?,?) }";  
  31.           
  32.         Connection conn = null;  
  33.         CallableStatement call = null;  
  34.         ResultSet rs = null;  
  35.         try {  
  36.             //得到数据库连接  
  37.             conn = JDBCUtils.getConnection();  
  38.             //通过数据库连接创建statement  
  39.             call = conn.prepareCall(sql);  
  40.               
  41.             //对于输入参数,赋值  
  42.             call.setInt(1, 1);  
  43.             //对于输出参数,声明  
  44.             call.registerOutParameter(2, OracleTypes.CURSOR);  
  45.             //执行调用  
  46.             call.execute();  
  47.             //将CallableStatement 强转成  OracleCallableStatement 用来获取光标类型Cursor,并得到结果ResultSet  
  48.             rs = ((OracleCallableStatement)call).getCursor(2);  
  49.             //遍历 ResultSet  
  50.             while (rs.next()) {  
  51.                 //根据类型和列名取值  
  52.                 int id = rs.getInt("user_id");    //括号内为 列名  
  53.                 String user_name = rs.getString("user_name");  
  54.                 int age = rs.getInt("user_age");  
  55.                 String sex = rs.getString("user_sex");  
  56.                 System.out.println("查询到的用户信息:\n\tid:"+id+"\n\t姓名:"+user_name  
  57.                         +"\n\t年龄:"+age+"\n\t性别:"+sex);  
  58.             }  
  59.               
  60.               
  61.               
  62.         } catch (Exception e) {  
  63.             e.printStackTrace();  
  64.         }finally{  
  65.             JDBCUtils.release(conn, call, rs);  
  66.         }  
  67.     }  
  68. }  
package com.hwb.demo;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;




import org.junit.Test;

import oracle.jdbc.internal.OracleCallableStatement;
import oracle.jdbc.internal.OracleTypes;

import com.hwb.db.JDBCUtils;
/**
 * 存储过程  一个输入参数,返回一个查询结果集合
 * @author Administrator
 *
 */
public class CursorTest {

	/**
	 * create or replace package Mypackage as
		procedure queryUserList(uid in number,userList out usercursor);
		end mypackage;
	 */
	@Test
	public void testCursor(){
		String sql = "{call Mypackage.queryUserList(?,?) }";
		
		Connection conn = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try {
			//得到数据库连接
			conn = JDBCUtils.getConnection();
			//通过数据库连接创建statement
			call = conn.prepareCall(sql);
			
			//对于输入参数,赋值
			call.setInt(1, 1);
			//对于输出参数,声明
			call.registerOutParameter(2, OracleTypes.CURSOR);
			//执行调用
			call.execute();
			//将CallableStatement 强转成  OracleCallableStatement 用来获取光标类型Cursor,并得到结果ResultSet
			rs = ((OracleCallableStatement)call).getCursor(2);
			//遍历 ResultSet
			while (rs.next()) {
				//根据类型和列名取值
				int id = rs.getInt("user_id");    //括号内为 列名
				String user_name = rs.getString("user_name");
				int age = rs.getInt("user_age");
				String sex = rs.getString("user_sex");
				System.out.println("查询到的用户信息:\n\tid:"+id+"\n\t姓名:"+user_name
						+"\n\t年龄:"+age+"\n\t性别:"+sex);
			}
			
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			JDBCUtils.release(conn, call, rs);
		}
	}
}

以上是关于Java代码调用存储过程和存储方法的主要内容,如果未能解决你的问题,请参考以下文章

Java调用SQL Server的存储过程详解(转)

java如何调用存储过程 代码如下,最好能解释下相关函数的作用,不胜感激

java代码调用数据库存储过程

使用spring从db2数据库调用存储过程到java代码

Java:在 oracle 数据库中调用存储过程

SQL存储过程如何调用存储过程?