当前位置: 首页 > 图文教程 > Java技术 > Java基础 > JDBC中参数的输入与输出
要实现使用SQL语句的输入与输出参数,必须在PreparedStatement类的对象上进行操作;同时由于CallableStatement类是PrepareStatement类的子类,所以在CallableStatemen对象上的操作也可以使用输入与输出参数;其主要的编程原理是在生成CallableStatement或PreparedStatement类的对象时,可以在SQL语句中指定输入或输出参数,在执行这个SQL语句之前,要对输入参数进行赋值。
(1)使用PreparedStatement类的对象
通过prepareStatement类的对象可以实现在查询语句与数据更新语句方面都可以设置输入参数。
具体的方法是在SQL语句中用“?”标明参数,在执行SQL语句之前,使用setXXX方法给参数赋值,然后使用executeQuery()或executeUpdate()来执行这个SQL语句。每次执行SQL语句之前,可以给参数重新赋值。
setXXX方法用于给相应的输入参数进行赋值,其中XXX是JDBC的数据类型,如:Int、String等。setXXX方法有两个参数,第一个是要赋值的参数在SQL语句中的位置, SQL语句中的第一个参数的位置为1,第二个参数的位置为2;setXXX方法的第二个参数是要传递的值,如100、“Peking”等,随XXX的不同而为不同的类型。
PreparedStatement pstmt=con.prepareStatement("Update TableName set Name=? where ID=?");
pstmt.setString(1,"zhang Hua"); //设置第一个参数(Name)为 “zhang Hua”
for(int i=1;i<3;i++)
{ pstmt.setInt(2,i); //设置第二个参数(ID)为 1,2
pstmt.executeUpdate();
}
要点:最终实现 Update TableName set Name=zhang Hua where ID=1 与Update TableName set Name=zhang Hua where ID=2的效果。
(2)使用CallableStatement对象
如果要求调用数据库的存储过程,要使用CallableStatement对象。另外还有些存储过程要求用户输入参数,这可以在生成CallableStatement对象的存储过程调用语句中设置输入参数。在执行这个存储过程之前使用setXXX方法给参数赋值,然后再执行这个存储过程。
CallableStatement cstmt=con.prepareCall("{call Query(?)}"); //Query为存储过程名
cstmt.setString(1,"输入参数"); //为存储过程提供输入参数
ResultSet rs=cstmt.executeQuery();
(3)接收输出参数
某些存储过程可能会返回输出参数,这时在执行这个存储过程之前,必须使用CallableStatement的registerOutParameter方法首先登记输出参数,在registerOutParameter方法中要给出输出参数的相应位置以及输出参数的SQL数据类型。在执行完存储过程以后,必须使用getXXX方法来获得输出参数的值。并在getXXX方法中要指出获得哪一个输出参数(通过序号来指定)的值。
实例:存储过程getTestData有三个输入参数并返回一个输出参数,类型分别为VARCHAR。在执行完毕后,分别使用getString()方法来获得相应的值。
CallableStatement cstmt = con.prepareCall(“{? = call getTestData (?,?,?)}”);
cstmt.setString(1,Value); //设置输入参数
cstmt.setInt(2,Value);
cstmt.setFloat(3,Value);
cstmt.registerOutParameter(1,java.sql.Types.VARCHAR); //登记输出参数
ResultSet rs = cstmt.executeQuery(); //执行存储过程
rs.getString(1); //获得第一个字段的值
String returnResult=cstmt.getString(1); //获得返回的输出参数的值
要点:由于getXXX方法不对数据类型作任何转换,在registerOutParameter方法中指明数据库将返回的SQL数据类型,在执行完存储过程以后必须采用相应匹配的getXXX方法来获得输出参数的值。
评论 (0) All