??xml version="1.0" encoding="utf-8" standalone="yes"?> 一:Java如何实现对存储过E的调用: ------------在JAVA中调?-------------------- ------------执行存储q程-------------- -------------执行存储q程------------------------- 一:Java如何实现对存储过E的调用: ------------在JAVA中调?-------------------- ------------执行存储q程-------------- -------------执行存储q程------------------------- 一:Java如何实现对存储过E的调用: ------------在JAVA中调?-------------------- ------------执行存储q程-------------- -------------执行存储q程-------------------------
A:不带输出参数?br />
---------------不带输出参数?---------------------------------
create procedure
getsum
@n int =0<--此处为参?->
as
declare @sum
int<--定义变量-->
declare @i int
set @sum=0
set @i=0
while
@i<=@n begin
set @sum=@sum+@i
set @i=@i+1
end
print 'the sum is
'+ltrim(rtrim(str(@sum)))
--------------在SQL中执?--------------------
exec getsum 100
------------在JAVA中调?---------------------
JAVA可以调用
但是在JAVAE序却不能去昄该存储过E的l果 因ؓ上面的存?br /> q程的参数类型int 传递方式是in(按?方式
import
java.sql.*;
public class ProcedureTest
{
public static void
main(String args[]) throws Exception
{
//加蝲驱动
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call getsum(?)}");
//l存储过E的参数讄?br /> c.setInt(1,100); //第一个参数的D|成100
//执行存储q程
c.execute();
conn.close();
}
}
B:带输出参数的
1:q回int
-------------------------带输出参数的----------------
alter procedure getsum
@n
int =0,
@result int output
as
declare @sum int
declare @i int
set
@sum=0
set @i=0
while @i<=@n begin
set @sum=@sum+@i
set
@i=@i+1
end
set @result=@sum
-------------------在查询分析器中执?-----------
declare @myResult int
exec
getsum 100,@myResult output
print @myResult
import java.sql.*;
public
class ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call getsum(?,?)}");
//l存储过E的W一个参数设|?br /> c.setInt(1,100);
//注册存储q程的第二个参数
c.registerOutParameter(2,java.sql.Types.INTEGER);
//执行存储q程
c.execute();
//得到存储q程的输出参数?br /> System.out.println (c.getInt(2));
conn.close();
}
}
2:q回varchar
----------------存储q程带游?---------------
---在存储过E中带游?nbsp;
使用游标不停的遍历orderid
create procedure CursorIntoProcedure
@pname varchar(8000)
output
as
--定义游标
declare cur cursor for select orderid from
orders
--定义一个变量来接收游标的?br />declare @v varchar(5)
--打开游标
open cur
set
@pname=''--l@pname初?br />--提取游标的?br />fetch next from cur into @v
while
@@fetch_status=0
begin
set @pname=@pname+';'+@v
fetch next from cur into
@v
end
print @pname
--关闭游标
close cur
--销毁游?br />deallocate cur
exec CursorIntoProcedure ''
--------------JAVA调用------------------
import java.sql.*;
public
class ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
CallableStatement c=conn.prepareCall("{call CursorIntoProcedure(?)}");
c.registerOutParameter(1,java.sql.Types.VARCHAR);
c.execute();
System.out.println (c.getString(1));
conn.close();
}
}
C:删除数据的存储过E?br />
------------------存储q程--------------------------
drop table 学生基本信息?br />create table 学生基本信息?br />(
StuID int primary
key,
StuName varchar(10),
StuAddress varchar(20)
)
insert into
学生基本信息?values(1,'三毛','wuhan')
insert into 学生基本信息?
values(2,'三毛','wuhan')
create table 学生成W?br />(
StuID int,
Chinese
int,
PyhSics int
foreign key(StuID) references 学生基本信息?StuID)
on
delete cascade
on update cascade
)
insert into 学生成W?
values(1,99,100)
insert into 学生成W?values(2,99,100)
--创徏存储q程
create procedure delePro
@StuID int
as
delete from
学生基本信息?where StuID=@StuID
--创徏完毕
exec delePro 1
--执行存储q程
--创徏存储q程
create procedure selePro
as
select * from
学生基本信息?br />--创徏完毕
exec selePro --执行存储q程
------------------在JAVA中调?---------------
import java.sql.*;
public class
ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call delePro(?)}");
c.setInt(1,1);
c.execute();
c=conn.prepareCall("{call selePro}");
ResultSet
rs=c.executeQuery();
while(rs.next())
{
String Stu=rs.getString("StuID");
String
name=rs.getString("StuName");
String
add=rs.getString("StuAddress");
System.out.println
("学号:"+" "+"姓名:"+" "+"地址");
System.out.println (Stu+"
"+name+" "+add);
}
c.close();
}
}
D:修改数据的存储过E?br />---------------------创徏存储q程---------------------
create
procedure ModPro
@StuID int,
@StuName varchar(10)
as
update 学生基本信息?
set StuName=@StuName where StuID=@StuID
exec ModPro 2,'四毛'
---------------JAVA调用存储q程--------------------
import java.sql.*;
public
class ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call ModPro(?,?)}");
c.setInt(1,2);
c.setString(2,"女");
c.execute();
c=conn.prepareCall("{call
selePro}");
ResultSet rs=c.executeQuery();
while(rs.next())
{
String
Stu=rs.getString("StuID");
String
name=rs.getString("StuName");
String
add=rs.getString("StuAddress");
System.out.println
("学号:"+" "+"姓名:"+" "+"地址");
System.out.println (Stu+"
"+name+" "+add);
}
c.close();
}
}
E:查询数据的存储过E?模糊查询)
-----------------存储q程---------------------
create
procedure FindCusts
@cust varchar(10)
as
select customerid from orders
where customerid
like '%'+@cust+'%'
---------------执行---------------------------
execute FindCusts 'alfki'
-------------在JAVA中调?-------------------------
import java.sql.*;
public
class ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call FindCusts(?)}");
c.setString(1,"Tom");
ResultSet
rs=c.executeQuery();
while(rs.next())
{
String cust=rs.getString("customerid");
System.out.println (cust);
}
c.close();
}
}
F:增加数据的存储过E?/p>
------------存储q程--------------------
create procedure
InsertPro
@StuID int,
@StuName varchar(10),
@StuAddress
varchar(20)
as
insert into 学生基本信息?values(@StuID,@StuName,@StuAddress)
-----------调用存储q程---------------
exec InsertPro
5,'555','555'
-----------在JAVA中执?------------
import
java.sql.*;
public class ProcedureTest
{
public static void
main(String args[]) throws Exception
{
//加蝲驱动
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call InsertPro(?,?,?)}");
c.setInt(1,6);
c.setString(2,"Liu");
c.setString(3,"wuhan");
c.execute();
c=conn.prepareCall("{call selePro}");
ResultSet
rs=c.executeQuery();
while(rs.next())
{
String stuid=rs.getString("StuID");
String
name=rs.getString("StuName");
String
address=rs.getString("StuAddress");
System.out.println
(stuid+" "+name+" "+address);
}
c.close();
}
}
G:在JAVA中创建存储过E?nbsp; q且在JAVA中直接调?br />import java.sql.*;
public class
ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
Statement stmt=conn.createStatement();
//在JAVA中创建存储过E?br />
stmt.executeUpdate("create procedure OOP as select * from 学生成W?);
CallableStatement c=conn.prepareCall("{call OOP}");
ResultSet
rs=c.executeQuery();
while(rs.next())
{
String
chinese=rs.getString("Chinese");
System.out.println
(chinese);
}
conn.close();
}
}
A:不带输出参数?br />
---------------不带输出参数?---------------------------------
create procedure
getsum
@n int =0<--此处为参?->
as
declare @sum
int<--定义变量-->
declare @i int
set @sum=0
set @i=0
while
@i<=@n begin
set @sum=@sum+@i
set @i=@i+1
end
print 'the sum is
'+ltrim(rtrim(str(@sum)))
--------------在SQL中执?--------------------
exec getsum 100
------------在JAVA中调?---------------------
JAVA可以调用
但是在JAVAE序却不能去昄该存储过E的l果 因ؓ上面的存?br /> q程的参数类型int 传递方式是in(按?方式
import
java.sql.*;
public class ProcedureTest
{
public static void
main(String args[]) throws Exception
{
//加蝲驱动
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call getsum(?)}");
//l存储过E的参数讄?br /> c.setInt(1,100); //第一个参数的D|成100
//执行存储q程
c.execute();
conn.close();
}
}
B:带输出参数的
1:q回int
-------------------------带输出参数的----------------
alter procedure getsum
@n
int =0,
@result int output
as
declare @sum int
declare @i int
set
@sum=0
set @i=0
while @i<=@n begin
set @sum=@sum+@i
set
@i=@i+1
end
set @result=@sum
-------------------在查询分析器中执?-----------
declare @myResult int
exec
getsum 100,@myResult output
print @myResult
import java.sql.*;
public
class ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call getsum(?,?)}");
//l存储过E的W一个参数设|?br /> c.setInt(1,100);
//注册存储q程的第二个参数
c.registerOutParameter(2,java.sql.Types.INTEGER);
//执行存储q程
c.execute();
//得到存储q程的输出参数?br /> System.out.println (c.getInt(2));
conn.close();
}
}
2:q回varchar
----------------存储q程带游?---------------
---在存储过E中带游?nbsp;
使用游标不停的遍历orderid
create procedure CursorIntoProcedure
@pname varchar(8000)
output
as
--定义游标
declare cur cursor for select orderid from
orders
--定义一个变量来接收游标的?br />declare @v varchar(5)
--打开游标
open cur
set
@pname=''--l@pname初?br />--提取游标的?br />fetch next from cur into @v
while
@@fetch_status=0
begin
set @pname=@pname+';'+@v
fetch next from cur into
@v
end
print @pname
--关闭游标
close cur
--销毁游?br />deallocate cur
exec CursorIntoProcedure ''
--------------JAVA调用------------------
import java.sql.*;
public
class ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
CallableStatement c=conn.prepareCall("{call CursorIntoProcedure(?)}");
c.registerOutParameter(1,java.sql.Types.VARCHAR);
c.execute();
System.out.println (c.getString(1));
conn.close();
}
}
C:删除数据的存储过E?br />
------------------存储q程--------------------------
drop table 学生基本信息?br />create table 学生基本信息?br />(
StuID int primary
key,
StuName varchar(10),
StuAddress varchar(20)
)
insert into
学生基本信息?values(1,'三毛','wuhan')
insert into 学生基本信息?
values(2,'三毛','wuhan')
create table 学生成W?br />(
StuID int,
Chinese
int,
PyhSics int
foreign key(StuID) references 学生基本信息?StuID)
on
delete cascade
on update cascade
)
insert into 学生成W?
values(1,99,100)
insert into 学生成W?values(2,99,100)
--创徏存储q程
create procedure delePro
@StuID int
as
delete from
学生基本信息?where StuID=@StuID
--创徏完毕
exec delePro 1
--执行存储q程
--创徏存储q程
create procedure selePro
as
select * from
学生基本信息?br />--创徏完毕
exec selePro --执行存储q程
------------------在JAVA中调?---------------
import java.sql.*;
public class
ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call delePro(?)}");
c.setInt(1,1);
c.execute();
c=conn.prepareCall("{call selePro}");
ResultSet
rs=c.executeQuery();
while(rs.next())
{
String Stu=rs.getString("StuID");
String
name=rs.getString("StuName");
String
add=rs.getString("StuAddress");
System.out.println
("学号:"+" "+"姓名:"+" "+"地址");
System.out.println (Stu+"
"+name+" "+add);
}
c.close();
}
}
D:修改数据的存储过E?br />---------------------创徏存储q程---------------------
create
procedure ModPro
@StuID int,
@StuName varchar(10)
as
update 学生基本信息?
set StuName=@StuName where StuID=@StuID
exec ModPro 2,'四毛'
---------------JAVA调用存储q程--------------------
import java.sql.*;
public
class ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call ModPro(?,?)}");
c.setInt(1,2);
c.setString(2,"女");
c.execute();
c=conn.prepareCall("{call
selePro}");
ResultSet rs=c.executeQuery();
while(rs.next())
{
String
Stu=rs.getString("StuID");
String
name=rs.getString("StuName");
String
add=rs.getString("StuAddress");
System.out.println
("学号:"+" "+"姓名:"+" "+"地址");
System.out.println (Stu+"
"+name+" "+add);
}
c.close();
}
}
E:查询数据的存储过E?模糊查询)
-----------------存储q程---------------------
create
procedure FindCusts
@cust varchar(10)
as
select customerid from orders
where customerid
like '%'+@cust+'%'
---------------执行---------------------------
execute FindCusts 'alfki'
-------------在JAVA中调?-------------------------
import java.sql.*;
public
class ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call FindCusts(?)}");
c.setString(1,"Tom");
ResultSet
rs=c.executeQuery();
while(rs.next())
{
String cust=rs.getString("customerid");
System.out.println (cust);
}
c.close();
}
}
F:增加数据的存储过E?/p>
------------存储q程--------------------
create procedure
InsertPro
@StuID int,
@StuName varchar(10),
@StuAddress
varchar(20)
as
insert into 学生基本信息?values(@StuID,@StuName,@StuAddress)
-----------调用存储q程---------------
exec InsertPro
5,'555','555'
-----------在JAVA中执?------------
import
java.sql.*;
public class ProcedureTest
{
public static void
main(String args[]) throws Exception
{
//加蝲驱动
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call InsertPro(?,?,?)}");
c.setInt(1,6);
c.setString(2,"Liu");
c.setString(3,"wuhan");
c.execute();
c=conn.prepareCall("{call selePro}");
ResultSet
rs=c.executeQuery();
while(rs.next())
{
String stuid=rs.getString("StuID");
String
name=rs.getString("StuName");
String
address=rs.getString("StuAddress");
System.out.println
(stuid+" "+name+" "+address);
}
c.close();
}
}
G:在JAVA中创建存储过E?nbsp; q且在JAVA中直接调?br />import java.sql.*;
public class
ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
Statement stmt=conn.createStatement();
//在JAVA中创建存储过E?br />
stmt.executeUpdate("create procedure OOP as select * from 学生成W?);
CallableStatement c=conn.prepareCall("{call OOP}");
ResultSet
rs=c.executeQuery();
while(rs.next())
{
String
chinese=rs.getString("Chinese");
System.out.println
(chinese);
}
conn.close();
}
}
A:不带输出参数?br />
---------------不带输出参数?---------------------------------
create procedure
getsum
@n int =0<--此处为参?->
as
declare @sum
int<--定义变量-->
declare @i int
set @sum=0
set @i=0
while
@i<=@n begin
set @sum=@sum+@i
set @i=@i+1
end
print 'the sum is
'+ltrim(rtrim(str(@sum)))
--------------在SQL中执?--------------------
exec getsum 100
------------在JAVA中调?---------------------
JAVA可以调用
但是在JAVAE序却不能去昄该存储过E的l果 因ؓ上面的存?br /> q程的参数类型int 传递方式是in(按?方式
import
java.sql.*;
public class ProcedureTest
{
public static void
main(String args[]) throws Exception
{
//加蝲驱动
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call getsum(?)}");
//l存储过E的参数讄?br /> c.setInt(1,100); //第一个参数的D|成100
//执行存储q程
c.execute();
conn.close();
}
}
B:带输出参数的
1:q回int
-------------------------带输出参数的----------------
alter procedure getsum
@n
int =0,
@result int output
as
declare @sum int
declare @i int
set
@sum=0
set @i=0
while @i<=@n begin
set @sum=@sum+@i
set
@i=@i+1
end
set @result=@sum
-------------------在查询分析器中执?-----------
declare @myResult int
exec
getsum 100,@myResult output
print @myResult
import java.sql.*;
public
class ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call getsum(?,?)}");
//l存储过E的W一个参数设|?br /> c.setInt(1,100);
//注册存储q程的第二个参数
c.registerOutParameter(2,java.sql.Types.INTEGER);
//执行存储q程
c.execute();
//得到存储q程的输出参数?br /> System.out.println (c.getInt(2));
conn.close();
}
}
2:q回varchar
----------------存储q程带游?---------------
---在存储过E中带游?nbsp;
使用游标不停的遍历orderid
create procedure CursorIntoProcedure
@pname varchar(8000)
output
as
--定义游标
declare cur cursor for select orderid from
orders
--定义一个变量来接收游标的?br />declare @v varchar(5)
--打开游标
open cur
set
@pname=''--l@pname初?br />--提取游标的?br />fetch next from cur into @v
while
@@fetch_status=0
begin
set @pname=@pname+';'+@v
fetch next from cur into
@v
end
print @pname
--关闭游标
close cur
--销毁游?br />deallocate cur
exec CursorIntoProcedure ''
--------------JAVA调用------------------
import java.sql.*;
public
class ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
CallableStatement c=conn.prepareCall("{call CursorIntoProcedure(?)}");
c.registerOutParameter(1,java.sql.Types.VARCHAR);
c.execute();
System.out.println (c.getString(1));
conn.close();
}
}
C:删除数据的存储过E?br />
------------------存储q程--------------------------
drop table 学生基本信息?br />create table 学生基本信息?br />(
StuID int primary
key,
StuName varchar(10),
StuAddress varchar(20)
)
insert into
学生基本信息?values(1,'三毛','wuhan')
insert into 学生基本信息?
values(2,'三毛','wuhan')
create table 学生成W?br />(
StuID int,
Chinese
int,
PyhSics int
foreign key(StuID) references 学生基本信息?StuID)
on
delete cascade
on update cascade
)
insert into 学生成W?
values(1,99,100)
insert into 学生成W?values(2,99,100)
--创徏存储q程
create procedure delePro
@StuID int
as
delete from
学生基本信息?where StuID=@StuID
--创徏完毕
exec delePro 1
--执行存储q程
--创徏存储q程
create procedure selePro
as
select * from
学生基本信息?br />--创徏完毕
exec selePro --执行存储q程
------------------在JAVA中调?---------------
import java.sql.*;
public class
ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call delePro(?)}");
c.setInt(1,1);
c.execute();
c=conn.prepareCall("{call selePro}");
ResultSet
rs=c.executeQuery();
while(rs.next())
{
String Stu=rs.getString("StuID");
String
name=rs.getString("StuName");
String
add=rs.getString("StuAddress");
System.out.println
("学号:"+" "+"姓名:"+" "+"地址");
System.out.println (Stu+"
"+name+" "+add);
}
c.close();
}
}
D:修改数据的存储过E?br />---------------------创徏存储q程---------------------
create
procedure ModPro
@StuID int,
@StuName varchar(10)
as
update 学生基本信息?
set StuName=@StuName where StuID=@StuID
exec ModPro 2,'四毛'
---------------JAVA调用存储q程--------------------
import java.sql.*;
public
class ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call ModPro(?,?)}");
c.setInt(1,2);
c.setString(2,"女");
c.execute();
c=conn.prepareCall("{call
selePro}");
ResultSet rs=c.executeQuery();
while(rs.next())
{
String
Stu=rs.getString("StuID");
String
name=rs.getString("StuName");
String
add=rs.getString("StuAddress");
System.out.println
("学号:"+" "+"姓名:"+" "+"地址");
System.out.println (Stu+"
"+name+" "+add);
}
c.close();
}
}
E:查询数据的存储过E?模糊查询)
-----------------存储q程---------------------
create
procedure FindCusts
@cust varchar(10)
as
select customerid from orders
where customerid
like '%'+@cust+'%'
---------------执行---------------------------
execute FindCusts 'alfki'
-------------在JAVA中调?-------------------------
import java.sql.*;
public
class ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call FindCusts(?)}");
c.setString(1,"Tom");
ResultSet
rs=c.executeQuery();
while(rs.next())
{
String cust=rs.getString("customerid");
System.out.println (cust);
}
c.close();
}
}
F:增加数据的存储过E?/p>
------------存储q程--------------------
create procedure
InsertPro
@StuID int,
@StuName varchar(10),
@StuAddress
varchar(20)
as
insert into 学生基本信息?values(@StuID,@StuName,@StuAddress)
-----------调用存储q程---------------
exec InsertPro
5,'555','555'
-----------在JAVA中执?------------
import
java.sql.*;
public class ProcedureTest
{
public static void
main(String args[]) throws Exception
{
//加蝲驱动
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创徏存储q程的对?br /> CallableStatement
c=conn.prepareCall("{call InsertPro(?,?,?)}");
c.setInt(1,6);
c.setString(2,"Liu");
c.setString(3,"wuhan");
c.execute();
c=conn.prepareCall("{call selePro}");
ResultSet
rs=c.executeQuery();
while(rs.next())
{
String stuid=rs.getString("StuID");
String
name=rs.getString("StuName");
String
address=rs.getString("StuAddress");
System.out.println
(stuid+" "+name+" "+address);
}
c.close();
}
}
G:在JAVA中创建存储过E?nbsp; q且在JAVA中直接调?br />import java.sql.*;
public class
ProcedureTest
{
public static void main(String args[]) throws
Exception
{
//加蝲驱动
DriverManager.registerDriver(new
sun.jdbc.odbc.JdbcOdbcDriver());
//获得q接
Connection
conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
Statement stmt=conn.createStatement();
//在JAVA中创建存储过E?br />
stmt.executeUpdate("create procedure OOP as select * from 学生成W?);
CallableStatement c=conn.prepareCall("{call OOP}");
ResultSet
rs=c.executeQuery();
while(rs.next())
{
String
chinese=rs.getString("Chinese");
System.out.println
(chinese);
}
conn.close();
}
}
监听器类:
SysContextListener.java
package axtic.servlet;
import java.util.Timer;//定时器类
import axtic.bean.exportHistoryBean;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class SysContextListener implements ServletContextListener
{
private Timer timer = null;
public void contextInitialized(ServletContextEvent event)
{//在这里初始化监听器,在tomcat启动的时候监听器启动Q可以在q里实现定时器功?/span>
timer = new Timer(true);
event.getServletContext().log("定时器已启动");//d日志Q可在tomcat日志中查看到
timer.schedule(new exportHistoryBean(event.getServletContext()),0,5*1000);//调用exportHistoryBeanQ?表示d无gq,5*1000表示每隔5U执行Q务,60*60*1000表示一个小时?/span>
event.getServletContext().log("已经dd");
}
public void contextDestroyed(ServletContextEvent event)
{//在这里关闭监听器Q所以在q里销毁定时器?/span>
timer.cancel();
event.getServletContext().log("定时器销?quot;);
}
}
接下来可以编写自q功能c,此类一定要extends定时器类中TimerTask
功能c?
exportHistoryBean.java
package axtic.bean;
import java.util.Calendar;
import java.util.TimerTask;
import javax.servlet.ServletContext;
public class exportHistoryBean extends TimerTask
{
private static final int C_SCHEDULE_HOUR = 0;
private static boolean isRunning = false;
private ServletContext context = null;
public exportHistoryBean(ServletContext context)
{
this.context = context;
}
public void run()
{
Calendar c = Calendar.getInstance();
if(!isRunning)
{
if(C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY))
{
isRunning = true;
context.log("开始执行指定Q?quot;);
//-------------------开始保存当日历史记?/span>
//在这里编写自q功能Q例Q?/span>
//File file = new File("temp");
//file.mkdir();
//启动tomcatQ可以发现在tomcat根目录下Q会自动创徏temp文g?/span>
//-------------------l束
isRunning = false;
context.log("指定d执行l束");
}
else
{
context.log("上一ơQ务执行还未结?quot;);
}
}
}
}
记的在web.xml中添?strong>listener的信?/span>
web.xml
<web-app>
<listener>
<listener-class>
com.listeners.MyContextListener
</listener-class>
</listener>
<servlet/>
<servlet-mapping/>
</web-app>
以上p够实现Web目的定时Q务了,下面是另一位牛人的实际应用及加?
Servlet侦听器结合Java定时器实CQ务计划调?/span>
好多朋友用过Windows的Q务计划,也有不少E序q己曾写过旉报警、系l自动关机等味E序Q可却很有朋友在Web工程中实现过cM功能。今天有I把W者先前曾在Tomcat上实现的cM功能Q搬出来与大家共享?/span>
早在几年前,我公司跟某市财政局合作目开发,为加政局Ҏ属单位胦务状늚有效监管Q开发、实施了财政局数据中心目。此目采用B/S加C/S混合l构模式。胦政局Web服务器上架设数据同步接收装置Q由市属单位每天下班前把财务信息通过HTTP协议上传臌政局中心服务器,与Web服务器上的接收装|对接。胦政局内部各部门需要查阅大量胦务信息,获取完备的市属单位当前胦务状况信息,各部门按职能划分Q需要准的获取各部门各自所x的汇M息,以胦政报表的形式提供?/span>
因胦政数据量大,实时计算财政报表速度较慢Q当初就考虑用报表缓存来减轻服务器的负担Q但用缓存需要一个合理的~存更新机制。考虑到各市属单位每天下班前才把胦务数据上传,财政局每天所查看到的财务信息其实q不包括当天Q除非有某位领导{到所属单位全部上传完之后才来查看信息Q应该已l下班了Q,所以要是能实现d计划调度Q在每晚深夜把当天及历史财务信息汇总,更新~存Q速度瓉不就解决了吗?/span>
当时׃pȝ核心是基于Web部v的,报表计算引擎也相应的部v在Tomcat容器上,因此如果惌借用Windows的Q务计划来实现定时计算Q就需要额外编写普通桌面应用程序接口,E显复杂。于是就琢磨着惛_Web上实玎ͼl过查阅较多相关资料Q发现Java定时器(java.util.TimerQ有定时触发计划d的功能,通过配置定时器的间隔旉Q在某一间隔旉D之后会自动有规律的调用预先所安排的计划Q务(java.util.TimerTaskQ。另外,׃我们希望当Web工程启动Ӟ定时器能自动开始计Ӟ在整个Web工程的生命期里,定时器能在每晚深夜触发一ơ报表计引擎。因此定时器的存放位|也值得考查Q不能简单的存在于单个Servlet或JavaBean中,必须能让定时器宿ȝ存活期ؓ整个Web工程生命期,在工E启动时能自动加载运行。结合这两点Q跟Servlet上下文有关的侦听器就最合适不q了Q通过在工E的配置文g中加以合理配|,会在工程启动时自动运行,q在整个工程生命期中处于监听状态?/span>
下面Servlet侦听器结合Java定时器来讲述整个实现q程。要q用Servlet侦听器需要实现javax.servlet.ServletContextListener接口Q同时实现它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个徏立和销毁的q程Q看了前面两个接口函敎ͼ׃容置疑的把徏立的q程|入contextInitializedQ把销毁的q程|入contextDestroyed了?/span>
我把ServletContextListener的实现类取名为ContextListener,在其内添加一个定时器Q示例代码如下所C(虑幅Q仅提供部分代码供读者参考)Q?/span>
private java.util.Timer timer = null;
public void contextInitialized(ServletContextEvent event) {
timer = new java.util.Timer(true);
event.getServletContext().log("定时器已启动");
timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000);
event.getServletContext().log("已经dd调度?quot;);
}
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
event.getServletContext().log("定时器销?quot;);
}
以上代码? timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000)q一行ؓ定时器调度语句,其中MyTask是自定义需要被调度的执行Q务(在我的胦政数据中心项目中是报表计算引擎入口Q,从java.util.TimerTaskl承Q下面会重点讲述Q第三个参数表示每小??0*60*1000毫秒)被触发一ơ,中间参数0表示无gq。其它代码相当简单,不再详细说明?/span>
下面介绍MyTask的实玎ͼ上面的代码中看到了在构造MyTaskӞ传入了javax.servlet.ServletContextcd参数,是ؓ记录Servlet日志方便而传入,因此需要重载MyTask的构造函敎ͼ其父cjava.util.TimerTask原构造函数是没有参数的)。在timer.schedule()的调度中,讄了每时调度一?因此如果惛_现调度Q务每24时被执行一ơ,q需要判断一下时钟点Q以帔RC_SCHEDULE_HOUR表示(晚上12点,也即0?。同时ؓ防止24时执行下来QQ务还未执行完Q当Ӟ一般Q务是没有q么长的Q,避免W二ơ又被调度以引v执行冲突Q设|了当前是否正在执行的状态标志isRunning。示例代码如下所C:
private static final int C_SCHEDULE_HOUR = 0;
private static boolean isRunning = false;
private ServletContext context = null;
public MyTask(ServletContext context) {
this.context = context;
}
public void run() {
Calendar cal = Calendar.getInstance();
if (!isRunning) {
if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {
isRunning = true;
context.log("开始执行指定Q?quot;);
//TODO d自定义的详细dQ以下只是示?/span>
int i = 0;
while (i++ < 10) {
context.log("已完成Q务的" + i + "/" + 10);
}
isRunning = false;
context.log("指定d执行l束");
}
} else {
context.log("上一ơQ务执行还未结?quot;);
}
}
上面代码?#8220;//TODO……”之下四行是真正被调度执行的演CZ?在我的胦政数据中心项目中是报表计算q程)Q您可以换成自己希望执行的语句?/span>
到这儿,ServletContextListener和MyTask的代码都已完整了。最后一步就是把ServletContextListener部v到您的Web工程中去Q在您工E的web.xml配置文g中加入如下三行:
com.test.ContextListener
当然Q上面的com.test得换成您自己的包名了。保存web.xml文g后,把工E打包部|到Tomcat中即可。Q务会在每?2点至凌晨1点之间被执行Q上面的代码会在Tomcat的日志文件中记录如下Q?/span>
2003-12-05 0Q?1Q?9 开始执行指定Q?/span>
2003-12-05 0Q?1Q?9 已完成Q务的1/10
……
2003-12-05 0Q?1Q?9 已完成Q务的10/10
2003-12-05 0Q?1Q?9 指定d执行l束
如何使用ServletContextListener
ideawu 发表?2006-06-23 18:20:15 分类: Web 状? 公众可见 查看: 775 评论: 0
q个J2EE提C阐qCServletContextListener的用法。这个事件类作ؓWeb应用E序的一部分Q处理Web应用E序的servlet上下?context)的变化的通知。这可以解释为,好像有个人在服务器旁不断地通知我们服务器在发生什么事件。那当然需要监听者了。因此,在通知上下?context)初始化和销毁的时候,ServletContextListner非常有用?/span>
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.*;
public class MyListener implements ServletContextListener {
private ServletContext context = null;
/* q个Ҏ在Web应用服务被移除,没有能力再接受请求的时候被调用?/span>
*/
public void contextDestroyed(ServletContextEvent event){
//Output a simple message to the server's console
System.out.println("The Simple Web App. Has Been Removed");
this.context = null;
}
// q个Ҏ在Web应用服务做好接受h的时候被调用?/span>
public void contextInitialized(ServletContextEvent event){
this.context = event.getServletContext();
//Output a simple message to the server's console
System.out.println("The Simple Web App. Is Ready");
}
}
web.xml
<web-app>
<listener>
<listener-class>
com.listeners.MyContextListener
</listener-class>
</listener>
<servlet/>
<servlet-mapping/>
</web-app>
2.通常Q只在最上层(一般是UI?捕捉异常。如果要在其它层捕捉异常Q除非是下列情况之一Q?br> (1)能够处理该异常,或?br> (2)能够忽略该异常,或?br> (3)需要{换该异常为其它特定异常后抛出新异?/p>
3.UI层捕获异常后Q可?br> (1)无关紧要的异常忽略?br> (2)异常{换ؓ错误信息展现l用戗?br> (3)如果是重大异常,可以考虑l止应用E序?/p>
4.最上层(一般是UI?不得抛出新的异常Q最上层需要捕捉所有异常,否则异常会直接导致程序终止,q将是非怸好的用户体验?/p>
5.可以在非最上层抛出自定义异常。如果是自定义异常,请保证其是可序列化的Qƈ且保证其实现了Exception的三个构造函数?/p>
6.异常的抛Z截获需要很多的cpu旉Q请谨慎的用异常?/p>
7.在可能抛出异常的地方Q如果需要,L保用finallyq行资源清理Q而无论此处是否捕捉了异常?/p>
8.在一个catch块中的代码都应该臛_部分地处理了所捕捉的异常。否则,׃要用catch块?/p>
9.从构造函C抛出异常?br> 因ؓ构造函数没有返回|所以没有简单的Ҏ来想构造函数的调用者发出构造失败的信号Q这时便可以通过抛出异常来做到。比如构造参C指定条g不符Ӟ抛Z个异常?#160;
10.在以上前提的保证下,可以在非最上层使用AOP截获(intercept)异常而进行日志记录,q样通过日志记录Q我们可以了解系l的 q行状态。在软g实现中,异常和日志都是重要的质量保证手段Q异常和日志L同时出现的?br> 可以_异常是日志记录的重要/主要l成部分?br>
阅读全文