我编写了两个简单的函数来获取 MySQL 表中的日期值。开始日期和结束日期列都是Date
数据类型。所以,在我的这两个函数中,它是这样的:
public Date get_startdate(long nodeid,String ts) {
try {
String sql="Select STARTDT FROM urllink WHERE URL='f0="+nodeid+"&ts="+ts + "'";
if (em == null) {
throw new Exception("could not found URL object.");
}
return (Date) em.createNativeQuery(sql).getSingleResult();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public Date get_enddate(long nodeid,String ts) {
try {
String sql="Select ENDDT FROM urllink WHERE URL='f0="+nodeid+"&ts="+ts + "'";
if (em == null) {
throw new Exception("could not found URL object.");
}
return (Date) em.createNativeQuery(sql).getSingleResult();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
现在我像这样在主页中调用这些函数,我想检查日期条件,如果 URL 位于这两个日期之间,那么它应该有效并执行某些操作。我在下面强调了我的意思:
Date file_getstartdate=fileFacade1.get_startdate(fileID,hash);
Date file_getenddate=fileFacade1.get_enddate(fileID,hash);
String currentDate = CoreUtil.parseDate(new Date());
if( file_getstartdate<= currentDate<= file_getendDate){
//URL is valid, do something
}else {
//do nothing
}
我的表中存储的日期格式为YYYY-MM-DD
,我面临的问题是在上面的if
语句中进行比较。I不能使用这些运算符来进行检查。有没有办法实现我的愿望?
最佳答案
不要使用字符串连接来构造 SQL 查询
这很容易受到 SQL 注入(inject)的攻击,而且非常危险:
String sql="Select STARTDT FROM urllink WHERE URL='f0="+nodeid+"&ts="+ts + "'";
...
return (Date) em.createNativeQuery(sql).getSingleResult();
假设em
指的是 EntityManager对象然后你可以构建一个 Criteria
基于查询,或者如果您确实需要坚持使用 native SQL,那么您应该使用 PreparedStatement相反。
对于您的比较问题,您遇到三个问题:
- 您正在尝试比较两种不同的类型(
String
和Date
)。 - 您尝试使用的运算符只能用于比较基元,而不能用于比较对象 (
<=
)。 - 您将条件编写为数学语句,而不是编程条件语句(
a <= b <= c
不是有效的 Java 语句。它需要是a <= b && b <= c
)。
这是一种使用 Date
进行比较的方法类(请注意,由于 Java 8 LocalDate
是一个更好的类,如果您可以选择的话)。
Date fileStartDate = fileFacade1.get_startdate(fileID, hash);
Date fileEndDate = fileFacade1.get_enddate(fileID, hash);
Date currentDate = new Date();
if (fileStartDate.before(currentDate) && fileEndDate.after(currentDate) {
...
回复您的评论
Okay but does using preparedStatement helps with this SQL inejction. Does entity manager prevent the injection? I was told not to use preparedstatement,are there any other alternatives?
如果有人告诉您使用字符串连接(代码的 +nodeid+
和 +ts +
部分)而不是使用PreparedStatement 进行 native 查询,那么他们就错了。 EntityManager 不会保护您免受上述代码中的注入(inject),但PreparedStatement 以及更改查询的构造方式可以。
PreparedStatement 看起来像这样
String url = "f0=" + nodeid + "&ts=" + ts;
PreparedStatement preparedStatement = connection.prepareStatement("Select STARTDT FROM urllink WHERE URL= ?");
preparedStatement.setString(1, url);
ResultSet resultSet = preparedStatement.executeQuery();
如果您被告知使用 EntityManager
而不是编写 native SQL 那么这实际上是一个很好的建议。您需要使用 Criteria
构建查询抽象。如何做到这一点可能是一个单独的问题。
关于java - 如何检查Java日期类型的有效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55566506/