最佳实践:如何通过JDBC检查SQL.DATE中的特定java.util.Calendar/Date?

bl4*_*0l7 4 java sql database jdbc

这是我昨天以来一直在努力的事情.

我有约会保存在数据库中.它们包括日期和时间,如:

01.02.1970 14:00
Run Code Online (Sandbox Code Playgroud)

(德语格式,在美国我觉得它会像02/01/1970 2:00 pm).

第一个想法:将其保存为SQL.DATE!

所以我创建了一个表:

CREATE TABLE appointments (id NUMBER(10) NOT NULL, datum DATE NOT NULL, PRIMARY KEY id)
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

现在我写了一个DAO,保存我通过网络表单输入的约会.之后我想写一个单元测试,检查约会是否正确保存.

相关测试部分如下:

JdbcDao myDao = new JdbcDao();
myDao.setDataSource(jdbcTemplate.getDataSource());      
myDao.saveAppointment(appointmentModel);

// Not needed but I saw, the appointment is saved in the database
setComplete();

// And now for the (sorry for the harsh words) pain in the *** part

String sql = "SELECT id, datum FROM appointments WHERE datum ... // <--
Run Code Online (Sandbox Code Playgroud)

< - :这只是部分,我不知道输入什么,以查看在特定日期数据库中是否已存在日期.

我试过了:

datum = ?
Run Code Online (Sandbox Code Playgroud)

以下的电话

jdbcTemplate.query(sql, args, rowMapper);
Run Code Online (Sandbox Code Playgroud)

在args-array中有一个java.util.Date,一个java.util.Calendar或一个java.lang.String('dd.MM.yyyy'),它保存的参数替换了?在准备好的声明中.

当然,这是一个坏主意,因为数据库有类似的东西

DD.MM.YYYY HH:MI 
Run Code Online (Sandbox Code Playgroud)

在表格行中(DD =天,MM =月,YY =年,HH =小时,MI =分钟).

所以我找到了BETWEEN sql命令,重构(并尝试所有类型的格式,输入,字符串,对象传递args-array)SELECT命令:

String sql = "SELECT id, datum FROM appointments WHERE datum BETWEEN to_date( ?, 'DD.MM.YYYY HH24:MI:SS') AND to_date( ?, 'DD.MM.YYYY HH24:MI:SS')
Run Code Online (Sandbox Code Playgroud)

如果我直接通过sql-tool输入它,就像许多其他尝试一样有效,例如

SELECT * FROM appointments WHERE datum BETWEEN to_date('01.02.1970 00:00:00', 'DD.MM.YYYY HH24:MI:SS') AND to_date('01.02.1970 23:59:59', 'DD.MM.YYYY HH24:MI:SS')
Run Code Online (Sandbox Code Playgroud)

输出例如:

ID                      DATUM                   
----------------------  -------------------
70                      01.02.1970 11:11:11
Run Code Online (Sandbox Code Playgroud)

但我在java中的jdbc调用总是导致一个空的结果集.

长话短说明:

查询数据库的最佳做法是,如果由数据库的sql.DATE列中存在的日期(由java对象表示)与给定时间不同?

小智 5

像这样的东西:

PreparedStatement ps = conn.prepareCall("SELECT * FROM table WHERE someDate = ?");
ps.setDate(1, javaDate)
Run Code Online (Sandbox Code Playgroud)

(从内存中所以语法可能不太正确)

您必须将java.util.Date对象转换为java.sql.Date对象.

这很简单:

java.sql.Date myDate = new java.sql.Date(oldDate.getTime());
Run Code Online (Sandbox Code Playgroud)

oldDatejava.util.Date对象在哪里.