Java中PreparedStatement的解决方法setDate

时间:2019-06-05 12:15:00

标签: java type-conversion prepared-statement deprecated

我有一个带有PreparedStatement的方法

    public static boolean TSTHolidayPrepMapper(PreparedStatement st, TSTObject item, MapperType type) throws SQLException
{
    TSTHoliday hol = (TSTHoliday) item;
    int id = 1;
    if (type != MapperType.DELETE)
    {
        st.setString(id++, hol.getCountry());
        st.setString(id++, hol.getCommodity());
        st.setString(id++, hol.getMarketArea());
        st.setString(id++, hol.getMarketPlace());
        st.setString(id++, hol.getName());

        st.setDate(id++, hol.getCalenderDate());
    }
    if (type != MapperType.INSERT)
        st.setInt(id++, hol.getId());

    return true;
}

期望在st.setDate(id++, hol.getCalenderDate())上使用Date类型的对象,但是getCalenderDate()方法提供了一个我自己创建的名为TSTLocalDate的类的对象

public class TSTLocalDate extends TSTObject
{
public int year;
public int month;
public int day;

public TSTLocalDate()
{
    this.year = 1900;
    this.month = 1;
    this.day = 1;
}

public TSTLocalDate(int year, int month, int day)
{
    this.year = year;
    this.month = month;
    this.day = day;
}

public String toString()
{
    String val = "" + year + "-" + TSTStringFormatter.getIntWithLeadingZeros(month, 2) + "-" + TSTStringFormatter.getIntWithLeadingZeros(day, 2);

    return val;
}
}

我考虑过两种不同的解决方案

  1. 我尝试将TSTLocalDate calenderDate转换为Date calenderDate,但由于不推荐使用Date类方法,因此它似乎无法正常工作

    @SuppressWarnings({ "deprecation"})
    public Date tstlocaldateToDate(TSTLocalDate tstlocaldate) throws ParseException {       
    
    Date date = new Date(0);
    
    date.setYear(tstlocaldate.year);
    date.setMonth(tstlocaldate.month);
    date.setDate(tstlocaldate.day);
    
    Log.info(date.getYear());
    return date;
    }
    
  2. 我试图找到一种为PreparedStatement声明自己的数据类型的方法,以便可以将calenderDate作为TSTLocalDate对象传递给st.setTSTLocalDate(id++, hol.getCalenderDate());之类的PreparedStatement,但可惜的是我没有找到一种方法。< / li>

我希望使用第二种解决方案,但我也愿意接受其他解决方案。

1 个答案:

答案 0 :(得分:3)

  

...但由于不推荐使用Date类方法,因此似乎无法正常工作。

如果您查看JavaDoc的弃用消息,it tells you what to do

  

已弃用。

     

从JDK 1.1版开始,Calendar.set(Calendar.YEAR, year + 1900)替换。

(我强调第二段)

所以旧的方法是:

  • 使用getInstance或其重载之一获取Calendar
  • 使用Calendar的方法设置正确的日期。
  • 使用名称奇异的getTime获取该日期的Date实例。
  • 使用java.sql.Date构造函数,传入Date的{​​{1}}。
  • 与您的getTime()一起使用。

这就是说,对于现代JDK,您可能想要遍历java.time类(可能是LocalDate)来进行转换,因为它相当简单。然后,您将使用java.sql.Date.valueOf(LocalDate)

PreparedStatement