在JAVA中怎么调用带参数的存储过程?

Python010

在JAVA中怎么调用带参数的存储过程?,第1张

JDBC调用存储过程: CallableStatement\x0d\x0a在Java里面调用存储过程,写法那是相当的固定:\x0d\x0aClass.forName(....\x0d\x0aConnection conn = DriverManager.getConnection(....\x0d\x0a/**\x0d\x0a*p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替\x0d\x0a*其余地方写法固定\x0d\x0a*/\x0d\x0aCallableStatement cstmt = conn.prepareCall("{call p(?,?,?,?)}")\x0d\x0a/**\x0d\x0a*告诉JDBC,这些个参数,哪些是输出参数,输出参数的类型用java.sql.Types来指定\x0d\x0a*下面的意思是,第3个?和第4个?是输出参数,类型是INTEGER的\x0d\x0a*Types后面具体写什么类型,得看你的存储过程参数怎么定义的\x0d\x0a*/\x0d\x0acstmt.registerOutParameter(3, Types.INTEGER)\x0d\x0acstmt.registerOutParameter(4, Types.INTEGER)\x0d\x0a/**\x0d\x0a*在我这里第1个?和第2个?是输入参数,第3个是输出参数,第4个既输入又输出\x0d\x0a*下面是设置他们的值,第一个设为3,第二个设为4,第4个设置为5\x0d\x0a*没设第3个,因为它是输出参数\x0d\x0a*/\x0d\x0acstmt.setInt(1, 3)\x0d\x0acstmt.setInt(2, 4)\x0d\x0acstmt.setInt(4, 5)\x0d\x0a//执行\x0d\x0acstmt.execute()\x0d\x0a//把第3个参数的值当成int类型拿出来\x0d\x0aint three = cstmt.getInt(3)\x0d\x0aSystem.out.println(three)\x0d\x0a//把第4个参数的值当成int类型拿出来\x0d\x0aint four = cstmt.getInt(4)\x0d\x0aSystem.out.println(four)\x0d\x0a//用完别忘给人家关了,后开的先关\x0d\x0acstmt.close()\x0d\x0aconn.close()\x0d\x0a\x0d\x0aJDBC调用存储过程,掌握这一个程序足够了.\x0d\x0a以下是上面程序使用的存储过程的代码,我用的是Oracle数据库,不过不论是什么数据库,对于你的程序,JDBC这一端写法都是一样的.\x0d\x0a\x0d\x0acreate or replace procedure p\x0d\x0a(v_a in number,v_b number,v_ret out number,v_temp in out number)\x0d\x0ais\x0d\x0abegin\x0d\x0aif(v_a >v_b) then\x0d\x0av_ret := v_a\x0d\x0aelse\x0d\x0av_ret := v_b\x0d\x0aend if\x0d\x0av_temp := v_temp + 1\x0d\x0aend

方法如下:importjava.sql.Connectionimportjava.sql.DriverManagerimportjava.sql.ResultSetimportjava.sql.SQLExceptionimportjava.sql.Statement/***LoadJDBCDriver*最基本的方法通过JDBC连接数据库*@authorJacob**/publicclassLoadByPrimary{publicstaticvoidmain(String[]args)throwsClassNotFoundException{Stringdriver="oracle.jdbc.OracleDriver"Connectioncn=null/***Class.forName手动加载一个类到方法区,Driver类中包含自动注册驱动的静态代码块*会自动在DriverManager中注册驱动*/Class.forName(driver)Stringurl="jdbc:oracle:thin:@localhost:1521:ORACLE"//1521代表端口号,默认的Stringuser="用户名"Stringpwd="密码"try{/**Connection是接口,返回值是一个引用对象,是Oracle驱动提供实现类ojdbc7.jar*使用JDBCAPI接口,实际上是驱动实现类*/cn=DriverManager.getConnection(url,user,pwd)Statementstmt=cn.createStatement()Stringsql="SELECT*FROMstu_empWHEREdeptno=10"ResultSetrs=stmt.executeQuery(sql)while(rs.next()){System.out.println(rs.getInt("empno")+""+rs.getString("ename")+""+rs.getString("job"))}rs.close()stmt.close()}catch(SQLExceptione){e.printStackTrace()}finally{try{if(cn!=null){cn.close()}}catch(SQLExceptione2){e2.printStackTrace()}}}}这是通过preparedstatement实现更新数据,这里我把连接数据库的方法进行了封装,每次直接调用了。publicstaticvoidmain(String[]args){PreparedStatementDemopsd=newPreparedStatementDemo()psd.updateSalary("JACOB",3000)psd.selectSalary("JACOB")}publicvoidupdateSalary(Stringename,doublesal){Stringsql="Updatestu_empsetsal=?Whereename=?"Connectioncn=nullPreparedStatementps=nulltry{cn=DBPUtil.getConnection()ps=cn.prepareStatement(sql)ps.setDouble(1,sal)ps.setString(2,ename)intnum=ps.executeUpdate()System.out.println("提示:总共有"+num+"条数据已经更新!")}catch(SQLExceptione){e.printStackTrace()}finally{DBUtil.stmtClose(ps)DBUtil.connClose(cn)}}publicvoidselectSalary(Stringname){Stringsql="Select*Fromstu_empWhereename=?"Connectioncn=nullPreparedStatementps=nullResultSetrs=nulltry{cn=DBPUtil.getConnection()ps=cn.prepareStatement(sql)ps.setString(1,name)rs=ps.executeQuery()while(rs.next()){System.out.println(rs.getString("ename")+"的工资是:"+rs.getInt("sal"))}}catch(SQLExceptione){e.printStackTrace()}finally{DBUtil.stmtClose(ps)DBUtil.rsClose(rs)DBUtil.connClose(cn)}}}

存储过程。

1、存储过程是已经编译过的,在执行时效率高,Java是最快的语言之一,需要很长时间为VM启动。

2、存储过程还可以在编程语言中调用,如Java、C#等等。存储过程优点:存储过程在服务器端运行,执行速度快,Java正变得越来越快,所以现在也有很多关于Java和C/C++孰快孰慢的争论。