Java中用 PreparedStatement语句查询 Oracle数据库没有结果?而如果直接使用 Statement语句查询却有结果集,怎么回事
第一种:不用占位符,
java.sql.PreparedStatement ps = connection().prepareStatement("select * from test where name='hello'");
java.sql.ResultSet rs = ps.executeQuery();
java.sql.PreparedStatement ps = connection().prepareStatement("select * from test where name='hello'");
java.sql.ResultSet rs = ps.executeQuery();
记录集rs有数据;
第二种:使用占位符,
java.sql.PreparedStatement ps = connection().prepareStatement("select * from test where name=?");
String str="hello";
ps.setString(1,str );
java.sql.ResultSet rs = ps.executeQuery();
记录集rs中无任何数据。
首先需要注意的是:Oracle数据库本身有一个数据类型是NCHAR(50) ,对于输入的字符串参数长度如果达不到数据库定义的长度,使用PrepareStatement 则会出现无效,比如:上面的例子中如果 name 字段的长度设定为
NCHAR(20) 那么如果传入参数值为 "hello" 则无效,需要自动转化成相应的长度才能预编译成功。
可以使用下列函数来解决:将要传入的参数先通过该函数
public
static
String convert2Nchar(String
originString
,
int
length
) {
StringBuffer
stringBuffer
=
new
StringBuffer(
originString
);
int
size
=
originString
.length();
if
(
size
<
length
) {
for
(
int
i
=1;
i
<=
length
-
size
;
i
++){
stringBuffer
.append(
" "
);
}
originString
=
stringBuffer
.toString();
}
return
originString
;
}
str=
convert2Nchar(str
,20
);
ps.setString(1,str );
java.sql.ResultSet rs = ps.executeQuery();
成功返回记录集rs有数据;