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

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

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



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

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.调用 存储过程:

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.调用存储方法:

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.调用存储过程,一个输入参数,返回一个查询结果集合

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);
		}
	}
}


  • 9
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
存储过程是一组预定义的SQL语句组成的代码块,可以在数据库中进行重复使用。在Java中,可以使用Spring Data JPA来调用存储过程。 下面是一个示例代码,展示了如何使用Spring Data JPA调用存储过程: 首先,你需要定义一个接口来访问存储过程。这个接口需要继承JpaRepository或者继承其他Spring Data JPA提供的相关接口。在接口中,使用@Procedure注解来指定要调用存储过程的名称。 ```java @Repository public interface MyRepository extends JpaRepository<MyEntity, Long> { @Procedure(name = "my_stored_procedure") void callMyStoredProcedure(); } ``` 然后,你可以在你的代码中注入这个接口,并调用存储过程。 ```java @Service public class MyService { private final MyRepository myRepository; public MyService(MyRepository myRepository) { this.myRepository = myRepository; } public void executeStoredProcedure() { myRepository.callMyStoredProcedure(); } } ``` 在上面的示例中,我们定义了一个名为"my_stored_procedure"的存储过程,并在MyRepository接口中使用@Procedure注解进行了标记。在MyService类中,我们注入了MyRepository接口,并调用了callMyStoredProcedure方法来执行存储过程。 请注意,具体的存储过程调用方式会根据不同的数据库提供商而有所不同。你需要根据自己使用的数据库以及数据库驱动程序的文档来了解如何在Java调用特定数据库的存储过程。<span class="em">1</span> #### 引用[.reference_title] - *1* [Spring Data JPA调用存储过程实例代码](https://download.csdn.net/download/weixin_38550834/12782345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值