데이터 베이스 MySQL 튜토리얼 Hibernate 调用sqlserver存储过程

Hibernate 调用sqlserver存储过程

Jun 07, 2016 pm 03:20 PM
hibernate sqlserver 저장 부르다 프로세스

存储 过程 : if exists(select name from sysobjects where name='person_select' and type='P') drop proceduredbo.person_select go create proc dbo.person_select as select * from person go hibernate.hbm.xml: pojo就不写了直奔主题 我是在dao的实现

Hibernate 调用sqlserver存储过程

存储过程

if exists(select name from sysobjects where name='person_select' and
type='P')
 drop procedure dbo.person_select
go
 create proc dbo.person_select
 as
  select * from person
go

hibernate.hbm.xml:

Hibernate 调用sqlserver存储过程

pojo就不写了直奔主题

我是在dao的实现类DaoImpl里面写的主要方法:

这是引入的包

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.hibernate.HibernateException;
import org.hibernate.Session;

下面是实现方法

public List findAllPersons_proc() {
   System.out.println("0----------------");
  return (List)getHibernateTemplate().execute(new HibernateCallback() {
    public Object doInHibernate(Session session)
      throws HibernateException, SQLException {
     String hql = "{call person_select}";
     session.flush();
     ResultSet rs=session.connection().prepareCall(hql).executeQuery();
     List list=new ArrayList();
     while (rs.next()) {
      Person p=new Person();
      p.setId(rs.getInt(1));
      p.setName(rs.getString(2));
      p.setAge(rs.getInt(3));
      list.add(p);
     }
     rs.close();
     session.close();
     return list;
    }
   });
 }

用的时候直接Action调用service,service调用dao,调到该方法就可

serice实现类serviceImpl:

Hibernate 调用sqlserver存储过程


Action 方法:

Hibernate 调用sqlserver存储过程

其余的增删改查可以类似写法即可

这是查

session.connection().prepareCall(hql).executeQuery();

改executeQuery();为executeUpdate就行 。。。。。。。等等的
---------------------lieh


 hibernate调sqlserver存储过程,做插入操作

sqlserver:存储过程  传进来三个参数

if exists(select name from sysobjects where name='person_save' and
type='P')
 drop procedure dbo.person_save
go
 create proc dbo.person_save
  @id varchar(20),
  @name varchar(20),
  @age varchar(20)
 as
  insert into person
  values
  (@id,@name,@age)
 return
go

然后在person.hbm.xml里面这个存储过程配置如下:


     
     

     {call person_save(?,?,?)}

DaoImpl里面的方法:  --这是一个无返回值的方法

public void savePersons_proc(final String id,final String name,final String age) {

 //参数要是final类型的,否则在下面用的时候得不到参数

//dao 里面的  void savePersons_proc(String id,String name,String age);可以这样写
  System.out.println("0----------------");
  getHibernateTemplate().execute(new HibernateCallback() {
   public Object doInHibernate(Session session)
    throws HibernateException, SQLException {
       String hql = "{call person_save(?,?,?)}";
       session.flush();
       CallableStatement casm=session.connection().prepareCall(hql);
       System.out.println("----------DaoIMpl----------");
       casm.setString(1, id);//设置参数值
       casm.setString(2, name);
       casm.setString(3, age);
       casm.execute();
       return null;
   }
  });
 }

这是一个有返回值的方法:

public boolean savePersons_proc2(String id,String name,String age) {
  System.out.println("0----------------");
  try {
   Session session=getHibernateTemplate().getSessionFactory().openSession();
   session.flush();
   CallableStatement cs=session.connection().prepareCall("{call person_save(?,?,?)}");
   cs.setString(1, id);
   cs.setString(2, name);
   cs.setString(3, age);
   boolean b=false;
//   b=cs.execute();

//使用execute,返回值不知为啥为false,存储过程成功执行了,数据库数据也插入了,但就是返回为false;
   int i=cs.executeUpdate();
//这里因为我的存储过程直插入了一行数据,所有如果成功执行存储过程,那么返回值必定是1,

//换言之,如果我的存储过程执行力四行插入数据的话,如此成功执行,则返回值必定是4

// 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和

//DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。

//executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP

//TABLE 等不操作行的语句,executeUpdate 的返回值总为零。 

//所有对i的值进行判断,来确定返回值

    if(i==1){

      b=true;

    }
   return b;
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   System.out.println("------dao impl false  Exce...------");
   return false;
  }
 }

方法executeQuery
   用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。
  
   方法executeUpdate
   用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
  
   使用executeUpdate方法是因为在 createTableCoffees 中的 SQL 语句是 DDL (数据定义语言)语句。创建表,改变表,删除表都是 DDL 语句的例子,要用 executeUpdate 方法来执行。你也可以从它的名字里看出,方法 executeUpdate 也被用于执行更新表 SQL 语句。实际上,相对于创建表来说,executeUpdate 用于更新表的时间更多,因为表只需要创建一次,但经常被更新。

    方法execute:
   用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能
  
   execute方法应该仅在语句能返回多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组合时使用。当执行某个已存储过程 或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。
   因为方法 execute 处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方法 execute 执行该过程后,必须调用方法 getResultSet 获得第一个结果集,然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集,需要先调用 getMoreResults 方法,然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数,则首先调用方法 getUpdateCount,然后调用 getMoreResults,并再次调用 getUpdateCount。
   对于不知道返回内容,则情况更为复杂。如果结果是 ResultSet 对象,则方法 execute 返回 true;如果结果是 Java int,则返回 false。如果返回 int,则意味着结果是更新计数或执行的语句是 DDL 命令。在调用方法 execute 之后要做的第一件事情是调用 getResultSet 或 getUpdateCount。调用方法 getResultSet 可以获得两个或多个 ResultSet 对象中第一个对象;或调用方法 getUpdateCount 可以获得两个或多个更新计数中第一个更新计数的内容。
   当 SQL 语句的结果不是结果集时,则方法 getResultSet 将返回 null。这可能意味着结果是一个更新计数或没有其它结果。在这种情况下,判断 null 真正含义的唯一方法是调用方法 getUpdateCount,它将返回一个整数。这个整数为调用语句所影响的行数;如果为 -1 则表示结果是结果集或没有结果。如果方法 getResultSet 已返回 null(表示结果不是 ResultSet 对象),则返回值 -1 表示没有其它结果。也就是说,当下列条件为真时表示没有结果(或没有其它结果):
  
  ((stmt.getResultSet() == null) && (stmt.getUpdateCount() == -1))
  
   如果已经调用方法 getResultSet 并处理了它返回的 ResultSet 对象,则有必要调用方法 getMoreResults 以确定是否有其它结果集或更新计数。如果 getMoreResults 返回 true,则需要再次调用 getResultSet 来检索下一个结果集。如上所述,如果 getResultSet 返回 null,则需要调用 getUpdateCount 来检查 null 是表示结果为更新计数还是表示没有其它结果。
  
   当 getMoreResults 返回 false 时,它表示该 SQL 语句返回一个更新计数或没有其它结果。因此需要调用方法 getUpdateCount 来检查它是哪一种情况。在这种情况下,当下列条件为真时表示没有其它结果:
  
  ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
  
   下面的代码演示了一种方法用来确认已访问调用方法 execute 所产生的全部结果集和更新计数:
  
  
  stmt.execute(queryStringWithUnknownResults);
  while (true) {
  int rowCount = stmt.getUpdateCount();
  if (rowCount > 0) { // 它是更新计数
  System.out.println("Rows changed = " + count);
  stmt.getMoreResults();
  continue;
  }
  if (rowCount == 0) { // DDL 命令或 0 个更新
  System.out.println(" No rows changed or statement was DDL
  command");
  stmt.getMoreResults();
  continue;
  }
  
  // 执行到这里,证明有一个结果集
  // 或没有其它结果
  
  ResultSet rs = stmt.getResultSet;
  if (rs != null) {
  . . . // 使用元数据获得关于结果集列的信息
  while (rs.next()) {
  . . . // 处理结果
  stmt.getMoreResults();
  continue;
  }
  break; // 没有其它结果


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

mdf 파일을 sqlserver로 가져오는 방법 mdf 파일을 sqlserver로 가져오는 방법 Apr 08, 2024 am 11:41 AM

가져오기 단계는 다음과 같습니다. MDF 파일을 SQL Server의 데이터 디렉터리(일반적으로 C:\Program Files\Microsoft SQL Server\MSSQL\DATA)에 복사합니다. SSMS(SQL Server Management Studio)에서 데이터베이스를 열고 연결을 선택합니다. 추가 버튼을 클릭하고 MDF 파일을 선택합니다. 데이터베이스 이름을 확인하고 확인 버튼을 클릭합니다.

sqlserver 데이터베이스에 이름이 지정된 개체가 이미 존재하는 문제를 해결하는 방법 sqlserver 데이터베이스에 이름이 지정된 개체가 이미 존재하는 문제를 해결하는 방법 Apr 05, 2024 pm 09:42 PM

SQL Server 데이터베이스에 이미 존재하는 동일한 이름을 가진 개체의 경우 다음 단계를 수행해야 합니다. 개체 유형(테이블, 뷰, 저장 프로시저)을 확인합니다. IF NOT EXISTS를 사용하면 객체가 비어 있는 경우 생성을 건너뛸 수 있습니다. 개체에 데이터가 있는 경우 다른 이름을 사용하거나 구조를 수정하세요. 기존 개체를 삭제하려면 DROP을 사용하세요. 주의하세요. 백업을 권장합니다. 삭제되거나 이름이 바뀐 개체에 대한 참조가 없는지 확인하려면 스키마 변경 사항을 확인하세요.

sqlserver 서비스를 시작할 수 없는 경우 수행할 작업 sqlserver 서비스를 시작할 수 없는 경우 수행할 작업 Apr 05, 2024 pm 10:00 PM

SQL Server 서비스가 시작되지 않는 경우 해결해야 할 몇 가지 단계는 다음과 같습니다. 오류 로그를 확인하여 근본 원인을 확인합니다. 서비스 계정에 서비스를 시작할 수 있는 권한이 있는지 확인하세요. 종속성 서비스가 실행 중인지 확인하세요. 바이러스 백신 소프트웨어를 비활성화합니다. SQL Server 설치를 복구합니다. 복구가 작동하지 않으면 SQL Server를 다시 설치하십시오.

sqlserver 포트번호 확인하는 방법 sqlserver 포트번호 확인하는 방법 Apr 05, 2024 pm 09:57 PM

SQL Server 포트 번호를 보려면 SSMS를 열고 서버에 연결합니다. 개체 탐색기에서 서버 이름을 찾아 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 연결 탭에서 TCP 포트 필드를 확인하세요.

sqlserver에서 실수로 삭제한 데이터베이스를 복구하는 방법 sqlserver에서 실수로 삭제한 데이터베이스를 복구하는 방법 Apr 05, 2024 pm 10:39 PM

실수로 SQL Server 데이터베이스를 삭제한 경우 다음 단계를 수행하여 복구할 수 있습니다. 데이터베이스 활동 중지, 데이터베이스 로그 확인, 백업에서 복원, DBCC CHECKDB 사용 파티 도구. 데이터 손실을 방지하려면 데이터베이스를 정기적으로 백업하고 트랜잭션 로깅을 활성화하십시오.

sqlserver 데이터베이스는 어디에 있나요? sqlserver 데이터베이스는 어디에 있나요? Apr 05, 2024 pm 08:21 PM

SQL Server 데이터베이스 파일은 일반적으로 다음 기본 위치에 저장됩니다. Windows: C:\Program Files\Microsoft SQL Server\MSSQL\DATALinux: /var/opt/mssql/data 데이터베이스 파일 경로를 수정하여 데이터베이스 파일 위치를 사용자 정의할 수 있습니다. 환경.

설치에 실패하면 sqlserver를 삭제하는 방법은 무엇입니까? 설치에 실패하면 sqlserver를 삭제하는 방법은 무엇입니까? Apr 05, 2024 pm 11:27 PM

SQL Server 설치가 실패하면 다음 단계에 따라 정리할 수 있습니다. SQL Server 제거 레지스트리 키 삭제 파일 및 폴더 삭제 컴퓨터를 다시 시작합니다.

sqlserver의 영어 설치를 중국어로 변경하는 방법 sqlserver의 영어 설치를 중국어로 변경하는 방법 Apr 05, 2024 pm 10:21 PM

다음 단계에 따라 SQL Server 영어 설치를 중국어로 변경할 수 있습니다. SQL Server 서비스를 중지하고, 인스턴스 언어를 변경하고, 응용 프로그램을 다시 시작합니다.

See all articles