1. 程式人生 > >Hibernate呼叫SQLserver儲存過程

Hibernate呼叫SQLserver儲存過程

首先我們在sqlserver中寫一個儲存過程,也就是一個簡單的查詢。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE my_procedure

AS
BEGIN

	SET NOCOUNT ON;


	select * from t_gj_saleorder 
END
GO

根據自己表的情況,修改上面的t_gj_saleorder.

下面是java程式碼,我的是spring+hibernate框架,所以用獲取bean的方式拿到sessionFactory。

package com.smart.oo.service.trigger;

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

import org.apache.struts2.convention.annotation.Results;
import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.context.ApplicationContext;

public class MainTest {
	@SuppressWarnings("deprecation")
	public static void main(String[] args) throws Exception {
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
//		SyncNationOrderTrigger syncNationOrderTrigger=(SyncNationOrderTrigger) applicationContext.getBean("sessionFactory");
//		syncNationOrderTrigger.syncOrder();
		SessionFactory sessionFactory=(SessionFactory) applicationContext.getBean("sessionFactory");
		Session session=sessionFactory.openSession();
		Connection connection=session.connection();
		String sql="{call my_procedure}";
		CallableStatement cs=connection.prepareCall(sql);
		ResultSet resultSet=cs.executeQuery();
		while(resultSet.next()){
			System.out.println(resultSet.getString(1)+","+resultSet.getString(2));
		}
	}
}

下面我們來稍微做一下修改,做一個可以有傳入傳出引數的儲存過程:

USE [db_bboo]
GO
/****** Object:  StoredProcedure [dbo].[my_procedure]    Script Date: 07/08/2016 17:38:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[my_procedure](@id varchar(25),@test varchar(20) out)
	-- Add the parameters for the stored procedure here
	--<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, 
	--<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	select * from t_gj_saleorder where 
[email protected]
set @test='just_return' END

然後是java程式碼:
package com.smart.oo.service.trigger;

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

import org.apache.struts2.convention.annotation.Results;
import org.apache.xbean.spring.context.ClassPathXmlApplicationContext;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.context.ApplicationContext;

public class MainTest {
	@SuppressWarnings("deprecation")
	public static void main(String[] args) throws Exception {
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
//		SyncNationOrderTrigger syncNationOrderTrigger=(SyncNationOrderTrigger) applicationContext.getBean("sessionFactory");
//		syncNationOrderTrigger.syncOrder();
		SessionFactory sessionFactory=(SessionFactory) applicationContext.getBean("sessionFactory");
		Session session=sessionFactory.openSession();
		Connection connection=session.connection();
		String sql="{call my_procedure(?,?)}";
		CallableStatement cs=connection.prepareCall(sql);
		cs.setObject(1, "1467871443546000050");
		cs.registerOutParameter(2, java.sql.Types.VARCHAR);//設定第二個引數為輸出引數
		ResultSet resultSet=cs.executeQuery();
		while(resultSet.next()){
			System.out.println(resultSet.getString(1)+","+resultSet.getString(2)+","+resultSet.getString(3));
		}
		String param2 = cs.getString(2);//獲取輸出引數,也就是第二個引數
		System.out.println("--------"+param2+"---------");
	}
}


相關推薦

Hibernate呼叫SQLserver儲存過程

首先我們在sqlserver中寫一個儲存過程,也就是一個簡單的查詢。 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE my_procedure AS BEGIN SET NOCOU

mybatis 呼叫sqlserver 儲存過程

<select id="testStoredProcedure" statementType="CALLABLE" resultMap="TestMap"> <![CDATA[ {call AllNewcourse(${shopid},${cours

【mybatis】mybatis呼叫sqlserver儲存過程和表值函式

儲存過程和表值函式的區別 最簡單的區別是儲存過程是pr開頭的,而儲存過程是fn開頭的,表值函式返回的是一個表結構的結果。如果mybatis用呼叫儲存過程的方式去呼叫表值函式,就會丟擲以下的異常: exc

php呼叫sqlserver儲存過程例項,帶輸入輸出引數,經測試可用

因工作原因最近需要用到呼叫sqlserver儲存過程,並且需要輸入輸出引數,因為單純的參考網上的一些例子總有問題,最後自己解決後決定寫一寫解決的過程。並把自己寫的3個方案都放上,記錄一下自己的思路過程,經測試方案1為最優方案,效能比方案2,方案3,在10萬數量級快6倍左右。

"伺服器無法繼續該事務 3400000006"錯誤原因--JAVA呼叫SQLSERVER儲存過程過程發生異常內部事務未提交

    通過JAVA呼叫SQLSERVER儲存過程時,儲存過程內部發生了型別轉換異常,在型別轉換異常發生之前已經將事務打開了,並且在型別轉換那一行沒有采用像如下錯誤處理:     if @@error<>0 then         goto err     e

菜鳥筆記:java呼叫sqlserver儲存過程

首先建立一個儲存過程: CREATE proc HR_PER_TARGET_SCORECHECK @PLANID varchar(20),  @Obj_A0100 varchar(20), @Body

基於C#中的類SqlCommand物件呼叫SQLServer儲存過程時,儲存過程執行成功,但是物件方法ExecuteNonQuery()返回-1

問題如題。 【下面是一個例子】 1、儲存過程完成的功能是:插入insert一條記錄,相同主鍵的記錄存在時執行更新update的操作。儲存過程正常執行的返回值是1.(不過本文提到的問題和這個返回值沒關係。) 2、在另一個.cs檔案中使用 SqlCommand物件 呼叫方法Ex

spring data jpa 如何呼叫mysql儲存過程

  A:首先定義儲存過程依賴的jpa表:     @Entity     @Table(name="evenmngt_childthingtree_tmp")//資料庫中的表名     @Name

C#呼叫ORACLE儲存過程返回結果集

Oracle中scott使用者下建立儲存過程: (注:從9i開始有了sys_refcursor這種型別,在以前的Oracle版本中需要使用REF CURSOR,並且還需放在一個程式包中) create or replace procedure sp_getdept (result

jdbc呼叫mysql儲存過程

public static void updateMtBeginTimeIsSix() { Connection connection = null; CallableStatement cs = null; try { connection = DataSource.getI

ireport5呼叫sqlserver2005儲存過程方法

1、儲存過程準備 ALTER PROCEDURE [dbo].[portofolio_definition_get]       @flag INT       AS BEGIN

mybaties呼叫mysql儲存過程儲存過程返回多個select結果集。

先看需求,直接上圖 從圖中看出,需要12條普通的SELECT語句,所以就放到儲存過程中 儲存過程如下: DROP PROCEDURE IF EXISTS proc_report; DELIMITER $ CREATE PROCEDURE proc_report( OUT d_norma

sqlserver儲存過程/遊標及例項

--系統儲存過程exec sp_databases --檢視系統資料庫exec sp_tables --檢視系統表exec sp_rename 'aaa','bbb' --修改表明aaa為bbbexec sp_rename 'dbo.aaa','col1','col2' --修改表aaa的列col1為col2

SQLSERVER儲存過程的基本語法例項

SQLSERVER儲存過程的基本語法例項 SQLSERVER儲存過程的基本語法例項 一、定義變數--簡單賦值 declare @a intset @a=5 print @a --使用select語句賦值 declare @user1 nvarchar(50) select @user1='張三'prin

sqlserver儲存過程實現資料批量刪除--分割字串實現

寫的儲存過程,接收的引數的一個字串,通過分割字串從而實現批量刪除。 IF (@operation = 'delete') BEGIN DECLARE @temp nvarchar(200) DECLARE @splitchar nvarchar(1) SET

java中呼叫Oracle儲存過程時,出現異常:java.sql.SQLException: ORA-00928: 缺失 SELECT 關鍵字(已解決)

在java中呼叫Oracle儲存過程時,出現異常:java.sql.SQLException: ORA-00928: 缺失 SELECT 關鍵字 //java程式碼 @Test public void testProcedure(){

ABAP使用AMDP呼叫HANA儲存過程

更多內容關注公眾號:SAP Technical 歡迎關注微信公眾號:SAP Technical 資料建模在SAP HANA檢視中完成,需要讀取檢視的輸出並將其保留在HANA表中。編寫儲存過程以從HANA檢視讀取資料並將資料插入HANA表。 儲存庫儲存過程'DATA_PERSIS

python呼叫oracle儲存過程

# -*- coding: utf-8 -*- import cx_Oracle conn = cx_Oracle.connect('user','pwd','tns') cursor = conn.cursor() #宣告變數 #呼叫儲存過程 sql = ''' declare result

使用JDBC呼叫mysql儲存過程

多敲幾次java連線mysql,多操作一些簡單的例項,多看大神們的部落格很快就能掌握好java對資料庫的操作了。 程式碼: public static void procedure() throws ClassNotFoundException, SQLException{

sqlserver儲存過程

儲存過程 Transact-SQL中的儲存過程,非常類似於Java語言中的方法,它可以重複呼叫。當儲存過程執行一次後,可以將語句快取中,這樣下次執行的時候直接使用快取中的語句。這樣就可以提高儲存過程的效能。 儲存過程的概念 儲存過程Procedure是一組為了完