JDK6笔记(5)----JDBC4(3)

本文介绍了JDBC4中预编译语句的IN参数映射问题及解决方案,并详细讲解了CallableStatement接口的使用方法,包括如何执行存储过程以及处理IN、OUT参数。

JDK6笔记(5)----JDBC4(3)


1、预准备语句的IN参数的pitfall
当你用setter方法向IN参数传递值时要注意一些问题。
不管在任何时候,设置参数并执行预准备语句对象,JDBC驱动器会把Java类型转换成DBMS所能理解的JDBC类型。
两者的对应关系如下:
Java Object/Type ----> JDBC Type
Int ----> INTEGER
Short ----> SMALLINT
Byte ----> TINYINT
Long ----> BIGINT
Float ----> REAL
Double ----> DOUBLE
java.math.BigDecimal ----> NUMERIC
Boolean ----> BOOLEAN or BIT
String ----> CHAR, VARCHAR, or LONGVARCHAR
Clob ----> CLOB
Blob ----> BLOB
Stuct ----> STRUCT
Ref ----> REF
java.sql.Date ----> DATE
java.sql.Time ----> TIME
java.sql.Timestamp ----> TIMESTAMP
java.net.URL ----> DATALINK
Array ----> ARRAY
byte[] ----> BINARY, VARBINARY, or LONGVARBINARY
Java class ----> JAVA_OBJECT
2、用setObject来指定JDBC类型
使用PrepredStatement.setObject()方法可以避免使用IN参数的潜在的映射陷阱(mapping pitfall)。
void setObject(int paramIndex, object x, int targetSqlType);
setObject()方法允许你传递一个Java对象并指定JDBC目标的类型。如下:
PreparedStatement psStatement=cConn.prepareStatement("SELECT * FROM PLAYERS WHERE TEAM=?");
//Set the IN parameter to Titans using setObject
psStatement.setObject(1,"Titans",java.sql.Types.VARCHAR);
//Execute the statement
ResultSet rsResults=psStatement.executeQuery();
//Clear parameters
psStatement.clearParameters();
注意:即使你要发送一个NULL值到DBMS,你也必须指定相应的JDBC的类型。
3、CallableStatement接口
有时你会遇到这样的情况,你需要在RDBMS(Remote Database Management System)上执行存储过程。
CallableStatement提供了一个标准方式来解决上述情况。
1) SQL escape syntax
SQL escape syntax支持两种形式的存储过程:
1.1) 包含结果参数(即OUT参数)的情况;
1.2) 不包含OUT参数的情况。
这两种情况都含IN参数。
CallableStatement接口是从PreparedStatement扩展的,因此它继承了PreparedStatement接口的所有方法。并在其上扩展了OUT参数。
OUT参数的处理是不同的,它们必须在CallableStatement对象执行前进行注册。要注册OUT参数,需用到CallableStatement对象的registerOutParameter方法。该方法是用JDBC类型来注册OUT参数。如下的形式:
void registerOutParameter(int paramIndex, int sqlType)throws SQLException;
看下面的代码:
CallableStatement使用IN参数:
CallableStatement cStatement=cConn.prepareCall("{CALL setPlayerName(?)}");
cStatement.setString("Michael Scofield");
cStatement.execute();
CallableStatement使用OUT参数:
CallableStatement cStatement=cConn.prepareCall("{CALL getPlayerName(?)}");
cStatement.registerOutParameter(1,java.sql.Types.STRING);
cStatement.execute();
//Retrieve Player's name
String sName=cStatement.getString(1);
CallableStatement使用inout参数:
CallableStatement cStatement=cConn.prepareCall("{CALL getandsetPlayersName(?)}");
cStatement.setString("Michael Scofield");
cStatement.registerOutParameter(1,java.sql.Types.STRING);
cStatement.execute();
//Retrieve Player's name
String sName=cStatement.getString(1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值