【发布时间】:2015-09-24 15:50:15
【问题描述】:
我正在尝试使用 java 和 jdbc 编写查询并从 oracle db 获取结果。我的问题是,如果我尝试使用语句,则相同的查询有效,但如果我使用preparedStatement,则相同的查询无效。 语句代码:(这里我得到真正的计数值)
Statement stmt = con.createStatement();
String sql = "SELECT COUNT(*) CNT FROM DB.TABLE WHERE DAY = TO_DATE('" + sqlDate + "','YYYY-MM-DD')";
rs = stmt.executeQuery(sql);
PreparedStatement 代码:(这里我得到计数值为零)
Date sqlDate = new java.sql.Date(someJava.Util.Date.getTime());// = 2015-09-24
sqlString = "SELECT COUNT(*) CNT FROM DB.TABLE WHERE DAY = TO_DATE(?,'YYYY-MM-DD')";
pstmt = con.prepareStatement(sqlString);
pstmt.setDate(1, sqlDate);
rs = pstmt.executeQuery();
当我 sysout 时,我的 sqlDate 打印如下:2015-09-24。
我对其他一些查询也有同样的问题。 谁能知道这里有什么问题?
【问题讨论】:
-
为什么要在 执行查询之后分配
sqlString? -
我没有分配它,我只是想告诉你我的 sqlString 值是什么。我
-
@sstan 编辑了我的问题,谢谢
-
因为您应该只使用
java.sql.Date!你觉得PreparedStatement.setDate是干什么用的?? -
@TheGuest 因为当您进行串联查询时,所有变量都会转换为
String,然后您的TO_DATE函数会将其转换回数据库端的DATE。当您使用PreparedStatement时,您传递 typed 数据 - 即您将sqlDate作为DATE传递,因此您不再需要转换。我说双赢。