﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-专注技术，奋斗不止-文章分类-J2EE</title><link>http://www.blogjava.net/ProgramerNi/category/50940.html</link><description>程序员-小倪的个人博客</description><language>zh-cn</language><lastBuildDate>Sat, 25 Feb 2012 06:59:44 GMT</lastBuildDate><pubDate>Sat, 25 Feb 2012 06:59:44 GMT</pubDate><ttl>60</ttl><item><title>java 调用存储过程</title><link>http://www.blogjava.net/ProgramerNi/articles/370757.html</link><dc:creator>ProgramerNi</dc:creator><author>ProgramerNi</author><pubDate>Sat, 25 Feb 2012 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/ProgramerNi/articles/370757.html</guid><wfw:comment>http://www.blogjava.net/ProgramerNi/comments/370757.html</wfw:comment><comments>http://www.blogjava.net/ProgramerNi/articles/370757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ProgramerNi/comments/commentRss/370757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ProgramerNi/services/trackbacks/370757.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body"><br /><p>一:Java如何实现对存储过程的调用:<br />&nbsp;&nbsp; A:不带输出参数的<br />&nbsp;&nbsp; <br />---------------不带输出参数的----------------------------------<br />create procedure <br />getsum<br />@n int =0&lt;--此处为参数--&gt;<br />as<br />declare @sum <br />int&lt;--定义变量--&gt;<br />declare @i int<br />set @sum=0<br />set @i=0<br />while <br />@i&lt;=@n begin<br />set @sum=@sum+@i<br />set @i=@i+1<br />end<br />print 'the sum is <br />'+ltrim(rtrim(str(@sum)))</p><br /><p><br />--------------在SQL中执行:--------------------<br />&nbsp;&nbsp; exec getsum 100</p><br /><p><br />------------在JAVA中调用:---------------------<br />&nbsp;&nbsp; JAVA可以调用&nbsp;&nbsp; <br />但是在JAVA程序却不能去显示该存储过程的结果 因为上面的存储<br />&nbsp;&nbsp; 过程的参数类型int 传递方式是in(按值)方式<br />&nbsp;&nbsp; import <br />java.sql.*;<br />public class ProcedureTest <br />{<br />public static void <br />main(String args[]) throws Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; <br />DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; <br />//获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call getsum(?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//给存储过程的参数设置值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setInt(1,100);&nbsp;&nbsp; //将第一个参数的值设置成100<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //执行存储过程<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />conn.close();<br />}<br />}<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; B:带输出参数的<br />&nbsp;&nbsp;&nbsp;&nbsp; 1:返回int<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />-------------------------带输出参数的----------------<br />alter procedure getsum<br />@n <br />int =0,<br />@result int output<br />as<br />declare @sum int<br />declare @i int<br />set <br />@sum=0<br />set @i=0<br />while @i&lt;=@n begin<br />set @sum=@sum+@i<br />set <br />@i=@i+1<br />end<br />set @result=@sum<br />&nbsp;&nbsp; <br />-------------------在查询分析器中执行------------<br />&nbsp;&nbsp; declare @myResult int<br />exec <br />getsum 100,@myResult output<br />print @myResult</p><br /><p> </p><br /><p>&nbsp;&nbsp; ------------在JAVA中调用---------------------<br />import java.sql.*;<br />public <br />class ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call getsum(?,?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//给存储过程的第一个参数设置值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setInt(1,100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//注册存储过程的第二个参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.registerOutParameter(2,java.sql.Types.INTEGER);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//执行存储过程<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//得到存储过程的输出参数值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println (c.getInt(2));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />conn.close();<br />}<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp; 2:返回varchar<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />----------------存储过程带游标----------------<br />---在存储过程中带游标&nbsp;&nbsp; <br />使用游标不停的遍历orderid<br />create procedure CursorIntoProcedure<br />@pname varchar(8000) <br />output<br />as<br />--定义游标<br />declare cur cursor for select orderid from <br />orders<br />--定义一个变量来接收游标的值<br />declare @v varchar(5)<br />--打开游标<br />open cur<br />set <br />@pname=''--给@pname初值<br />--提取游标的值<br />fetch next from cur into @v<br />while <br />@@fetch_status=0<br />&nbsp;&nbsp; begin</p><br /><p><br />set @pname=@pname+';'+@v<br />&nbsp;&nbsp; fetch next from cur into <br />@v<br />end<br />print @pname<br />--关闭游标<br />close cur<br />--销毁游标<br />deallocate cur</p><br /><p> </p><br /><p>&nbsp;&nbsp; ------------执行存储过程--------------<br />exec CursorIntoProcedure ''</p><br /><p><br />&nbsp;&nbsp; --------------JAVA调用------------------<br />import java.sql.*;<br />public <br />class ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");<br />&nbsp;&nbsp; <br />CallableStatement c=conn.prepareCall("{call CursorIntoProcedure(?)}");<br />&nbsp; <br /><br />&nbsp; <br />&nbsp;&nbsp; c.registerOutParameter(1,java.sql.Types.VARCHAR);<br />&nbsp; <br />&nbsp;&nbsp; <br />c.execute();<br />&nbsp; <br />&nbsp;&nbsp; System.out.println (c.getString(1));<br />&nbsp;&nbsp; <br />conn.close();<br />}<br />}<br />&nbsp;&nbsp; C:删除数据的存储过程<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />------------------存储过程--------------------------</p><br /><p><br />drop table 学生基本信息表<br />create table 学生基本信息表<br />(<br />StuID int primary <br />key,<br />StuName varchar(10),<br />StuAddress varchar(20)<br />)<br />insert into&nbsp;&nbsp; <br />学生基本信息表 values(1,'三毛','wuhan')<br />insert into&nbsp;&nbsp; 学生基本信息表 <br />values(2,'三毛','wuhan')<br />create table 学生成绩表<br />(<br />StuID int,<br />Chinese <br />int,<br />PyhSics int<br />foreign key(StuID) references&nbsp;&nbsp; 学生基本信息表(StuID)<br />on <br />delete cascade<br />on update cascade<br />) <br />insert into&nbsp;&nbsp; 学生成绩表 <br />values(1,99,100)<br />insert into&nbsp;&nbsp; 学生成绩表 values(2,99,100)</p><br /><p><br />--创建存储过程 <br />create procedure delePro<br />@StuID int<br />as<br />delete from <br />学生基本信息表 where StuID=@StuID<br />--创建完毕<br />exec delePro 1&nbsp;&nbsp; <br />--执行存储过程<br />--创建存储过程<br />create procedure selePro<br />as<br />select * from <br />学生基本信息表<br />--创建完毕<br />exec selePro&nbsp;&nbsp; --执行存储过程<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />------------------在JAVA中调用----------------<br />import java.sql.*;<br />public class <br />ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call delePro(?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setInt(1,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c=conn.prepareCall("{call selePro}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet <br />rs=c.executeQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String Stu=rs.getString("StuID");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />name=rs.getString("StuName");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />add=rs.getString("StuAddress");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println <br />("学号:"+"&nbsp;&nbsp;&nbsp;&nbsp; "+"姓名:"+"&nbsp;&nbsp;&nbsp;&nbsp; "+"地址");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println (Stu+"&nbsp;&nbsp;&nbsp;&nbsp; <br />"+name+"&nbsp;&nbsp; "+add);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.close();<br />}<br />}<br />&nbsp;&nbsp; <br />D:修改数据的存储过程<br />---------------------创建存储过程---------------------<br />&nbsp;&nbsp; create <br />procedure ModPro<br />@StuID int,<br />@StuName varchar(10)<br />as<br />update 学生基本信息表 <br />set StuName=@StuName where StuID=@StuID</p><br /><p> </p><br /><p>&nbsp;&nbsp; -------------执行存储过程-------------------------<br />exec ModPro 2,'四毛'<br />&nbsp;&nbsp; <br />---------------JAVA调用存储过程--------------------<br />import java.sql.*;<br />public <br />class ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call ModPro(?,?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setInt(1,2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setString(2,"美女");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=conn.prepareCall("{call <br />selePro}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs=c.executeQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />while(rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />Stu=rs.getString("StuID");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />name=rs.getString("StuName");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />add=rs.getString("StuAddress");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println <br />("学号:"+"&nbsp;&nbsp;&nbsp;&nbsp; "+"姓名:"+"&nbsp;&nbsp;&nbsp;&nbsp; "+"地址");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println (Stu+"&nbsp;&nbsp;&nbsp;&nbsp; <br />"+name+"&nbsp;&nbsp; "+add);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.close();<br />}<br />}<br />&nbsp;&nbsp; <br />E:查询数据的存储过程(模糊查询)<br />&nbsp;&nbsp;&nbsp;&nbsp; -----------------存储过程---------------------<br />create <br />procedure FindCusts<br />@cust varchar(10)<br />as<br />select customerid from orders <br />where customerid <br />like '%'+@cust+'%'<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />---------------执行---------------------------<br />execute FindCusts 'alfki'<br />&nbsp;&nbsp; <br />-------------在JAVA中调用--------------------------<br />import java.sql.*;<br />public <br />class ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call FindCusts(?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setString(1,"Tom");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet <br />rs=c.executeQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String cust=rs.getString("customerid");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />System.out.println (cust);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.close();<br />}<br />}<br />&nbsp;&nbsp; <br />F:增加数据的存储过程</p><br /><p><br />------------存储过程--------------------<br />create procedure <br />InsertPro<br />@StuID int,<br />@StuName varchar(10),<br />@StuAddress <br />varchar(20)<br />as<br />insert into 学生基本信息表 values(@StuID,@StuName,@StuAddress)</p><br /><p><br />-----------调用存储过程---------------<br />exec InsertPro <br />5,'555','555'<br />-----------在JAVA中执行-------------<br />import <br />java.sql.*;<br />public class ProcedureTest <br />{<br />public static void <br />main(String args[]) throws Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; <br />DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; <br />//获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call InsertPro(?,?,?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setInt(1,6);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setString(2,"Liu");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setString(3,"wuhan");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=conn.prepareCall("{call selePro}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet <br />rs=c.executeQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String stuid=rs.getString("StuID");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />name=rs.getString("StuName");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />address=rs.getString("StuAddress");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println <br />(stuid+"&nbsp;&nbsp; "+name+"&nbsp;&nbsp; "+address);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.close();<br />}<br />}</p><br /><p><br />G:在JAVA中创建存储过程&nbsp;&nbsp; 并且在JAVA中直接调用<br />import java.sql.*;<br />public class <br />ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");<br />&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; <br />Statement stmt=conn.createStatement();<br />&nbsp;&nbsp; //在JAVA中创建存储过程<br />&nbsp;&nbsp; <br />stmt.executeUpdate("create procedure OOP as select * from 学生成绩表");<br />&nbsp; <br />&nbsp; <br /><br />&nbsp;&nbsp; CallableStatement c=conn.prepareCall("{call OOP}");<br />&nbsp; <br />&nbsp;&nbsp; ResultSet <br />rs=c.executeQuery();<br />&nbsp;&nbsp; while(rs.next())<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp; String <br />chinese=rs.getString("Chinese");<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; System.out.println <br />(chinese);<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp; conn.close();<br />&nbsp; <br />}<br />} <br /></p></div><img src ="http://www.blogjava.net/ProgramerNi/aggbug/370757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ProgramerNi/" target="_blank">ProgramerNi</a> 2012-02-25 10:13 <a href="http://www.blogjava.net/ProgramerNi/articles/370757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 调用存储过程</title><link>http://www.blogjava.net/ProgramerNi/articles/370754.html</link><dc:creator>ProgramerNi</dc:creator><author>ProgramerNi</author><pubDate>Sat, 25 Feb 2012 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/ProgramerNi/articles/370754.html</guid><wfw:comment>http://www.blogjava.net/ProgramerNi/comments/370754.html</wfw:comment><comments>http://www.blogjava.net/ProgramerNi/articles/370754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ProgramerNi/comments/commentRss/370754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ProgramerNi/services/trackbacks/370754.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body"><br /><p>一:Java如何实现对存储过程的调用:<br />&nbsp;&nbsp; A:不带输出参数的<br />&nbsp;&nbsp; <br />---------------不带输出参数的----------------------------------<br />create procedure <br />getsum<br />@n int =0&lt;--此处为参数--&gt;<br />as<br />declare @sum <br />int&lt;--定义变量--&gt;<br />declare @i int<br />set @sum=0<br />set @i=0<br />while <br />@i&lt;=@n begin<br />set @sum=@sum+@i<br />set @i=@i+1<br />end<br />print 'the sum is <br />'+ltrim(rtrim(str(@sum)))</p><br /><p><br />--------------在SQL中执行:--------------------<br />&nbsp;&nbsp; exec getsum 100</p><br /><p><br />------------在JAVA中调用:---------------------<br />&nbsp;&nbsp; JAVA可以调用&nbsp;&nbsp; <br />但是在JAVA程序却不能去显示该存储过程的结果 因为上面的存储<br />&nbsp;&nbsp; 过程的参数类型int 传递方式是in(按值)方式<br />&nbsp;&nbsp; import <br />java.sql.*;<br />public class ProcedureTest <br />{<br />public static void <br />main(String args[]) throws Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; <br />DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; <br />//获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call getsum(?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//给存储过程的参数设置值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setInt(1,100);&nbsp;&nbsp; //将第一个参数的值设置成100<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //执行存储过程<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />conn.close();<br />}<br />}<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; B:带输出参数的<br />&nbsp;&nbsp;&nbsp;&nbsp; 1:返回int<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />-------------------------带输出参数的----------------<br />alter procedure getsum<br />@n <br />int =0,<br />@result int output<br />as<br />declare @sum int<br />declare @i int<br />set <br />@sum=0<br />set @i=0<br />while @i&lt;=@n begin<br />set @sum=@sum+@i<br />set <br />@i=@i+1<br />end<br />set @result=@sum<br />&nbsp;&nbsp; <br />-------------------在查询分析器中执行------------<br />&nbsp;&nbsp; declare @myResult int<br />exec <br />getsum 100,@myResult output<br />print @myResult</p><br /><p> </p><br /><p>&nbsp;&nbsp; ------------在JAVA中调用---------------------<br />import java.sql.*;<br />public <br />class ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call getsum(?,?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//给存储过程的第一个参数设置值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setInt(1,100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//注册存储过程的第二个参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.registerOutParameter(2,java.sql.Types.INTEGER);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//执行存储过程<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//得到存储过程的输出参数值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println (c.getInt(2));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />conn.close();<br />}<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp; 2:返回varchar<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />----------------存储过程带游标----------------<br />---在存储过程中带游标&nbsp;&nbsp; <br />使用游标不停的遍历orderid<br />create procedure CursorIntoProcedure<br />@pname varchar(8000) <br />output<br />as<br />--定义游标<br />declare cur cursor for select orderid from <br />orders<br />--定义一个变量来接收游标的值<br />declare @v varchar(5)<br />--打开游标<br />open cur<br />set <br />@pname=''--给@pname初值<br />--提取游标的值<br />fetch next from cur into @v<br />while <br />@@fetch_status=0<br />&nbsp;&nbsp; begin</p><br /><p><br />set @pname=@pname+';'+@v<br />&nbsp;&nbsp; fetch next from cur into <br />@v<br />end<br />print @pname<br />--关闭游标<br />close cur<br />--销毁游标<br />deallocate cur</p><br /><p> </p><br /><p>&nbsp;&nbsp; ------------执行存储过程--------------<br />exec CursorIntoProcedure ''</p><br /><p><br />&nbsp;&nbsp; --------------JAVA调用------------------<br />import java.sql.*;<br />public <br />class ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");<br />&nbsp;&nbsp; <br />CallableStatement c=conn.prepareCall("{call CursorIntoProcedure(?)}");<br />&nbsp; <br /><br />&nbsp; <br />&nbsp;&nbsp; c.registerOutParameter(1,java.sql.Types.VARCHAR);<br />&nbsp; <br />&nbsp;&nbsp; <br />c.execute();<br />&nbsp; <br />&nbsp;&nbsp; System.out.println (c.getString(1));<br />&nbsp;&nbsp; <br />conn.close();<br />}<br />}<br />&nbsp;&nbsp; C:删除数据的存储过程<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />------------------存储过程--------------------------</p><br /><p><br />drop table 学生基本信息表<br />create table 学生基本信息表<br />(<br />StuID int primary <br />key,<br />StuName varchar(10),<br />StuAddress varchar(20)<br />)<br />insert into&nbsp;&nbsp; <br />学生基本信息表 values(1,'三毛','wuhan')<br />insert into&nbsp;&nbsp; 学生基本信息表 <br />values(2,'三毛','wuhan')<br />create table 学生成绩表<br />(<br />StuID int,<br />Chinese <br />int,<br />PyhSics int<br />foreign key(StuID) references&nbsp;&nbsp; 学生基本信息表(StuID)<br />on <br />delete cascade<br />on update cascade<br />) <br />insert into&nbsp;&nbsp; 学生成绩表 <br />values(1,99,100)<br />insert into&nbsp;&nbsp; 学生成绩表 values(2,99,100)</p><br /><p><br />--创建存储过程 <br />create procedure delePro<br />@StuID int<br />as<br />delete from <br />学生基本信息表 where StuID=@StuID<br />--创建完毕<br />exec delePro 1&nbsp;&nbsp; <br />--执行存储过程<br />--创建存储过程<br />create procedure selePro<br />as<br />select * from <br />学生基本信息表<br />--创建完毕<br />exec selePro&nbsp;&nbsp; --执行存储过程<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />------------------在JAVA中调用----------------<br />import java.sql.*;<br />public class <br />ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call delePro(?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setInt(1,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c=conn.prepareCall("{call selePro}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet <br />rs=c.executeQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String Stu=rs.getString("StuID");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />name=rs.getString("StuName");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />add=rs.getString("StuAddress");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println <br />("学号:"+"&nbsp;&nbsp;&nbsp;&nbsp; "+"姓名:"+"&nbsp;&nbsp;&nbsp;&nbsp; "+"地址");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println (Stu+"&nbsp;&nbsp;&nbsp;&nbsp; <br />"+name+"&nbsp;&nbsp; "+add);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.close();<br />}<br />}<br />&nbsp;&nbsp; <br />D:修改数据的存储过程<br />---------------------创建存储过程---------------------<br />&nbsp;&nbsp; create <br />procedure ModPro<br />@StuID int,<br />@StuName varchar(10)<br />as<br />update 学生基本信息表 <br />set StuName=@StuName where StuID=@StuID</p><br /><p> </p><br /><p>&nbsp;&nbsp; -------------执行存储过程-------------------------<br />exec ModPro 2,'四毛'<br />&nbsp;&nbsp; <br />---------------JAVA调用存储过程--------------------<br />import java.sql.*;<br />public <br />class ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call ModPro(?,?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setInt(1,2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setString(2,"美女");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=conn.prepareCall("{call <br />selePro}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs=c.executeQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />while(rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />Stu=rs.getString("StuID");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />name=rs.getString("StuName");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />add=rs.getString("StuAddress");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println <br />("学号:"+"&nbsp;&nbsp;&nbsp;&nbsp; "+"姓名:"+"&nbsp;&nbsp;&nbsp;&nbsp; "+"地址");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println (Stu+"&nbsp;&nbsp;&nbsp;&nbsp; <br />"+name+"&nbsp;&nbsp; "+add);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.close();<br />}<br />}<br />&nbsp;&nbsp; <br />E:查询数据的存储过程(模糊查询)<br />&nbsp;&nbsp;&nbsp;&nbsp; -----------------存储过程---------------------<br />create <br />procedure FindCusts<br />@cust varchar(10)<br />as<br />select customerid from orders <br />where customerid <br />like '%'+@cust+'%'<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />---------------执行---------------------------<br />execute FindCusts 'alfki'<br />&nbsp;&nbsp; <br />-------------在JAVA中调用--------------------------<br />import java.sql.*;<br />public <br />class ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call FindCusts(?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setString(1,"Tom");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet <br />rs=c.executeQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String cust=rs.getString("customerid");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />System.out.println (cust);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.close();<br />}<br />}<br />&nbsp;&nbsp; <br />F:增加数据的存储过程</p><br /><p><br />------------存储过程--------------------<br />create procedure <br />InsertPro<br />@StuID int,<br />@StuName varchar(10),<br />@StuAddress <br />varchar(20)<br />as<br />insert into 学生基本信息表 values(@StuID,@StuName,@StuAddress)</p><br /><p><br />-----------调用存储过程---------------<br />exec InsertPro <br />5,'555','555'<br />-----------在JAVA中执行-------------<br />import <br />java.sql.*;<br />public class ProcedureTest <br />{<br />public static void <br />main(String args[]) throws Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; <br />DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; <br />//获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call InsertPro(?,?,?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setInt(1,6);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setString(2,"Liu");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setString(3,"wuhan");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=conn.prepareCall("{call selePro}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet <br />rs=c.executeQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String stuid=rs.getString("StuID");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />name=rs.getString("StuName");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />address=rs.getString("StuAddress");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println <br />(stuid+"&nbsp;&nbsp; "+name+"&nbsp;&nbsp; "+address);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.close();<br />}<br />}</p><br /><p><br />G:在JAVA中创建存储过程&nbsp;&nbsp; 并且在JAVA中直接调用<br />import java.sql.*;<br />public class <br />ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");<br />&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; <br />Statement stmt=conn.createStatement();<br />&nbsp;&nbsp; //在JAVA中创建存储过程<br />&nbsp;&nbsp; <br />stmt.executeUpdate("create procedure OOP as select * from 学生成绩表");<br />&nbsp; <br />&nbsp; <br /><br />&nbsp;&nbsp; CallableStatement c=conn.prepareCall("{call OOP}");<br />&nbsp; <br />&nbsp;&nbsp; ResultSet <br />rs=c.executeQuery();<br />&nbsp;&nbsp; while(rs.next())<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp; String <br />chinese=rs.getString("Chinese");<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; System.out.println <br />(chinese);<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp; conn.close();<br />&nbsp; <br />}<br />} <br /></p></div><img src ="http://www.blogjava.net/ProgramerNi/aggbug/370754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ProgramerNi/" target="_blank">ProgramerNi</a> 2012-02-25 10:10 <a href="http://www.blogjava.net/ProgramerNi/articles/370754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 调用存储过程</title><link>http://www.blogjava.net/ProgramerNi/articles/370755.html</link><dc:creator>ProgramerNi</dc:creator><author>ProgramerNi</author><pubDate>Sat, 25 Feb 2012 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/ProgramerNi/articles/370755.html</guid><wfw:comment>http://www.blogjava.net/ProgramerNi/comments/370755.html</wfw:comment><comments>http://www.blogjava.net/ProgramerNi/articles/370755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ProgramerNi/comments/commentRss/370755.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ProgramerNi/services/trackbacks/370755.html</trackback:ping><description><![CDATA[<div id="cnblogs_post_body"><br /><p>一:Java如何实现对存储过程的调用:<br />&nbsp;&nbsp; A:不带输出参数的<br />&nbsp;&nbsp; <br />---------------不带输出参数的----------------------------------<br />create procedure <br />getsum<br />@n int =0&lt;--此处为参数--&gt;<br />as<br />declare @sum <br />int&lt;--定义变量--&gt;<br />declare @i int<br />set @sum=0<br />set @i=0<br />while <br />@i&lt;=@n begin<br />set @sum=@sum+@i<br />set @i=@i+1<br />end<br />print 'the sum is <br />'+ltrim(rtrim(str(@sum)))</p><br /><p><br />--------------在SQL中执行:--------------------<br />&nbsp;&nbsp; exec getsum 100</p><br /><p><br />------------在JAVA中调用:---------------------<br />&nbsp;&nbsp; JAVA可以调用&nbsp;&nbsp; <br />但是在JAVA程序却不能去显示该存储过程的结果 因为上面的存储<br />&nbsp;&nbsp; 过程的参数类型int 传递方式是in(按值)方式<br />&nbsp;&nbsp; import <br />java.sql.*;<br />public class ProcedureTest <br />{<br />public static void <br />main(String args[]) throws Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; <br />DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; <br />//获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call getsum(?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//给存储过程的参数设置值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setInt(1,100);&nbsp;&nbsp; //将第一个参数的值设置成100<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //执行存储过程<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />conn.close();<br />}<br />}<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; B:带输出参数的<br />&nbsp;&nbsp;&nbsp;&nbsp; 1:返回int<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />-------------------------带输出参数的----------------<br />alter procedure getsum<br />@n <br />int =0,<br />@result int output<br />as<br />declare @sum int<br />declare @i int<br />set <br />@sum=0<br />set @i=0<br />while @i&lt;=@n begin<br />set @sum=@sum+@i<br />set <br />@i=@i+1<br />end<br />set @result=@sum<br />&nbsp;&nbsp; <br />-------------------在查询分析器中执行------------<br />&nbsp;&nbsp; declare @myResult int<br />exec <br />getsum 100,@myResult output<br />print @myResult</p><br /><p> </p><br /><p>&nbsp;&nbsp; ------------在JAVA中调用---------------------<br />import java.sql.*;<br />public <br />class ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call getsum(?,?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//给存储过程的第一个参数设置值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setInt(1,100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//注册存储过程的第二个参数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.registerOutParameter(2,java.sql.Types.INTEGER);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//执行存储过程<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />//得到存储过程的输出参数值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println (c.getInt(2));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />conn.close();<br />}<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp; 2:返回varchar<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />----------------存储过程带游标----------------<br />---在存储过程中带游标&nbsp;&nbsp; <br />使用游标不停的遍历orderid<br />create procedure CursorIntoProcedure<br />@pname varchar(8000) <br />output<br />as<br />--定义游标<br />declare cur cursor for select orderid from <br />orders<br />--定义一个变量来接收游标的值<br />declare @v varchar(5)<br />--打开游标<br />open cur<br />set <br />@pname=''--给@pname初值<br />--提取游标的值<br />fetch next from cur into @v<br />while <br />@@fetch_status=0<br />&nbsp;&nbsp; begin</p><br /><p><br />set @pname=@pname+';'+@v<br />&nbsp;&nbsp; fetch next from cur into <br />@v<br />end<br />print @pname<br />--关闭游标<br />close cur<br />--销毁游标<br />deallocate cur</p><br /><p> </p><br /><p>&nbsp;&nbsp; ------------执行存储过程--------------<br />exec CursorIntoProcedure ''</p><br /><p><br />&nbsp;&nbsp; --------------JAVA调用------------------<br />import java.sql.*;<br />public <br />class ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");<br />&nbsp;&nbsp; <br />CallableStatement c=conn.prepareCall("{call CursorIntoProcedure(?)}");<br />&nbsp; <br /><br />&nbsp; <br />&nbsp;&nbsp; c.registerOutParameter(1,java.sql.Types.VARCHAR);<br />&nbsp; <br />&nbsp;&nbsp; <br />c.execute();<br />&nbsp; <br />&nbsp;&nbsp; System.out.println (c.getString(1));<br />&nbsp;&nbsp; <br />conn.close();<br />}<br />}<br />&nbsp;&nbsp; C:删除数据的存储过程<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />------------------存储过程--------------------------</p><br /><p><br />drop table 学生基本信息表<br />create table 学生基本信息表<br />(<br />StuID int primary <br />key,<br />StuName varchar(10),<br />StuAddress varchar(20)<br />)<br />insert into&nbsp;&nbsp; <br />学生基本信息表 values(1,'三毛','wuhan')<br />insert into&nbsp;&nbsp; 学生基本信息表 <br />values(2,'三毛','wuhan')<br />create table 学生成绩表<br />(<br />StuID int,<br />Chinese <br />int,<br />PyhSics int<br />foreign key(StuID) references&nbsp;&nbsp; 学生基本信息表(StuID)<br />on <br />delete cascade<br />on update cascade<br />) <br />insert into&nbsp;&nbsp; 学生成绩表 <br />values(1,99,100)<br />insert into&nbsp;&nbsp; 学生成绩表 values(2,99,100)</p><br /><p><br />--创建存储过程 <br />create procedure delePro<br />@StuID int<br />as<br />delete from <br />学生基本信息表 where StuID=@StuID<br />--创建完毕<br />exec delePro 1&nbsp;&nbsp; <br />--执行存储过程<br />--创建存储过程<br />create procedure selePro<br />as<br />select * from <br />学生基本信息表<br />--创建完毕<br />exec selePro&nbsp;&nbsp; --执行存储过程<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />------------------在JAVA中调用----------------<br />import java.sql.*;<br />public class <br />ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call delePro(?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setInt(1,1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c=conn.prepareCall("{call selePro}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet <br />rs=c.executeQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String Stu=rs.getString("StuID");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />name=rs.getString("StuName");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />add=rs.getString("StuAddress");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println <br />("学号:"+"&nbsp;&nbsp;&nbsp;&nbsp; "+"姓名:"+"&nbsp;&nbsp;&nbsp;&nbsp; "+"地址");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println (Stu+"&nbsp;&nbsp;&nbsp;&nbsp; <br />"+name+"&nbsp;&nbsp; "+add);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.close();<br />}<br />}<br />&nbsp;&nbsp; <br />D:修改数据的存储过程<br />---------------------创建存储过程---------------------<br />&nbsp;&nbsp; create <br />procedure ModPro<br />@StuID int,<br />@StuName varchar(10)<br />as<br />update 学生基本信息表 <br />set StuName=@StuName where StuID=@StuID</p><br /><p> </p><br /><p>&nbsp;&nbsp; -------------执行存储过程-------------------------<br />exec ModPro 2,'四毛'<br />&nbsp;&nbsp; <br />---------------JAVA调用存储过程--------------------<br />import java.sql.*;<br />public <br />class ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call ModPro(?,?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setInt(1,2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setString(2,"美女");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=conn.prepareCall("{call <br />selePro}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs=c.executeQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />while(rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />Stu=rs.getString("StuID");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />name=rs.getString("StuName");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />add=rs.getString("StuAddress");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println <br />("学号:"+"&nbsp;&nbsp;&nbsp;&nbsp; "+"姓名:"+"&nbsp;&nbsp;&nbsp;&nbsp; "+"地址");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println (Stu+"&nbsp;&nbsp;&nbsp;&nbsp; <br />"+name+"&nbsp;&nbsp; "+add);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.close();<br />}<br />}<br />&nbsp;&nbsp; <br />E:查询数据的存储过程(模糊查询)<br />&nbsp;&nbsp;&nbsp;&nbsp; -----------------存储过程---------------------<br />create <br />procedure FindCusts<br />@cust varchar(10)<br />as<br />select customerid from orders <br />where customerid <br />like '%'+@cust+'%'<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />---------------执行---------------------------<br />execute FindCusts 'alfki'<br />&nbsp;&nbsp; <br />-------------在JAVA中调用--------------------------<br />import java.sql.*;<br />public <br />class ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call FindCusts(?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setString(1,"Tom");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet <br />rs=c.executeQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String cust=rs.getString("customerid");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />System.out.println (cust);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.close();<br />}<br />}<br />&nbsp;&nbsp; <br />F:增加数据的存储过程</p><br /><p><br />------------存储过程--------------------<br />create procedure <br />InsertPro<br />@StuID int,<br />@StuName varchar(10),<br />@StuAddress <br />varchar(20)<br />as<br />insert into 学生基本信息表 values(@StuID,@StuName,@StuAddress)</p><br /><p><br />-----------调用存储过程---------------<br />exec InsertPro <br />5,'555','555'<br />-----------在JAVA中执行-------------<br />import <br />java.sql.*;<br />public class ProcedureTest <br />{<br />public static void <br />main(String args[]) throws Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; <br />DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; <br />//获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");</p><br /><p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建存储过程的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CallableStatement <br />c=conn.prepareCall("{call InsertPro(?,?,?)}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setInt(1,6);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setString(2,"Liu");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.setString(3,"wuhan");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.execute();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=conn.prepareCall("{call selePro}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet <br />rs=c.executeQuery();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String stuid=rs.getString("StuID");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />name=rs.getString("StuName");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String <br />address=rs.getString("StuAddress");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println <br />(stuid+"&nbsp;&nbsp; "+name+"&nbsp;&nbsp; "+address);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />c.close();<br />}<br />}</p><br /><p><br />G:在JAVA中创建存储过程&nbsp;&nbsp; 并且在JAVA中直接调用<br />import java.sql.*;<br />public class <br />ProcedureTest <br />{<br />public static void main(String args[]) throws <br />Exception<br />{<br />&nbsp;&nbsp; //加载驱动<br />&nbsp;&nbsp; DriverManager.registerDriver(new <br />sun.jdbc.odbc.JdbcOdbcDriver());<br />&nbsp;&nbsp; //获得连接<br />&nbsp;&nbsp; Connection <br />conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");<br />&nbsp; <br />&nbsp; <br />&nbsp;&nbsp; <br />Statement stmt=conn.createStatement();<br />&nbsp;&nbsp; //在JAVA中创建存储过程<br />&nbsp;&nbsp; <br />stmt.executeUpdate("create procedure OOP as select * from 学生成绩表");<br />&nbsp; <br />&nbsp; <br /><br />&nbsp;&nbsp; CallableStatement c=conn.prepareCall("{call OOP}");<br />&nbsp; <br />&nbsp;&nbsp; ResultSet <br />rs=c.executeQuery();<br />&nbsp;&nbsp; while(rs.next())<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp; String <br />chinese=rs.getString("Chinese");<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; System.out.println <br />(chinese);<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp; conn.close();<br />&nbsp; <br />}<br />} <br /></p></div><img src ="http://www.blogjava.net/ProgramerNi/aggbug/370755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ProgramerNi/" target="_blank">ProgramerNi</a> 2012-02-25 10:10 <a href="http://www.blogjava.net/ProgramerNi/articles/370755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE 执行定时任务</title><link>http://www.blogjava.net/ProgramerNi/articles/370707.html</link><dc:creator>ProgramerNi</dc:creator><author>ProgramerNi</author><pubDate>Fri, 24 Feb 2012 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/ProgramerNi/articles/370707.html</guid><wfw:comment>http://www.blogjava.net/ProgramerNi/comments/370707.html</wfw:comment><comments>http://www.blogjava.net/ProgramerNi/articles/370707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ProgramerNi/comments/commentRss/370707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ProgramerNi/services/trackbacks/370707.html</trackback:ping><description><![CDATA[		
		<p><span style="font-family:Arial;font-size:14px">Tomcat 下Web项目的定时任务</span></p><p><span style="font-family:Arial;font-size:14px">监听器类:</span><br><strong><span style="font-family:Arial;color:#1f7099;font-size:14px">SysContextListener.java</span></strong></p><p><strong><span style="font-family:Arial;color:#1f7099;font-size:14px"></span></strong><br><span style="font-family:Arial;font-size:14px">package axtic.servlet;</span><br><span style="font-family:Arial;font-size:14px">import java.util.Timer;//定时器类</span><br><span style="font-family:Arial;font-size:14px">import axtic.bean.exportHistoryBean;</span><br><span style="font-family:Arial;font-size:14px">import javax.servlet.ServletContextEvent;</span><br><span style="font-family:Arial;font-size:14px">import javax.servlet.ServletContextListener;</span><br><span style="font-family:Arial;font-size:14px">public class SysContextListener implements ServletContextListener</span><br><span style="font-family:Arial;font-size:14px">{</span><br><span style="font-family:Arial;font-size:14px">private Timer timer = null;</span><br><span style="font-family:Arial;font-size:14px">public void contextInitialized(ServletContextEvent event)</span><br><span style="font-family:Arial;font-size:14px">{//在这里初始化监听器，在tomcat启动的时候监听器启动，可以在这里实现定时器功能</span><br><span style="font-family:Arial;font-size:14px">timer = new Timer(true);</span><br><span style="font-family:Arial;font-size:14px">event.getServletContext().log(&quot;定时器已启动&quot;);//添加日志，可在tomcat日志中查看到</span><br><span style="font-family:Arial;font-size:14px">timer.schedule(new exportHistoryBean(event.getServletContext()),0,5*1000);//调用exportHistoryBean，0表示任务无延迟，5*1000表示每隔5秒执行任务，60*60*1000表示一个小时。</span><br><span style="font-family:Arial;font-size:14px">event.getServletContext().log(&quot;已经添加任务&quot;);</span><br><span style="font-family:Arial;font-size:14px">}</span><br><span style="font-family:Arial;font-size:14px">public void contextDestroyed(ServletContextEvent event)</span><br><span style="font-family:Arial;font-size:14px">{//在这里关闭监听器，所以在这里销毁定时器。</span><br><span style="font-family:Arial;font-size:14px">timer.cancel();</span><br><span style="font-family:Arial;font-size:14px">event.getServletContext().log(&quot;定时器销毁&quot;);</span><br><span style="font-family:Arial;font-size:14px">}</span><br><span style="font-family:Arial;font-size:14px">}</span><br><br><br><span style="font-family:Arial;font-size:14px">接下来可以编写自己的功能类，此类一定要extends定时器类中TimerTask</span></p><p><span style="font-family:Arial;font-size:14px">功能类:</span><br><strong><span style="font-family:Arial;color:#1f7099;font-size:14px">exportHistoryBean.java</span><br></strong><br><span style="font-family:Arial;font-size:14px">package axtic.bean;</span><br><span style="font-family:Arial;font-size:14px">import java.util.Calendar;</span><br><span style="font-family:Arial;font-size:14px">import java.util.TimerTask;</span><br><span style="font-family:Arial;font-size:14px">import javax.servlet.ServletContext;</span><br><span style="font-family:Arial;font-size:14px">public class exportHistoryBean extends TimerTask</span><br><span style="font-family:Arial;font-size:14px">{</span><br><span style="font-family:Arial;font-size:14px">private static final int C_SCHEDULE_HOUR = 0;</span><br><span style="font-family:Arial;font-size:14px">private static boolean isRunning = false;</span><br><span style="font-family:Arial;font-size:14px">private ServletContext context = null;</span><br><span style="font-family:Arial;font-size:14px">public exportHistoryBean(ServletContext context)</span><br><span style="font-family:Arial;font-size:14px">{</span><br><span style="font-family:Arial;font-size:14px">this.context = context;</span><br><span style="font-family:Arial;font-size:14px">}</span><br><br><span style="font-family:Arial;font-size:14px">public void run()</span><br><span style="font-family:Arial;font-size:14px">{</span><br><span style="font-family:Arial;font-size:14px">Calendar c = Calendar.getInstance();</span><br><span style="font-family:Arial;font-size:14px">if(!isRunning)</span><br><span style="font-family:Arial;font-size:14px">{</span><br><span style="font-family:Arial;font-size:14px">if(C_SCHEDULE_HOUR == c.get(Calendar.HOUR_OF_DAY))</span><br><span style="font-family:Arial;font-size:14px">{</span><br><span style="font-family:Arial;font-size:14px">isRunning = true;</span><br><span style="font-family:Arial;font-size:14px">context.log(&quot;开始执行指定任务&quot;);</span><br><span style="font-family:Arial;font-size:14px">//-------------------开始保存当日历史记录</span><br><br><br><br><span style="font-family:Arial;font-size:14px">//在这里编写自己的功能，例：</span><br><span style="font-family:Arial;font-size:14px">//File file = new File(&quot;temp&quot;);</span><br><span style="font-family:Arial;font-size:14px">//file.mkdir();</span><br><span style="font-family:Arial;font-size:14px">//启动tomcat，可以发现在tomcat根目录下，会自动创建temp文件夹</span><br><br><span style="font-family:Arial;font-size:14px">//-------------------结束</span><br><span style="font-family:Arial;font-size:14px">isRunning = false;</span><br><span style="font-family:Arial;font-size:14px">context.log(&quot;指定任务执行结束&quot;);</span><br><span style="font-family:Arial;font-size:14px">}</span><br><span style="font-family:Arial;font-size:14px">else</span><br><span style="font-family:Arial;font-size:14px">{</span><br><span style="font-family:Arial;font-size:14px">context.log(&quot;上一次任务执行还未结束&quot;);</span><br><span style="font-family:Arial;font-size:14px">}</span><br><span style="font-family:Arial;font-size:14px">}</span><br><span style="font-family:Arial;font-size:14px">}</span><br><span style="font-family:Arial;font-size:14px">}</span></p><p><span style="font-family:Arial;font-size:14px">记的在web.xml中添加<strong>listener</strong>的信息</span></p><p><strong><strong><span style="font-family:Arial;color:#1f7099;font-size:14px">web.xml</span><br></strong><span style="font-family:Arial;font-size:14px">&lt;web-app&gt;</span><br></strong><strong><span style="font-family:Arial;color:#1f7099;font-size:14px">&lt;listener&gt;</span><br><span style="font-family:Arial;color:#1f7099;font-size:14px">&lt;listener-class&gt;</span><br><span style="font-family:Arial;color:#1f7099;font-size:14px">com.listeners.MyContextListener</span><br><span style="font-family:Arial;color:#1f7099;font-size:14px">&lt;/listener-class&gt;</span><br><span style="font-family:Arial;color:#1f7099;font-size:14px">&lt;/listener&gt;</span><br><span style="font-family:Arial;font-size:14px">&lt;servlet/&gt;</span><br><span style="font-family:Arial;font-size:14px">&lt;servlet-mapping/&gt;</span><br><span style="font-family:Arial;font-size:14px">&lt;/web-app&gt;</span></strong></p><p><strong><span style="font-family:Arial;font-size:14px"></span></strong><strong><br><span style="font-family:Arial;color:#1f7099;font-size:14px"><strong>以上就能够实现Web项目的定时任务了,下面是另一位牛人的实际应用及加强:</strong></span><br></strong><span style="font-family:Arial;font-size:14px">Servlet侦听器结合Java定时器实现任务计划调度</span><br><span style="font-family:Arial;font-size:14px">好多朋友用过Windows的任务计划，也有不少程序迷自己曾写过时钟报警、系统自动关机等趣味程序，可却很少有朋友在Web工程中实现过类似功能。今天有空把笔者先前曾在Tomcat上实现的类似功能，搬出来与大家共享。</span><br><span style="font-family:Arial;font-size:14px">早在几年前，我公司跟某市财政局合作项目开发，为加强财政局对所属单位财务状况的有效监管，开发、实施了财政局数据中心项目。此项目采用B/S加C/S混合结构模式。财政局Web服务器上架设数据同步接收装置，由市属单位每天下班前把财务信息通过HTTP协议上传至财政局中心服务器，与Web服务器上的接收装置对接。财政局内部各部门需要查阅大量财务信息，获取完备的市属单位当前财务状况信息，各部门按职能划分，需要准确的获取各部门各自所关注的汇总信息，以财政报表的形式提供。</span><br><span style="font-family:Arial;font-size:14px">因财政数据量大，实时计算财政报表速度较慢，当初就考虑用报表缓存来减轻服务器的负担，但用缓存需要一个合理的缓存更新机制。考虑到各市属单位每天下班前才把财务数据上传，财政局每天所查看到的财务信息其实并不包括当天（除非有某位领导等到所属单位全部上传完之后才来查看信息，应该已经下班了），所以要是能实现任务计划调度，在每晚深夜把当天及历史财务信息汇总，更新缓存，速度瓶颈不就解决了吗。</span><br><span style="font-family:Arial;font-size:14px">当时由于系统核心是基于Web部署的，报表计算引擎也相应的部署在Tomcat容器上，因此如果想要借用Windows的任务计划来实现定时计算，就需要额外编写普通桌面应用程序接口，稍显复杂。于是就琢磨着想在Web上实现，经过查阅较多相关资料，发现Java定时器（java.util.Timer）有定时触发计划任务的功能，通过配置定时器的间隔时间，在某一间隔时间段之后会自动有规律的调用预先所安排的计划任务（java.util.TimerTask）。另外，由于我们希望当Web工程启动时，定时器能自动开始计时，在整个Web工程的生命期里，定时器能在每晚深夜触发一次报表计算引擎。因此定时器的存放位置也值得考查，不能简单的存在于单个Servlet或JavaBean中，必须能让定时器宿主的存活期为整个Web工程生命期，在工程启动时能自动加载运行。结合这两点，跟Servlet上下文有关的侦听器就最合适不过了，通过在工程的配置文件中加以合理配置，会在工程启动时自动运行，并在整个工程生命期中处于监听状态。</span><br><span style="font-family:Arial;font-size:14px">下面就Servlet侦听器结合Java定时器来讲述整个实现过程。要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口，同时实现它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数。考虑定时器有个建立和销毁的过程，看了前面两个接口函数，就不容置疑的把建立的过程置入contextInitialized，把销毁的过程置入contextDestroyed了。</span><br><span style="font-family:Arial;font-size:14px">我把ServletContextListener的实现类取名为ContextListener,在其内添加一个定时器，示例代码如下所示（为考虑篇幅，仅提供部分代码供读者参考）：</span><br><br><br><span style="font-family:Arial;font-size:14px">private java.util.Timer timer = null;</span><br><span style="font-family:Arial;font-size:14px">public void contextInitialized(ServletContextEvent event) {</span><br><span style="font-family:Arial;font-size:14px">timer = new java.util.Timer(true);</span><br><span style="font-family:Arial;font-size:14px">event.getServletContext().log(&quot;定时器已启动&quot;);</span><br><span style="font-family:Arial;font-size:14px">timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000);</span><br><span style="font-family:Arial;font-size:14px">event.getServletContext().log(&quot;已经添加任务调度表&quot;);</span><br><span style="font-family:Arial;font-size:14px">}</span><br><span style="font-family:Arial;font-size:14px">public void contextDestroyed(ServletContextEvent event) {</span><br><span style="font-family:Arial;font-size:14px">timer.cancel();</span><br><span style="font-family:Arial;font-size:14px">event.getServletContext().log(&quot;定时器销毁&quot;);</span><br><span style="font-family:Arial;font-size:14px">}</span><br><br><span style="font-family:Arial;font-size:14px">以上代码中, timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000)这一行为定时器调度语句，其中MyTask是自定义需要被调度的执行任务（在我的财政数据中心项目中就是报表计算引擎入口），从java.util.TimerTask继承，下面会重点讲述，第三个参数表示每小时(即60*60*1000毫秒)被触发一次，中间参数0表示无延迟。其它代码相当简单，不再详细说明。</span><br><span style="font-family:Arial;font-size:14px">下面介绍MyTask的实现，上面的代码中看到了在构造MyTask时，传入了javax.servlet.ServletContext类型参数,是为记录Servlet日志方便而传入，因此需要重载MyTask的构造函数（其父类java.util.TimerTask原构造函数是没有参数的）。在timer.schedule()的调度中,设置了每小时调度一次,因此如果想实现调度任务每24小时被执行一次，还需要判断一下时钟点，以常量C_SCHEDULE_HOUR表示(晚上12点，也即0点)。同时为防止24小时执行下来，任务还未执行完（当然，一般任务是没有这么长的），避免第二次又被调度以引起执行冲突，设置了当前是否正在执行的状态标志isRunning。示例代码如下所示：</span><br><br><br><span style="font-family:Arial;font-size:14px">private static final int C_SCHEDULE_HOUR = 0;</span><br><span style="font-family:Arial;font-size:14px">private static boolean isRunning = false;</span><br><span style="font-family:Arial;font-size:14px">private ServletContext context = null;</span><br><span style="font-family:Arial;font-size:14px">public MyTask(ServletContext context) {</span><br><span style="font-family:Arial;font-size:14px">this.context = context;</span><br><span style="font-family:Arial;font-size:14px">}</span><br><span style="font-family:Arial;font-size:14px">public void run() {</span><br><span style="font-family:Arial;font-size:14px">Calendar cal = Calendar.getInstance();</span><br><span style="font-family:Arial;font-size:14px">if (!isRunning) {</span><br><span style="font-family:Arial;font-size:14px">if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY)) {</span><br><span style="font-family:Arial;font-size:14px">isRunning = true;</span><br><span style="font-family:Arial;font-size:14px">context.log(&quot;开始执行指定任务&quot;);</span><br><br><span style="font-family:Arial;font-size:14px">//TODO 添加自定义的详细任务，以下只是示例</span><br><span style="font-family:Arial;font-size:14px">int i = 0;</span><br><span style="font-family:Arial;font-size:14px">while (i++ &lt; 10) {</span><br><span style="font-family:Arial;font-size:14px">context.log(&quot;已完成任务的&quot; + i + &quot;/&quot; + 10);</span><br><span style="font-family:Arial;font-size:14px">}</span><br><br><span style="font-family:Arial;font-size:14px">isRunning = false;</span><br><span style="font-family:Arial;font-size:14px">context.log(&quot;指定任务执行结束&quot;);</span><br><span style="font-family:Arial;font-size:14px">}</span><br><span style="font-family:Arial;font-size:14px">} else {</span><br><span style="font-family:Arial;font-size:14px">context.log(&quot;上一次任务执行还未结束&quot;);</span><br><span style="font-family:Arial;font-size:14px">}</span><br><span style="font-family:Arial;font-size:14px">}</span><br><br><span style="font-family:Arial;font-size:14px">上面代码中&#8220;//TODO&#8230;&#8230;&#8221;之下四行是真正被调度执行的演示代码(在我的财政数据中心项目中就是报表计算过程)，您可以换成自己希望执行的语句。</span><br><span style="font-family:Arial;font-size:14px">到这儿，ServletContextListener和MyTask的代码都已完整了。最后一步就是把ServletContextListener部署到您的Web工程中去，在您工程的web.xml配置文件中加入如下三行：</span><br><br><span style="font-family:Arial;font-size:14px">com.test.ContextListener</span><br><br><span style="font-family:Arial;font-size:14px">当然，上面的com.test得换成您自己的包名了。保存web.xml文件后，把工程打包部署到Tomcat中即可。任务会在每晚12点至凌晨1点之间被执行，上面的代码会在Tomcat的日志文件中记录如下：</span><br><span style="font-family:Arial;font-size:14px">2003-12-05 0：21：39 开始执行指定任务</span><br><span style="font-family:Arial;font-size:14px">2003-12-05 0：21：39 已完成任务的1/10</span><br><span style="font-family:Arial;font-size:14px">&#8230;&#8230;</span><br><span style="font-family:Arial;font-size:14px">2003-12-05 0：21：39 已完成任务的10/10</span><br><span style="font-family:Arial;font-size:14px">2003-12-05 0：21：39 指定任务执行结束</span><br><br><span style="font-family:Arial;font-size:14px">如何使用ServletContextListener</span><br><span style="font-family:Arial;font-size:14px">ideawu 发表于 2006-06-23 18:20:15 分类: Web 状态: 公众可见 查看: 775 评论: 0</span><br><span style="font-family:Arial;font-size:14px">这个J2EE小提示阐述了ServletContextListener的用法。这个事件类作为Web应用程序的一部分，处理Web应用程序的servlet上下文(context)的变化的通知。这可以解释为，好像有个人在服务器旁不断地通知我们服务器在发生什么事件。那当然需要监听者了。因此，在通知上下文(context)初始化和销毁的时候，ServletContextListner非常有用。</span><br><br><span style="font-family:Arial;font-size:14px">import javax.servlet.ServletContextListener;</span><br><span style="font-family:Arial;font-size:14px">import javax.servlet.ServletContextEvent;</span><br><span style="font-family:Arial;font-size:14px">import javax.servlet.*;</span><br><br><span style="font-family:Arial;font-size:14px">public class MyListener implements ServletContextListener {</span><br><br><span style="font-family:Arial;font-size:14px">private ServletContext context = null;</span><br><br><span style="font-family:Arial;font-size:14px">/* 这个方法在Web应用服务被移除，没有能力再接受请求的时候被调用。</span><br><span style="font-family:Arial;font-size:14px">*/</span><br><span style="font-family:Arial;font-size:14px">public void contextDestroyed(ServletContextEvent event){</span><br><span style="font-family:Arial;font-size:14px">//Output a simple message to the server's console</span><br><span style="font-family:Arial;font-size:14px">System.out.println(&quot;The Simple Web App. Has Been Removed&quot;);</span><br><span style="font-family:Arial;font-size:14px">this.context = null;</span><br><br><span style="font-family:Arial;font-size:14px">}</span><br><br><span style="font-family:Arial;font-size:14px">// 这个方法在Web应用服务做好接受请求的时候被调用。</span><br><span style="font-family:Arial;font-size:14px">public void contextInitialized(ServletContextEvent event){</span><br><span style="font-family:Arial;font-size:14px">this.context = event.getServletContext();</span><br><br><span style="font-family:Arial;font-size:14px">//Output a simple message to the server's console</span><br><span style="font-family:Arial;font-size:14px">System.out.println(&quot;The Simple Web App. Is Ready&quot;);</span><br><br><span style="font-family:Arial;font-size:14px">}</span><br><span style="font-family:Arial;font-size:14px">}</span><br><strong><span style="font-family:Arial;color:#1f7099;font-size:14px">web.xml</span><br></strong><span style="font-family:Arial;font-size:14px">&lt;web-app&gt;</span><br><span style="font-family:Arial;font-size:14px">&lt;listener&gt;</span><br><span style="font-family:Arial;font-size:14px">&lt;listener-class&gt;</span><br><span style="font-family:Arial;font-size:14px">com.listeners.MyContextListener</span><br><span style="font-family:Arial;font-size:14px">&lt;/listener-class&gt;</span><br><span style="font-family:Arial;font-size:14px">&lt;/listener&gt;</span><br><span style="font-family:Arial;font-size:14px">&lt;servlet/&gt;</span><br><span style="font-family:Arial;font-size:14px">&lt;servlet-mapping/&gt;</span><br><span style="font-family:Arial;font-size:14px">&lt;/web-app&gt;</span><br></p> <a href="http://hi.baidu.com/ns1990love/blog/item/0457971cdffda7e5ae5133ae.html">阅读全文</a>
		
		<br><b>类别：</b><a href="http://hi.baidu.com/ns1990love/blog/category/Java">Java</a>&#160;<a href="http://hi.baidu.com/ns1990love/blog/item/0457971cdffda7e5ae5133ae.html#comment">查看评论</a> <img src ="http://www.blogjava.net/ProgramerNi/aggbug/370707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ProgramerNi/" target="_blank">ProgramerNi</a> 2012-02-24 17:34 <a href="http://www.blogjava.net/ProgramerNi/articles/370707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java异常处理思路</title><link>http://www.blogjava.net/ProgramerNi/articles/370708.html</link><dc:creator>ProgramerNi</dc:creator><author>ProgramerNi</author><pubDate>Thu, 23 Feb 2012 18:30:00 GMT</pubDate><guid>http://www.blogjava.net/ProgramerNi/articles/370708.html</guid><wfw:comment>http://www.blogjava.net/ProgramerNi/comments/370708.html</wfw:comment><comments>http://www.blogjava.net/ProgramerNi/articles/370708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ProgramerNi/comments/commentRss/370708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ProgramerNi/services/trackbacks/370708.html</trackback:ping><description><![CDATA[		
		<p>1.异常处理相对于返回错误代码的一个最大优点在于，异常可以被自动传递，这样，在编程时异常更加难以被忽视。</p><p>2.通常，只在最上层(一般是UI层)捕捉异常。如果要在其它层捕捉异常，除非是下列情况之一：<br>&#160;(1)能够处理该异常，或者<br>&#160;(2)能够忽略该异常，或者<br>&#160;(3)需要转换该异常为其它特定异常后抛出新异常</p><p>3.UI层捕获异常后，可以<br>&#160;(1)将无关紧要的异常忽略。<br>&#160;(2)将异常转换为错误信息展现给用户。<br>&#160;(3)如果是重大异常，可以考虑终止应用程序。</p><p>4.最上层(一般是UI层)不得抛出新的异常；最上层需要捕捉所有异常，否则异常会直接导致程序终止，这将是非常不好的用户体验。</p><p>5.可以在非最上层抛出自定义异常。如果是自定义异常，请保证其是可序列化的，并且保证其实现了Exception的三个构造函数。</p><p>6.异常的抛出与截获需要很多的cpu时间，请谨慎的使用异常。</p><p>7.在可能抛出异常的地方，如果需要，请确保使用finally进行资源清理，而无论此处是否捕捉了异常。</p><p>8.在一个catch块中的代码都应该至少部分地处理了所捕捉的异常。否则，就不要使用catch块。</p><p>9.从构造函数中抛出异常。<br>&#160; 因为构造函数没有返回值，所以没有简单的方法来想构造函数的调用者发出构造失败的信号，这时便可以通过抛出异常来做到。比如构造参数与指定条件不符时，就抛出一个异常。&#160; </p><p>10.在以上前提的保证下，可以在非最上层使用AOP截获(intercept)异常而进行日志记录，这样通过日志记录，我们可以了解系统的&#160; 运行状态。在软件实现中，异常和日志都是重要的质量保证手段，异常和日志总是同时出现的。<br>&#160; 可以说，异常是日志记录的重要/主要组成部分。<br></p> <a href="http://hi.baidu.com/ns1990love/blog/item/548ef6c4d6e5524ab219a8d0.html">阅读全文</a>
		
		<br><b>类别：</b><a href="http://hi.baidu.com/ns1990love/blog/category/Java">Java</a>&#160;<a href="http://hi.baidu.com/ns1990love/blog/item/548ef6c4d6e5524ab219a8d0.html#comment">查看评论</a> <img src ="http://www.blogjava.net/ProgramerNi/aggbug/370708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ProgramerNi/" target="_blank">ProgramerNi</a> 2012-02-24 02:30 <a href="http://www.blogjava.net/ProgramerNi/articles/370708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>