Hibernate 调用SQL Server2008的存储过程(有参无参两种情况)和SQL语句

127 篇文章 2 订阅
9 篇文章 0 订阅

Hibernate 中同样可以调用存储过程,或SQL语句,下面列举如下;

一,创建相关表

if OBJECT_ID(N'Book') is not null
goto showData

--//create table BOOKS
--//----------Start create table----------
create table Book(
[bID] int identity(1,1) not null,
[bName] varchar(100) null,
[bCategory] int null,
[bDescriptioin] varchar(250) null,
[bAddTime] datetime null default getdate(),
[bMark] varchar(250) null,
primary key([bID])
)

二,创建相应存储过程

use TESTDB01
GO

----------------------------------
-- getAllBook()
----------------------------------
if exists(select 1 from sysobjects where xtype=N'P' and name=N'getAllBook')
drop procedure getAllBook

go
create procedure getAllBook
as 
begin
select * from Books
end
go

--TEST
exec getAllBook

----------------------------------
-- getBookByCategoryName()
----------------------------------
if exists(select 1 from sysobjects where xtype=N'P' and name=N'getBookByCategoryName')
drop procedure getBookByCategoryName

go
create procedure getBookByCategoryName
@category int,
@bookName varchar(50)
as
begin
declare @cid int
declare @findName varchar(50)
set @cid = @category
set @findName = @bookName
if(0 = @cid)
	select * from Books where charIndex(@findName,bName) > 0
else
	select * from Books where bCategory = @cid and charIndex(@findName,bName) > 0
end
go

--TEST
exec getBookByCategoryName 0,'基础'

三,Hibernate中的表映射XML文件(Book.hbm.xml)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
 <class catalog="TESTDB01" name="com.test.models.Book" schema="dbo" table="Book">
  <id name="bid" type="integer">
   <column name="bID"/>
   <generator class="native"/>
  </id>
  <property generated="never" lazy="false" name="bname" type="string">
   <column length="100" name="bName"/>
  </property>
  <property generated="never" lazy="false" name="bcategory" type="integer">
   <column name="bCategory"/>
  </property>
  <property generated="never" lazy="false" name="bdescriptioin" type="string">
   <column length="250" name="bDescriptioin"/>
  </property>
  <property generated="never" lazy="false" name="baddTime" type="timestamp">
   <column length="23" name="bAddTime"/> 
  </property>
  <property generated="never" lazy="false" name="bmark" type="string">
   <column length="250" name="bMark"/>
  </property>
 </class>

 <sql-query callable="true" name="getAllBook">
 {call getAllBook()}
 <!-- 此处也可以放SQL语句  -->
 <return alias="book" class="com.test.models.Book" entity-name="com.test.models.Book" >
   <!-- entity-name="" 
   其中,alias属性可以符合标志符名称即可,无特别要求,class和entity-name指向相同,或只能二选一,因它们两都是指定返回对象类型 -->
   <return-property column="bID" name="bid"/>
   <return-property column="bName" name="bname"/>
   <return-property column="bCategory" name="bcategory"/>
   <return-property column="bDescriptioin" name="bdescriptioin"/>
   <return-property column="bAddTime" name="baddTime"/>
   <return-property column="bMark" name="bmark"/>
  </return>
 </sql-query>
 <sql-query callable="true" name="getBookByCategoryName">
 {call getBookByCategoryName(?,?)}
 <return  alias="book" class="com.test.models.Book">
 	<return-property column="bID" name="bid"/>
    <return-property column="bName" name="bname"/>
    <return-property column="bCategory" name="bcategory"/>
    <return-property column="bDescriptioin" name="bdescriptioin"/>
    <return-property column="bAddTime" name="baddTime"/>
    <return-property column="bMark" name="bmark"/>
 </return>
 </sql-query>
</hibernate-mapping>

四,页面或action中通过Hibernate调用存储过程

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page language="java" import="com.test.hbm.HibernateSessionFactory"%>
<%@ page language="java" import="org.hibernate.SessionFactory"%>
<%@ page language="java" import="org.hibernate.Session"%>
<%@ page language="java" import="com.test.models.Book"%>
<%@ page language="java" import="com.test.common.Funs"%>
<%@ page language="java" import="org.hibernate.Query,org.hibernate.SQLQuery"%>
<%@page import="java.sql.ResultSet,java.sql.Connection,java.sql.CallableStatement"%>
<%@page import="org.hibernate.Hibernate"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">   
<title>Hibernate call ms sql server 2008 procedure</title>   
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link rel="stylesheet" type="text/css" href="css/css01.css">
</head>  
<body>
<p>
Hibernate call ms sql server 2008 SQL/Procedure [option with parameters]<br>
Hibernate 调用MS SQL Server2008的SQL语句或存储过程,有参无参两种情况
</p>

<p><b>一,通过createQuery调用存储过程</b></p>  
<% 
//SessionFactory sf = HibernateSessionFactory.getSessionFactory();
//HibernateSessionFactory.rebuildSessionFactory();
//out.print("<br><br>hs object : " + hs.toString());
Session hs = HibernateSessionFactory.getSession();
out.print("<br>QueryString [无参] : " + hs.getNamedQuery("getAllBook").getQueryString());
List list = hs.getNamedQuery("getAllBook").list();
if(list.isEmpty()){
	out.print("<br><br>---------No data list---------");
}else{
	out.print("<br><br>");
	Iterator it = list.iterator();
	out.print("<table>");
	out.print("<tr bgColor=\"#cdcdcd\">");
	out.print("<td>ID</td>"); 
	out.print("<td>BookName</td>"); 
	out.print("<td>categoryID</td>"); 
	out.print("<td>Description</td>"); 
	out.print("<td>addTime</td>"); 
	out.print("<td>mark</td>"); 
	out.print("</tr>");
	while(it.hasNext()){
		Book book = (Book)it.next();
		out.print("<tr>");
		out.print("<td>" + book.getBid() + "</td>");
		//out.print("<td>" + Funs.str2UTF8(book.getBname()) + "</td>");
		out.print("<td>" + book.getBname() + "</td>");
		out.print("<td>" + book.getBcategory() + "</td>");
		out.print("<td>" + book.getBdescriptioin() + "</td>");
		out.print("<td>" + book.getBaddTime() + "</td>");
		out.print("<td>" + book.getBmark() + "</td>");
		out.print("</tr>");
	}
	out.print("</table>");
}
%>
<hr size="1" color="#999999">
<%  
out.print("<br><br>QueryString [有参] : " + hs.getNamedQuery("getBookByCategoryName").getQueryString());
hs = HibernateSessionFactory.getSession();
Query query = hs.getNamedQuery("getBookByCategoryName");
query.setInteger(0,1); //Hibernate的参数设置下标从 0 开始
query.setString(1,"java");
list = query.list();
if(list.isEmpty()){
	out.print("<br><br>---------No data list---------"); 
}else{
	out.print("<br><br>");
	Iterator it = list.iterator();
	out.print("<table>");
	out.print("<tr bgColor=\"#cdcdcd\">");
	out.print("<td>ID</td>");
	out.print("<td>BookName</td>");
	out.print("<td>categoryID</td>");
	out.print("<td>Description</td>");
	out.print("<td>addTime</td>");
	out.print("<td>mark</td>");
	out.print("</tr>");
	while(it.hasNext()){
		Book book = (Book)it.next();
		out.print("<tr>");
		out.print("<td>" + book.getBid() + "</td>");
		//out.print("<td>" + Funs.str2UTF8(book.getBname()) + "</td>");
		out.print("<td>" + book.getBname() + "</td>");
		out.print("<td>" + book.getBcategory() + "</td>");
		out.print("<td>" + book.getBdescriptioin() + "</td>");
		out.print("<td>" + book.getBaddTime() + "</td>");
		out.print("<td>" + book.getBmark() + "</td>");
		out.print("</tr>");
	} 
	out.print("</table>");
}
%>
<br>

<hr size="2" color="blue">
<p><b>二,通过createSQLQuery调用存储过程</b></p>
<% 
out.print("<br>QueryString [无参] : " + hs.getNamedQuery("getAllBook").getQueryString());
SQLQuery query3=hs.createSQLQuery("{call getAllBook()}");
query3.addEntity(Book.class);

//上面两行等同于下面一行,把查询的结果绑定到对应的实体类,查询结果和实体类已经在hibernate的XML完成映射[字段名和实体属性名的映射]
//SQLQuery query3=hs.createSQLQuery("{call getAllBook()}").addEntity(Books.class);

list = query3.list();
if(list.isEmpty()){
	out.print("<br><br>---------No data list---------");
}else{
	out.print("<br><br>");
	Iterator it = list.iterator();
	out.print("<table>");
	out.print("<tr bgColor=\"#cdcdcd\">");
	out.print("<td>ID</td>");
	out.print("<td>BookName</td>");
	out.print("<td>categoryID</td>");
	out.print("<td>Description</td>");
	out.print("<td>addTime</td>");
	out.print("<td>mark</td>");
	out.print("</tr>");
	while(it.hasNext()){
		Book book = (Book)it.next();
		out.print("<tr>");
		out.print("<td>" + book.getBid() + "</td>");
		out.print("<td>" + book.getBname() + "</td>");
		out.print("<td>" + book.getBcategory() + "</td>");
		out.print("<td>" + book.getBdescriptioin() + "</td>");
		out.print("<td>" + book.getBaddTime() + "</td>");
		out.print("<td>" + book.getBmark() + "</td>");
		out.print("</tr>");
	}
	out.print("</table>");
}
%>
<hr size="1" color="#999999">
<% 
out.print("<br><br>QueryString [有参] : " + hs.getNamedQuery("getBookByCategoryName").getQueryString());
hs = HibernateSessionFactory.getSession();
SQLQuery query4 = hs.createSQLQuery("{call getBookByCategoryName(?,?)}").addEntity(Book.class);
query4.setInteger(0,1);
query4.setString(1,"java");
list = query4.list();
if(list.isEmpty()){
	out.print("<br><br>---------No data list---------"); 
}else{
	out.print("<br><br>");
	Iterator it = list.iterator();
	out.print("<table>");
	out.print("<tr bgColor=\"#cdcdcd\">");
	out.print("<td>ID</td>");
	out.print("<td>BookName</td>");
	out.print("<td>categoryID</td>");
	out.print("<td>Description</td>");
	out.print("<td>addTime</td>");
	out.print("<td>mark</td>");
	out.print("</tr>");
	while(it.hasNext()){
		Book book = (Book)it.next();
		out.print("<tr>");
		out.print("<td>" + book.getBid() + "</td>");
		//out.print("<td>" + Funs.str2UTF8(book.getBname()) + "</td>");
		out.print("<td>" + book.getBname() + "</td>");
		out.print("<td>" + book.getBcategory() + "</td>");
		out.print("<td>" + book.getBdescriptioin() + "</td>");
		out.print("<td>" + book.getBaddTime() + "</td>");
		out.print("<td>" + book.getBmark() + "</td>");
		out.print("</tr>");
	} 
	out.print("</table>");
}
%>
<hr size="2" color="blue">
<p><b>三,通过JDBC方式调用存储过程</b></p>

<% 
hs =HibernateSessionFactory.getSession();   
Connection conn = hs.connection();   
ResultSet rs =null;  
CallableStatement cs = conn.prepareCall("{Call getAllBook()}");  
rs = cs.executeQuery();  
out.print("<br>调用无参数的存储过程:");
out.print("<table>");
out.print("<tr bgColor=\"#cdcdcd\">");
out.print("<td>ID</td>");
out.print("<td>BookName</td>");
out.print("<td>categoryID</td>");
out.print("<td>Description</td>");
out.print("<td>addTime</td>");
out.print("<td>mark</td>");
out.print("</tr>");
while(rs.next()){
		//Book book = (Book)it.next();
		out.print("<tr>");
		out.print("<td>" + rs.getInt("bid") + "</td>");
		out.print("<td>" + rs.getString("bName") + "</td>");
		out.print("<td>" + rs.getInt("bCategory") + "</td>");
		out.print("<td>" + rs.getString("bDescriptioin") + "</td>");
		out.print("<td>" + rs.getTimestamp("bAddTime") + "</td>");
		out.print("<td>" + rs.getString("bMark") + "</td>");
		out.print("</tr>");
}
out.print("<table>");
rs = null;  
cs = null;
conn = null;
%>
<hr size="1" color="#999999">
<% 
hs =HibernateSessionFactory.getSession();   
Connection conn2 = hs.connection();   
ResultSet rs2 =null;  
CallableStatement cs2 = conn2.prepareCall("{call getBookByCategoryName(?,?)}");  
cs2.setInt(1,1); //CallableStatement的参数设置下标从1 开始
cs2.setString(2,"java");
rs2 = cs2.executeQuery();  
out.print("<br>调用有参数的存储过程:");
out.print("<table>");
out.print("<tr bgColor=\"#cdcdcd\">");
out.print("<td>ID</td>");
out.print("<td>BookName</td>");
out.print("<td>categoryID</td>");
out.print("<td>Description</td>");
out.print("<td>addTime</td>");
out.print("<td>mark</td>");
out.print("</tr>");
while(rs2.next()){
		out.print("<tr>");
		out.print("<td>" + rs2.getInt("bid") + "</td>");
		out.print("<td>" + rs2.getString("bName") + "</td>");
		out.print("<td>" + rs2.getInt("bCategory") + "</td>");
		out.print("<td>" + rs2.getString("bDescriptioin") + "</td>");
		out.print("<td>" + rs2.getTimestamp("bAddTime") + "</td>");
		out.print("<td>" + rs2.getString("bMark") + "</td>");
		out.print("</tr>");
}
out.print("<table>");
rs2=null;  
cs2 = null;
conn2 = null;
%>
<hr size="2" color="blue">
<p><b>四,通过createSQLQuery方式调用SQL语句/存储过程返回单个或部分字段</b></p>
<%
out.print("<br>[无参情况, 求总共有多少本书]: ");
String totalNum = hs.createSQLQuery("select count(bid) as totalNum from Books").addScalar("totalNum",Hibernate.INTEGER).list().get(0).toString();
out.print("<br>totalNum = " + totalNum );
%>
<hr size="1" color="#999999">
<% 
out.print("<br>[有参情况, 通过ID找书名]: "); 
SQLQuery query5 = hs.createSQLQuery("select bName as bookName,bAddTime as bookAddTime from Books where bid = ?");
query5.setInteger(0,1);
query5.addScalar("bookName",Hibernate.STRING);
query5.addScalar("bookAddTime",Hibernate.TIMESTAMP);
String bookName = ((Object[])query5.list().get(0))[0].toString();
String bookAddTime = ((Object[])query5.list().get(0))[1].toString();
out.print("<br>条件bid = 1, 查找结果: bookName = " + bookName + " , bookAddTime = " + bookAddTime );
//上面这里仅取List中的第一个,list中每个元素相当于一条记录,记录中的字段数量跟SQL语句中的字段数量一样;如果取全部,则循环取出来,
List list5 = query5.list();
for(int i=0; i<list5.size(); i++){
	Object[] obj = (Object[])query5.list().get(i); //取出list中第i个元素(即记录),记录中字段数量跟SQL语句中的数量一样  
	out.print("<br>条件bid = 1, 查找结果: bookName = " + obj[0].toString());
	out.print(" , bookAddTime = " + obj[1].toString());
}
%>

<hr size="2" color="blue">
<p><b>五,通过createQuery方式调用hibernate中映射的XML文件中的HQL语句返回单个或部分或全部字段</b></p>
<% 

%>
<br>
<br>
<br>
<br>
<hr size="2" color="blue">
<p><b>六,通过createSQLQuery方式调用hibernate中映射的XML文件中的SQL语句返回单个或部分或全部字段</b></p>
<% 

%>
<br>
<br>参考 http://www.iteye.com/topic/176032
</body>
</html>


涉及函数:

public class Funs {
	public static String str2UTF8(String refString){
		//return String width UTF-8 encode
		if(null == refString || refString.trim().isEmpty()){
			return "";
		}
		String tempString = "";
		try {
			tempString = new String(refString.getBytes("ISO-8859-1"),"UTF-8");	
		} catch (Exception e) {
			tempString = "";
		}
		return tempString;
     }
}










  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值