<!-----------------------hibernate.hbm.xml------------------à
<?xml version="1.0"encoding="GBK"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Hibernate映射文件的根元素 -->
<hibernate-mapping package="org.leegang.hrsystem.model">
<class name="Employee" table="emp_table">
<!-- 映射标识属性 -->
<id name="id" type="integer"column="emp_id">
<!-- 指定使用identity主键生成策略 -->
<generator class="identity"/>
</id>
<!-- 映射普通属性 -->
<property name="name"column="emp_name" type="string"
not-null="true" length="50"unique="true"/>
<property name="pass"column="emp_pass" type="string"
not-null="true" length="50"/>
<property name="salary"column="emp_salary" type="double"
not-null="true" />
<!-- 映射和Manager的关联关系 -->
<many-to-one name="manager" column="mgr_id"
class="Manager" lazy="false"/>
<!-- 映射和Attend之间的关联关系 -->
<set name="attends" inverse="true" >
<key column="emp_id"/>
<one-to-many class="Attend"/>
</set>
<!-- 映射和Payment之间的关联关系 -->
<set name="payments"inverse="true">
<key column="emp_id"/>
<one-to-many class="Payment"/>
</set>
<!-- 映射Employee的子类Manager -->
<joined-subclass name="Manager"table="mgr_table">
<key column="mgr_id"/>
<!-- 映射Manager的普通属性 -->
<property name="dept"column="dept_name"
type="string" not-null="true"length="50"/>
<!-- 映射和Employee之间的关联关系 -->
<set name="employees"inverse="true">
<key column="mgr_id"/>
<one-to-many class="Employee"/>
</set>
<!-- 映射和CheckBack之间的关联关系 -->
<set name="checks"inverse="true">
<key column="mgr_id"/>
<one-to-many class="CheckBack"/>
</set>
</joined-subclass>
</class>
</hibernate-mapping>
<!--------------------struts.xml-----------------------à
<?xml version="1.0"encoding="GBK"?>
<!-- 指定Struts2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD StrutsConfiguration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<!-- Struts2配置文件的根元素 -->
<struts>
<!-- 配置了系列常量 -->
<constant name="struts.custom.i18n.resources"value="resource"/>
<constant name="struts.i18n.encoding"value="GBK"/>
<package name="default"extends="struts-default">
<interceptors>
<interceptor name="empAuth"
class="org.leegang.hrsystem.action.authority.EmpAuthorityInterceptor"/>
<interceptor name="mgrAuth"
class="org.leegang.hrsystem.action.authority.MgrAuthorityInterceptor"/>
<interceptor-stack name="empStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="empAuth"/>
</interceptor-stack>
<interceptor-stack name="mgrStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="mgrAuth"/>
</interceptor-stack>
</interceptors>
<!-- 定义全局Result映射 -->
<global-results>
<!-- 定义sql、root两个异常对应的视图页 -->
<result name="business">/WEB-INF/jsp/error.jsp</result>
<result name="root">/WEB-INF/jsp/error.jsp</result>
<!-- 定义login逻辑视图对应的视图资源 -->
<result name="login">/WEB-INF/jsp/login.jsp</result>
</global-results>
<!-- 定义全局异常映射 -->
<global-exception-mappings>
<!-- 当Action中遇到HrException异常时,
系统将转入name为business的结果中 -->
<exception-mapping
exception="org.leegang.hrsystem.exception.HrException"
result="business"/>
<!-- 当Action中遇到Exception异常时,
系统将转入name为root的结果中 -->
<exception-mapping exception="java.lang.Exception"
result="root"/>
</global-exception-mappings>
<!--========下面是员工角色的Action===========-->
<!-- 定义处理登出请求的Action -->
<action name="logout"
class="org.leegang.hrsystem.action.LogoutAction">
<result>/WEB-INF/jsp/main.jsp</result>
</action>
<!-- 定义处理登录系统的的Action -->
<action name="processLogin"
class="org.leegang.hrsystem.action.LoginAction">
<result name="input">/WEB-INF/jsp/login.jsp</result>
<result name="mgr">/WEB-INF/jsp/manager/index.jsp</result>
<result name="emp">/WEB-INF/jsp/employee/index.jsp</result>
<result name="error">/WEB-INF/jsp/login.jsp</result>
</action>
<!-- 进入打卡 -->
<action name="*Punch"
class="org.leegang.hrsystem.action.PunchAction">
<interceptor-ref name="empStack"/>
<result>/WEB-INF/jsp/{1}/punch.jsp</result>
</action>
<!-- 处理上班打卡 -->
<action name="*Come" method="come"
class="org.leegang.hrsystem.action.ProcessPunchAction">
<interceptor-ref name="empStack"/>
<result>/WEB-INF/jsp/{1}/index.jsp</result>
</action>
<!-- 处理下班打卡 -->
<action name="*Leave" method="leave"
class="org.leegang.hrsystem.action.ProcessPunchAction">
<interceptor-ref name="empStack"/>
<result>/WEB-INF/jsp/{1}/index.jsp</result>
</action>
<!-- 查看自己的非正常出勤 -->
<action name="viewUnPunch"
class="org.leegang.hrsystem.action.ViewUnAttendAction">
<interceptor-ref name="basicStack"/>
<interceptor-ref name="empAuth"/>
<result>/WEB-INF/jsp/employee/viewUnAttend.jsp</result>
</action>
<!-- 进入异动申请 -->
<action name="appChange"
class="org.leegang.hrsystem.action.AppChangeAction">
<interceptor-ref name="store">
<param name="operationMode">RETRIEVE</param>
</interceptor-ref>
<interceptor-ref name="basicStack"/>
<interceptor-ref name="empAuth"/>
<result>/WEB-INF/jsp/employee/appChange.jsp</result>
</action>
<!-- 提交异动申请 -->
<action name="processApp"
class="org.leegang.hrsystem.action.ProcessAppAction">
<interceptor-ref name="store">
<param name="operationMode">STORE</param>
</interceptor-ref>
<interceptor-ref name="empStack"/>
<result name="input"type="redirect">/appChange.action?attid=${attId}</result>
<result>/WEB-INF/jsp/employee/index.jsp</result>
</action>
<!-- 查看本人工资的Action -->
<action name="view*Salary"
class="org.leegang.hrsystem.action.ViewSalaryAction">
<interceptor-ref name="basicStack"/>
<interceptor-ref name="empAuth"/>
<result>/WEB-INF/jsp/{1}/viewSalary.jsp</result>
</action>
<!--===============下面是经理角色的Action============-->
<action name="viewDeptSal"
class="org.leegang.hrsystem.action.ViewDeptAction">
<interceptor-ref name="basicStack"/>
<interceptor-ref name="mgrAuth"/>
<result>/WEB-INF/jsp/manager/viewDeptSal.jsp</result>
</action>
<!-- 经理查看员工 -->
<action name="viewEmp"
class="org.leegang.hrsystem.action.ViewEmpAction">
<interceptor-ref name="basicStack"/>
<interceptor-ref name="mgrAuth"/>
<result>/WEB-INF/jsp/manager/viewEmp.jsp</result>
</action>
<!-- 经理查看申请 -->
<action name="viewApp"
class="org.leegang.hrsystem.action.ViewAppAction">
<interceptor-ref name="basicStack"/>
<interceptor-ref name="mgrAuth"/>
<result>/WEB-INF/jsp/manager/viewApps.jsp</result>
</action>
<!-- 进入添加员工 -->
<action name="addEmp">
<interceptor-ref name="mgrStack"/>
<result>/WEB-INF/jsp/manager/addEmp.jsp</result>
</action>
<!-- 经理增加员工 -->
<action name="processAdd"
class="org.leegang.hrsystem.action.AddEmpAction">
<!-- 使用系统默认的拦截器栈 -->
<interceptor-ref name="mgrStack"/>
<!-- 使用防刷新的token拦截器 -->
<interceptor-ref name="token"/>
<!-- 定义重复提交转向的视图,该逻辑视图名必须是invalid.token -->
<result name="invalid.token">/WEB-INF/jsp/manager/addEmp.jsp</result>
<result name="input">/WEB-INF/jsp/manager/addEmp.jsp</result>
<result name="failure">/WEB-INF/jsp/manager/addEmp.jsp</result>
<result>/WEB-INF/jsp/manager/index.jsp</result>
</action>
<!-- 经理处理申请 -->
<action name="check"
class="org.leegang.hrsystem.action.CheckAppAction">
<interceptor-ref name="mgrStack"/>
<result type="chain">viewApp</result>
</action>
<action name="">
<result>.</result>
</action>
<action name="*">
<result>/WEB-INF/jsp/{1}.jsp</result>
</action>
</package>
</struts>
<!--===============applicationContext.xml======================à
<?xml version="1.0"encoding="GBK"?>
<!-- 指定Spring配置文件的Schema信息 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!-- 指定连接数据库的驱动 -->
<property name="driverClass"value="com.mysql.jdbc.Driver"/>
<!-- 指定连接数据库的URL -->
<property name="jdbcUrl"value="jdbc:mysql://localhost/hrSystem"/>
<!-- 指定连接数据库的用户名 -->
<property name="user"value="root"/>
<!-- 指定连接数据库的密码 -->
<property name="password"value="password"/>
<!-- 指定连接数据库连接池的最大连接数 -->
<property name="maxPoolSize"value="40"/>
<!-- 指定连接数据库连接池的最小连接数 -->
<property name="minPoolSize"value="1"/>
<!-- 指定连接数据库连接池的初始化连接数 -->
<property name="initialPoolSize"value="1"/>
<!-- 指定连接数据库连接池的连接的最大空闲时间 -->
<property name="maxIdleTime"value="20"/>
</bean>
<!-- 定义Hibernate的SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 依赖注入数据源,注入正是上面定义的dataSource -->
<property name="dataSource"ref="dataSource"/>
<!-- mappingResouces属性用来列出全部映射文件 -->
<property name="mappingResources">
<list>
<!-- 以下用来列出Hibernate映射文件 -->
<value>org/leegang/hrsystem/model/Application.hbm.xml</value>
<value>org/leegang/hrsystem/model/Attend.hbm.xml</value>
<value>org/leegang/hrsystem/model/AttendType.hbm.xml</value>
<value>org/leegang/hrsystem/model/CheckBack.hbm.xml</value>
<value>org/leegang/hrsystem/model/Employee.hbm.xml</value>
<value>org/leegang/hrsystem/model/Payment.hbm.xml</value>
</list>
</property>
<!-- 定义Hibernate的SessionFactory的属性 -->
<property name="hibernateProperties">
<props>
<!-- 指定数据库方言 -->
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLInnoDBDialect</prop>
<!-- 是否根据需要每次自动创建数据库 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
<!-- 显示Hibernate持久化操作所生成的SQL -->
<prop key="hibernate.show_sql">true</prop>
<!-- 将SQL脚本进行格式化后再输出 -->
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
<!-- 配置Hibernate的局部事务管理器,使用HibernateTransactionManager类 -->
<!-- 该类实现PlatformTransactionManager接口,是针对Hibernate的特定实现-->
<bean id="transactionManager"class=
"org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 配置HibernateTransactionManager时需要依注入SessionFactory的引用 -->
<property name="sessionFactory"ref="sessionFactory"/>
</bean>
<!-- 配置事务切面Bean,指定事务管理器 -->
<tx:advice id="txAdvice"transaction-manager="transactionManager">
<!-- 用于配置详细的事务语义 -->
<tx:attributes>
<!-- 所有以'get'开头的方法是read-only的 -->
<tx:method name="get*"read-only="true"/>
<!-- 其他方法使用默认的事务设置 -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 配置一个切入点,匹配org.leegang.hrsystem.service.impl包下
所有以Impl结尾的类的所有方法的执行 -->
<aop:pointcut id="leePointcut"
expression=
"execution(*org.leegang.hrsystem.service.impl.*Impl.*(..))"/>
<!-- 指定在txAdvice切入点应用txAdvice事务切面 -->
<aop:advisor advice-ref="txAdvice"
pointcut-ref="leePointcut"/>
</aop:config>
<!-- 定义业务逻辑组件模板 -->
<bean id="managerTemplate"abstract="true" lazy-init="true">
<!-- 为业务逻辑组件注入DAO组件 -->
<property name="appDao" ref="appDao"/>
<property name="attendDao" ref="attendDao"/>
<property name="typeDao" ref="attendTypeDao"/>
<property name="checkDao" ref="checkDao"/>
<property name="empDao" ref="employeeDao"/>
<property name="mgrDao" ref="managerDao"/>
<property name="payDao" ref="payDao"/>
</bean>
<!-- 定义两个业务逻辑组件,继承业务逻辑组件的模板 -->
<bean id="empManager"
class="org.leegang.hrsystem.service.impl.EmpManagerImpl"
parent="managerTemplate"/>
<bean id="mgrManager"
class="org.leegang.hrsystem.service.impl.MgrManagerImpl"
parent="managerTemplate"/>
<bean id="cronTriggerPay"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<!-- 使用嵌套Bean的方式来定义任务Bean -->
<bean
class="org.springframework.scheduling.quartz.JobDetailBean">
<!-- 指定任务Bean的实现类 -->
<property name="jobClass"
value="org.leegang.hrsystem.schedule.PayJob"/>
<!-- 为任务Bean注入属性 -->
<property name="jobDataAsMap">
<map>
<entry key="empMgr"value-ref="empManager"/>
</map>
</property>
</bean>
</property>
<!-- 指定Cron表达式:每月3日2时启动 -->
<property name="cronExpression"value="0 0 2 3 * ? *"/>
</bean>
<!-- 定义触发器来管理任务Bean -->
<bean id="cronTriggerPunch"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<!-- 使用嵌套Bean的方式来定义任务Bean -->
<bean
class="org.springframework.scheduling.quartz.JobDetailBean">
<!-- 指定任务Bean的实现类 -->
<property name="jobClass"
value="org.leegang.hrsystem.schedule.PunchJob"/>
<!-- 为任务Bean注入属性 -->
<property name="jobDataAsMap">
<map>
<entry key="empMgr"value-ref="empManager"/>
</map>
</property>
</bean>
</property>
<!-- 指定Cron表达式:周一到周五7点、12点执行调度 -->
<property name="cronExpression"
value="0 0 7,12 ? * MON-FRI"/>
</bean>
<!-- 执行实际的调度调度 -->
<bean
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="cronTriggerPay"/>
<ref local="cronTriggerPunch"/>
</list>
</property>
</bean>
</beans>
<!--===============web.xml==========================à
<?xml version="1.0"encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<!-- 配置Spring配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml,
/WEB-INF/daoContext.xml</param-value>
</context-param>
<!-- 使用ContextLoaderListener初始化Spring容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 定义Struts2的FilterDispathcer的Filter -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<!-- FilterDispatcher用来初始化Struts2并且处理所有的WEB请求。 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 定义图形验证码Servlet -->
<servlet>
<servlet-name>img</servlet-name>
<servlet-class>org.leegang.hrsystem.web.AuthImg</servlet-class>
</servlet>
<!-- 为图形验证码Servlet配置URL -->
<servlet-mapping>
<servlet-name>img</servlet-name>
<url-pattern>/WEB-INF/jsp/authImg.jsp</url-pattern>
</servlet-mapping>
<!-- 定义Web应用的首页 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
<!--===================LoginAction.java==========================à
package org.leegang.hrsystem.action;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.opensymphony.xwork2.*;
import org.apache.struts2.interceptor.*;
import org.leegang.hrsystem.service.EmpManager;
importorg.leegang.hrsystem.exception.HrException;
importorg.leegang.hrsystem.action.base.EmpBaseAction;
import staticorg.leegang.hrsystem.service.EmpManager.*;
/**
*Description:
*<br/>Copyright (C), 2001-2010, leegang.hrsystem.H.Lee
*<br/>This program is protected by copyright laws.
*<br/>Program Name:
*<br/>Date:
*@author leegang.hrsystem.H.Leekongleegang.hrsystem@163.com
*@version 1.0
*/
public class LoginAction extendsEmpBaseAction
{
//定义一个常量作为员工登录成功的Result名
privatefinal String EMP_RESULT = "emp";
//定义一个常量作为经理登录成功的Result名
privatefinal String MGR_RESULT = "mgr";
//登录的用户名
privateString username;
//登录的密码
privateString password;
//登录的验证码
privateString vercode;
//处理登录后的提示信息
privateString tip;
//username属性的setter和getter方法
publicvoid setUsername(String username)
{
this.username= username;
}
publicString getUsername()
{
returnthis.username;
}
//password属性的setter和getter方法
publicvoid setPassword(String password)
{
this.password= password;
}
publicString getPassword()
{
returnthis.password;
}
//vercode属性的setter和getter方法
publicvoid setVercode(String vercode)
{
this.vercode= vercode;
}
publicString getVercode()
{
returnthis.vercode;
}
//tip属性的setter和getter方法
publicvoid setTip(String tip)
{
this.tip= tip;
}
publicString getTip()
{
returnthis.tip;
}
//处理用户请求
publicString execute()
throwsException
{
//创建ActionContext实例
ActionContextctx = ActionContext.getContext();
//获取HttpSession中的rand属性
Stringver2 = (String)ctx.getSession().get("rand");
if(vercode.equalsIgnoreCase(ver2) || vercode.equals("111111"))
{
//调用业务逻辑方法来处理登录请求
intresult = mgr.validLogin(getUsername() ,
getPassword());
//登录结果为普通员工
if(result == LOGIN_EMP)
{
ctx.getSession().put(WebConstant.USER
,username);
ctx.getSession().put(WebConstant.LEVEL
,WebConstant.EMP_LEVEL);
setTip("您已经成功登陆系统");
returnEMP_RESULT;
}
//登录结果为经理
elseif (result == LOGIN_MGR)
{
ctx.getSession().put(WebConstant.USER
,username);
ctx.getSession().put(WebConstant.LEVEL
,WebConstant.MGR_LEVEL);
setTip("您已经成功登陆系统");
returnMGR_RESULT;
}
//用户名和密码不匹配
else
{
setTip("用户名/密码不匹配");
returnERROR;
}
}
//验证码不匹配
else
{
setTip("验证码不匹配,请重新输入");
returnERROR;
}
}
}
<!--====================LoginAction-validation.xml================à
<?xml version="1.0"encoding="GBK"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphonyGroup//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<message>用户名必填!</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<message>您输入的用户名只能是字母和数组,且长度必须在4到25之间</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message>密码必填!</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<message>您输入的密码只能是字母和数组,且长度必须在4到25之间</message>
</field-validator>
</field>
<field name="vercode">
<field-validator type="requiredstring">
<message>验证码必填!</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{6,6})]]></param>
<message>您输入的验证码只能是字母和数字,且长度必须在6位</message>
</field-validator>
</field>
</validators>
<!--=====(拦截器)=======EmpAuthorityInterceptor.java==============--à
packageorg.leegang.hrsystem.action.authority;
import com.opensymphony.xwork2.*;
importcom.opensymphony.xwork2.interceptor.*;
importorg.leegang.hrsystem.action.WebConstant;
/**
*Description:
*<br/>Copyright (C), 2001-2010, leegang.hrsystem.H.Lee
*<br/>This program is protected by copyright laws.
*<br/>Program Name:
*<br/>Date:
*@author leegang.hrsystem.H.Leekongleegang.hrsystem@163.com
*@version 1.0
*/
public class EmpAuthorityInterceptor
extendsAbstractInterceptor
{
publicString intercept(ActionInvocation invocation)
throwsException
{
//创建ActionContext实例
ActionContextctx = ActionContext.getContext();
//获取HttpSession中的level属性
Stringlevel = (String)ctx.getSession()
.get(WebConstant.LEVEL);
//如果level不为null,且level为emp或mgr
if( level != null
&&(level.equals(WebConstant.EMP_LEVEL)
||level.equals(WebConstant.MGR_LEVEL)))
{
returninvocation.invoke();
}
else
{
returnAction.LOGIN;
}
}
}
有进要通过jdbc调用存储过程,来说一下怎样来实现?
在我见过的有两种情况:
1)返回一个结果集(ResultSet)。
2)返回一个特定的值。
下面来详细的说明。
1)返回一个结果集(ResultSet),这种类似通常的处理结果集
如果事先就有一个类似如下的procedure
CREATE PROCEDURE getShipQuantity @jsid int AS
SELECT jf_js_id,SUM(jf_ship_quantity) AS shipqty
FROM tjobsheet_finish f WHERE (jf_js_id=@jsid)
GROUP BY jf_js_id
那么我们将通过如下的代码来调用
String sql = "{ call getShipQuantity(?) }";
Connection con = getSession().connection();//通过hibernate得到的连接
ResultSet rs = null;
BigDecimal shipQuantity = new BigDecimal(0);
try{
CallableStatement cs = con.prepareCall(sql);
cs.setInt(1,jsoId);//设置输入参数
rs = cs.executeQuery();//返回结果集
if(rs.next()){
shipQuantity = new BigDecimal(rs.getDouble(2));
}
logger.debug("shipQuantity --------------------- "+shipQuantity);
}catch(Exception e){
logger.debug(e);
}
2)返回一个特定的值。也就是说,在procedure的定义中已经用output输出参数了。请看下面的proceduer
create procedure getSingleWgt @@singleWgt numeric(8,3) output,@jsnum varchar(11) = '0000-0480'
as
declare @stwgt numeric(8,3)
select @stwgt = sum(b.stwgt)
from js as a
inner join jsactdtl as b
on a.jsnum = b.jsnum
where a.completion = 1
and b.stflag = 22
and a.jsnum = @jsnum
select @@singleWgt = (@stwgt/orderedqty) from js where jsnum = @jsnum
那么我们将通过如下的代码来调用
String sql = "{ call getSingleWgt(?,?) }";
Connection con = getSession().connection();//得到connection
try{
CallableStatement cs = con.prepareCall(sql);//通过它来执行sql
cs.registerOutParameter(1,java.sql.Types.FLOAT);//注册输出参数
cs.setString(2,shipment.getJsnum());//指出输入参数
if(cs.execute()){//执行
float output = cs.getFloat(1);//返回值
}
}catch(Exception e){
logger.debug(e);
}