hibernate调用存储过程
一. 建表与初始化数据
在mysql的test数据库中建立一张新表:tbl_user,建表语句如下:
DROPTABLEIFEXISTS`user`;
CREATETABLE`tbl_user`(
`userid`varchar(50)NOTNULL,
`name`varchar(50)default'',
`blog`varchar(50)default'',
PRIMARYKEY(`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;建表成功后,在该表中任意插入几条数据。
二. 建立存储过程
为测试hibernate3.x中存储过程的调用,我们在user表中建立getUserList、createUser、updateUser和deleteUser这四个存储过程,在mysql中建立存储过程的语句如下:
1.获得用户信息列表的存储过程--getUserList
DROPPROCEDUREIFEXISTS`getUserList`;
CREATEPROCEDURE`getUserList`()
begin
select*fromtbl_user;
end;2. 通过传入的参数创建用户的存储过程--createUser
DROPPROCEDUREIFEXISTS`createUser`;
CREATEPROCEDURE`createUser`(INuseridvarchar(50),INnamevarchar(50),INblogvarchar(50))
begin
insertintotbl_uservalues(userid,name,blog);
end;3. 通过传入的参数更新用户信息的存储过程--updateUser
DROPPROCEDUREIFEXISTS`updateUser`;
CREATEPROCEDURE`updateUser`(INnameValuevarchar(50),INblogValuevarchar(50),INuseidValuevarchar(50))
begin
updatetbl_usersetname=nameValue,blog=blogValuewhereuserid=useridValue;
end;4. 删除用户信息的存储过程--deleteUser
DROPPROCEDUREIFEXISTS`deleteUser`;
CREATEPROCEDURE`deleteUser`(INuseridValueint(11))
begin
deletefromtbl_userwhereuserid=useridValue;
privateStringuserid;
/**用户姓名*/
privateStringname;
/**用户blog*/
privateStringblog;
//省略get/set方法
}User.hbm.xml文件的内容如下:
<?xml version="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.amigo.proc.model">
<classname="User"table="tbl_user">
<idname="userid"column="userid">
<generatorclass="assigned"/>
</id>
<propertyname="name"column="name"type="string"/>
<propertyname="blog"column="blog"type="string"/>
</class><sql-query name="getUserList" callable="true">
<returnalias="user"class="User">
<return-propertyname="userid"column="userid"/>
<return-propertyname="name"column="name"/>
<return-propertyname="blog"column="blog"/>
</return>
{callgetUserList()}
</sql-query>
</hibernate-mapping>在该文件中需注意<sql-query…></sql-query>中的这段代码,调用的存储过程在其中定义,并定义了调用存储过程后将记录组装成User对象,同时对记录的字段与对象的属性进行相关映射。
3. hibernate调用存储过程的测试类本类是该例的核心类,在本类中,以实例清楚地说明了在hibernate中如何调用存储过程,例示了hibernate调用查询、更新、插入和删除这四类存储过程的方法,该类的内容如下:
// hibernate调用存储过程public class ProcTest ...{
public static void main(String[] args) throws Exception ...{
ProcTestproc=newProcTest();
Sessionsession=HibernateSessionFactory.getSession();
proc.testProcQuery(session);
proc.testProcUpdate(session);
System.out.println("update successfully");proc.testProcInsert(session); System.out.println("insert successfully");
proc.testProcDelete(session);
System.out.println("deletesuccessfully");
session.close();
}//测试实现查询的存储过程
privatevoidtestProcQuery(Sessionsession)throwsException...{
//查询用户列表
Listlist=session.getNamedQuery("getUserList").list();
for(inti=0;i<list.size();i++)...{
Useruser=(User)list.get(i);
System.out.print("序号:"+(i+1));
System.out.print(",userid:"+user.getUserid());
System.out.print(",name:"+user.getName());
System.out.println(",blog:"+user.getBlog());
}
}/**//**
*测试实现更新的存储过程
*@throwsException
*/
privatevoidtestProcUpdate(Sessionsession)throwsException...{
//更新用户信息
Transactiontx=session.beginTransaction();
Connectioncon=session.connection();
Stringprocedure="{callupdateUser(?,?,?)}";
CallableStatementcstmt=con.prepareCall(procedure);
cstmt.setString(1,"ssydxa219");
cstmt.setString(2,"http://");
cstmt.setString(3,"sterning");
cstmt.executeUpdate();
tx.commit();
}// 测试实现插入的存储过程
privatevoidtestProcInsert(Sessionsession)throwsException...{
//创建用户信息
session.beginTransaction();
PreparedStatementst=session.connection().prepareStatement("{call
createUser(?,?,?)}");
st.setString(1,"amigo");
st.setString(2,"阿蜜果");
st.setString(3,"http://wwwsssssssss");
st.execute();
session.getTransaction().commit();
}// 测试实现删除的存储过程
privatevoidtestProcDelete(Sessionsession)throwsException...{
//删除用户信息
session.beginTransaction();
PreparedStatementst=session.connection().prepareStatement("{calldeleteUser
(?)}");
st.setString(1,"amigo");
st.execute();
session.getTransaction().commit();
}
}在本类中,调用查询类存储过程时,调用session.getNamedQuery("…")方法来获得User.hbm.xml中配置的查询存储过程。在其余的存储过程调用的测试中,首先通过hibernate的session获得connection,然后调用connection对象的相应方法来实现存储过程的调用。