JDK6笔记(5)----JDBC4(3)
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);