Hibernate 调用存储过程
jopen
13年前
-------存储过程 create procedure insertEmp @emName varchar(50), @emAge int as begin insert into employee values(@emName,@emAge); end create procedure updateEmp @emId int, @emName varchar(50), @emAge int as begin update employee set emName=@emName,emAge=@emAge where emId=@emId; end create procedure deleteEmp @emId int as begin delete employee where emId=@emId; end create procedure getEmpList as begin select * from employee create procedure insertEmp @emName varchar(50), @emAge int as begin insert into employee values(@emName,@emAge); end create procedure updateEmp @emId int, @emName varchar(50), @emAge int as begin update employee set emName=@emName,emAge=@emAge where emId=@emId; end create procedure deleteEmp @emId int as begin delete employee where emId=@emId; end create procedure getEmpList as begin select * from employee
<?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"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="com.pojo.Employee" table="employee" catalog="master"> <id name="emId" type="java.lang.Integer"> <column name="emId" /> <generator class="native" /> </id> <property name="emName" type="java.lang.String"> <column name="emName" length="20" /> </property> <property name="emAge" type="java.lang.Integer"> <column name="emAge" /> </property> </class> <!-- 在该文件中需注意<sql-query…></sql-query>中的这段代码,调用的存储过程在其中定义, 并定义了调用存储过程后将记录组装成Emp对象,同时对记录的字段与对象的属性进行相关映射。 --> <sql-query name="getEmpList" callable="true"> <!--别名--> <return alias="employee" class="com.pojo.Employee"> <return-property name="emId" column="emId" /> <return-property name="emName" column="emName" /> <return-property name="emAge" column="emAge" /> </return> <!--这里调用查询的存储过程--> {call getEmpList} </sql-query> </hibernate-mapping>
// 测试实现查询的存储过程 private void testProcQuery(Session session) throws Exception { // 查询用户列表 List list = session.getNamedQuery("getEmpList").list(); for (int i = 0; i < list.size(); i++) { Employee em = (Employee) list.get(i); System.out.print("序号: " + (i + 1)); System.out.print(", emid: " + em.getEmId()); System.out.print(", emname: " + em.getEmName()); System.out.println(",emage: " + em.getEmAge()); } } private void testProcUpdate(Session session) throws Exception { // 更新用户信息 Transaction tx = session.beginTransaction(); Connection con = session.connection(); String procedure = "{call updateEmp(?, ?, ?)}"; CallableStatement cstmt = con.prepareCall(procedure); cstmt.setInt(1, 2); cstmt.setString(2, "ddd"); cstmt.setInt(3, 100); cstmt.executeUpdate(); tx.commit(); } // 测试实现插入的存储过程 private void testProcInsert(Session session) throws Exception { // 创建用户信息 session.beginTransaction(); PreparedStatement st = session.connection().prepareStatement( "{call insertEmp(?,?)}"); st.setString(1, "阿蜜果"); st.setInt(2, 12); st.execute(); session.getTransaction().commit(); } // 测试实现删除的存储过程 private void testProcDelete(Session session) throws Exception { // 删除用户信息 session.beginTransaction(); PreparedStatement st = session.connection().prepareStatement( "{call deleteEmp(?)}"); st.setInt(1, 1); st.execute(); session.getTransaction().commit(); } public static void main(String[] args) throws Exception { ProTest pt=new ProTest(); Session session=HibernateSessionFactory.getSession(); pt.testProcQuery(session); //pt.testProcInsert(session); //pt.testProcDelete(session); //pt.testProcUpdate(session); } -------------- 得到输出参数 ------------------ public String countFeeByHand(final Date startTime, final String operBizId) throws DataAccessException { String destroyFee = (String) this.getHibernateTemplate().execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { CallableStatement cs = session.connection().prepareCall( "{call MANUAL_USER_SETTLEMENT(?,?,?,?)}");// 存储过程调用有错误 cs.setString(1, DateTools.getYearMonthString(startTime)); cs.setString(2, operBizId); cs.registerOutParameter(3, Types.INTEGER); cs.registerOutParameter(4, Types.CHAR); cs.execute(); return cs.getString(4); //得到输出参数 } }); return destroyFee; }