PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
简单这样就可以:
String column = request.getParameter("selectM");
String StrQuery = "SELECT COLUMN_C FROM TABLEEC where TABLENAME_E ='DAILY_TB' and COLUMN_E = '" + column.toUpperCase() +"'";复杂的给你贴一段教程,都是我辛苦打字打出来的呀!
(并非问你要分,答不对就别给我分。做人要堂堂正正)
1。创建PreparedStatement对象,包含带两个IN参数占位符的SQL语句
<%PreparedStatement pstmt = con.prepareStatement("Update table set m=? where x=?");%>
2。传递IN参数
在执行PreparedStatement对象之前,必须设置每个"?"参数的值。可以通过set*方法来完成,其中*是与该参数相应的类型。
例如:如果参数具有Java类型long,则使用的方法就是setLong。set方法的第一个参数是要设置的参数的序列位置,第二个参数是设置给参数的值
pstmt.setLong(1,123456789);
pstmt.setLong(1,100000000);
一旦设置了给定语句的参数,就可以用它执行多次该语句,直到调用clearParameters方法清除它为止。
在默认模式下(启动自动提交),当语句完成时将自动提交或还原该语句。
如果基本数据库和驱动程序在语句提交之后仍保持这些语句的打开状态,则同一个PreparedStatement可执行多次。例如:
pstmt.setString(1, "Hi");
for (int i=0; i<10; i++) {
pstmt.setInt(2, i);
int rowCount = pstmt.executeUpdate();
}
3。IN参数中数据类型的一致性
程序员的责任是确保将每个IN参数的Java类型映射为与数据库所需的JDBC数据类型兼容的JDBC类型。
4。setObject方法
程序员使用setObject方法显式地将输入参数转换为特定地JDBC类型。该方法可以接收第三个参数,用来指定目标JDBC类型。
如果没有指定JDBC类型,驱动程序就会将JavaObject映射到其默认的JDBC类型,然后将它发送到数据库。这与常规的set*方法类似。
5。将JDBC NULL作为IN参数发送
setNull方法允许程序员将JDBCNULL值作为IN参数发送给数据库。
6。发送较大的IN参数
setBytes和setString方法能够发送无限量的数据。
JDBC提供了三种将IN参数设置为输入流的方法:setBinaryStream用于含有未说明字节的流,setAsciiStream用于含有ASCII字符的流,而setUnicodeStream用于含有Unicode字符的流。
因为必须指定流的总长度,所以这些方法所采用的参数比其它的set*方法要多一个。
<%
java.io.File file=new java.io.File("/tmp/data");
int fileLength = file.length();
java.io.InputStream fin = new java.io.FileInputStream(file);
java.sql.PreparedStatement pstmt = con.prepareStatement("Update table5 set stuff=? where index=4");
pstmt.setBinaryStream(1, fin, fileLength);
pstmt.executeUpdate();
%>
当语句执行时,将反复调用输入流fin以传递其数据。
CallableStatement对象为所有的DBMS提供了一种以标准形式调用已存储过程的方法。
这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参数,另一种形式不带结果参数。结果参数是一种输出(OUT)参数,是已存储过程的返回值。两种形式都可带有数量可变的输入(IN参数)、输出(OUT参数)或输入和输出(INOUT参数)的参数。问号将用作参数的占位符。
JDBC中调用已存储过程的语法如下:
{call 过程名[(?,?,...)]}
{?=call 过程名[(?,?,...)]} // 返回结果参数的过程
{call 过程名} // 不带参数的已存储过程的语法
如果DBMS支持已存储过程的调用,则supportsStroredProcedures方法将返回true,而getProcedures方法将返回对已存储过程的调用。 创建CallableStatement对象
CallableStatement对象是用Connection方法prepareCall创建的。下例创建CallableStatement的实例,其中含有对已存储过程getTestData调用。
该过程有两个变量,但不含结果参数:
<%CallableStatement cstmt=con.prepareCall("{call getTestData(?,?)}");%>
其中 "?" 占位符为IN、OUT还是INOUT参数,取决于已存储过程getTestData IN和OUT参数
将IN参数传给CallableStatement对象是通过set*方法完成的。该方法继承自PreparedStatement。所传入参数的类型决定了所用的set*方法(例如,用setFloat来传入float值等)
如果已存储过程返回OUT参数,则在执行CallableStatement对象以前必须先注册每个OUT参数的JDBC类型(这是必须的)。注册JDBC类型是用registerOutParameter方法来完成的。语句执行完以后,CallableStatement的get*方法将取回参数值。正确的get*方法是为各参数所注册的JDBC类型所对应的Java类型。registerOutParameter使用的是JDBC类型,而get*将之转换为Java类型。 例如,下述代码先注册OUT参数,执行由cstmt所调用的已存储过程,然后检索在OUT参数中返回的值。方法getByte从第一个OUT参数中取出一个Java字节,getBigDecimal从第二个OUT参数中取出一个BigDecimal对象(带三位小数):
<%
CallableStatement cstmt = con.prepareCall("{call getTestData(?,?)}");
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter(1, java.sql.Types.DECIMAL, 3);
cstmt.executeQuery();
byte x=cstmt.getByte(1);
java.math.BigDecimal n=cstmt.getBigDecimal(2,3);
%>
CallableStatement与ResultSet不同,它不提供用增量方式检索大OUT值的特殊机制 INOUT参数
既支持输入又接受输出的参数(INOUT参数)除了调用registerOutParameter方法外,还要求调用适当的set*方法(该方法是从PreparedStatement继承来的)。set*方法将参数值设置为输入参数,而registerOutParameter方法将它的JDBC类型注册为输出函数。set*方法提供一个Java值,而驱动程序先把这个值转换为JDBC值,然后将它送到数据库中。
这种IN值的JDBC类型和提供给registerOutParameter方法的JDBC类型应该相同。然后,要检索输出值,就要用对应的get*方法。例如,Java类型为byte的参数应该使用方法setByte来输入值。应该给registerOutParameter提供类型为TINYINT的JDBC类型,同时应使用getByte来检索输出值。
例如有一个已存储过程reviseTotal,其唯一参数是INOUT参数。方法setByte把此参数设为25,驱动程序将把它作为JDBCTINYINT类型送到数据库中。接着,registerOutParameter将该参数注册为JDBCTINYINT。执行完该已存储过程后,将返回一个新的JDBCTINYINT值。方法getByte将把这个新值作为Javabyte类型检索。
<%
CallableStatement cstmt = con.prepareCall("{call reviseTotal(?)}");
cstmt.setByte(1, 25);
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.executeUpdate();
byte x=cstmt.getByte(1);
%> 先检索结果,再检索OUT参数
由于某些DBMS的限制,为了实现最大的可移植性,建议先检索由执行CallableStatement对象所产生的结果,然后再用CallableStatement.get*方法来检索OUT参数。
如果CallableStatement对象返回多个Result对象(通过调用execute方法),在检索OUT参数前应先检索所有的结果。在这种情况下,为了确保对所有的结果都进行了访问,必须对Statement方法getResult、getUpdateCount和getMoreResults进行调用,直到不再有结果为止。
检索完所有的结果后,就可用CallableStatement.get*方法来检索OUT参数中的值。 检索作为OUT参数的NULL值
返回到OUT参数中的值可能会是JDBCNULL。将对JDBCNULL值进行转换以使get*方法所返回的值为NULL、0、FALSE,这取决于get*方法类型。
对于ResultSet对象,要知道0或false是否源于JDBCNULL的唯一方法,是用方法wasNull进行检测。如果get*方法读取的最后一个值是JDBCNULL,则该方法返回true,否则返回false。
Statement是否无法实现?
{
tempHeadString = (String)v.element(i);
valueNumber = v2.size();
for(int j = 0;j < valueNumber;j++)
{
tempValueString = (String)v2.elementAt(j);
?stmt.executeUpdate("insert into tablename values(empHeadString,tempValueString)");
}
}